Lex Spoon
We live in a day of dreams, and I love using software to make them real. Tell me something you imagine, and we can dream a little together.
I love going to dances and hearing and making music. Come visit the Atlanta Contra Dance, the Trolley Barn Contra Dance, or Dance Out Atlanta.
I post articles on Blogger.
Portfolio
Scala
I coauthored Programming in Scala so that a broad audience can learn Scala. It starts with two chapters of “first steps” to get anyone going with commonly used tasks, and then it delves into deep dives of a number of topics, one chapter per topic. All of the code samples are regression tested before publication and are available online to download and try. You can read the first edition online for free.
I also assisted in Scala’s early days, being possibly the first user of the self-hosted “nsc” version that was compiled by itself. I remember the surprise from my teammates that I actually tried to use it, because I had just started and didn’t know it wasn’t supposed to work. In general, Martin Odersky runs the coolest research groups and is always taking his students and post-docs to lunch, sharing openly how he thinks about things, and never making you feel as stupid as—relatively speaking—most people will be when working with someone like that.
While on the team, I worked out the interactive REPL for Scala, solving many little practical problems so that people could interactively play with their code and not have to fuss with project files or run configurations. I wanted to bring to Scala users the experience of a Smalltalk environment, or for that matter, the DynaBook, where you play with your code in a creative and experimental way. I also built out compiler plugin support, with an eye toward supporting Gilad Bracha’s pluggable type systems.
Scala nowadays has macros and other techniques to replace a lot of the old usage of compiler plugins, but the REPL is going strong, with many new enhancements that it’s been a joy to see people adding.
Industry software development
I have a decade of experience at two FANG-like companies, Google and Block. I’ve mostly worked in an IC role, where I led a 20-team code migration, led over 30 on-call incident responses, and mastered and socialized many fundamental techniques for highly reliable software. The software I worked on processed 60k requests/second and was on critical paths such as login and payments processing. I also managed a little bit, growing a 10-person team to a 20-person combination of three teams. All in all, I’m familiar and comfortable in the strange land of corporate development at these kind of places.
I’ve also contributed at three start-ups. Two had successful exits (Semmle, LogicBlox-Predictix) , and one is self-sustaining with a non-investor funding model (Cognira).
See my LinkedIn page for more on all of this.
Custom languages
I design and develop custom programming languages. Most of this work is locked behind corporate firewalls, but you can see an example of my approach in Lexer Support in Bison.
What I do is start with an idea of what the developer will want to express and of what struggles they have. I’ll develop some free-handed examples of what a successful language might look like if everything goes perfectly. I then iterate on a design and test it conceptually from 10-20 different perspectives, followed by implementing a prototype and then a real version.
Progressive loading of JavaScript
Loading the JavaScript of a web application can add significant start-up delays and user-visible pauses. I developed a code splitter for the Google Web Toolkit. Developers would divide their program into 2-10 chunks of functionality, and the tool would use control-flow analysis to divide up the JavaScript into download fragments.
Client-side rules engine
I developed a client-side version of the LogicBlox database and rules engine. This allowed running business rules directly in the browser, without needing to call the server-based rules engine that most of the company software ran on.
Research on data flow analysis
I studied and researched data-flow analysis for my Ph.D., which then became a building block for many projects later in my career. I started by working out an experience for a Smalltalk programming environment, which is special in that you edit the program while it runs, but the data-flow ideas are usable more widely than that. The specific developments for my Ph.D. were around demand-driven analysis (only computing answers that you need right now) and subgoal pruning (speculatively trying large subgoals that may have to be abandoned).
Later in life, I developed a form of one-bit context sensitivity and presented it at Martin Odersky’s Festschrift (slides). One-bit sensitivity just lets you have one single boolean for each method you analyze, so you have to collapse down all of the paramaters of the method into a global yes or no context. It works really well for practical problems such as taint analysis, because even the 2x context sensitivity for each method is a large increase in accuracy in response for a modest blowup in compute time.
Developer tools for logic languages
For the GitHub Code Scanner, I developed a query help format and toolchain and converted over a thousand help files to use it. I also developed the test tool for queries, and also converted over a thousand test cases to use it. In both cases, I spent a fair amount of time studying the existing examples in the old system and then iterating on a better way to do them.
Scala support in GWT
I sponsored an internship for Grzegorz Kossakowski to lead the development of Scala support in the Google Web Toolkit. By the end of it, three other people had joined in to help out.
Nowadays, unless you need GWT specifically, I would say that it’s better to follow the path of ScalaJS. Instead of integrating with GWT, learn the techniques from GWT and then implement them in your own tool. I later followed this approach when developing a web-based rules engine at LogicBlox.
Interface evolution
Software components connect to each other through an interface and then co-evolve over time. I’ve researched some of the theory and practice of interface evolution.
Student projects
As a student, I worked on the a media-friendly wiki and on Steiner tree extraction.
Academic Publications
Before working as an industry developer, I researched for over a decade in various universities and research labs, leading to a few published research papers.
I enjoyed that environment and learned perspectives that are nearly impossible to access otherwise. Thank you to all my old research mentors, including Alan Kay, Dan Ingalls, Martin Odersky, Vijay Saraswat, Olin Shivers, Mark S. Miller, Scott Wallace, Ted Kaehler, Ole Agesen, John Maloney, and really way too many others to list.
Other things
Some older blog pages are here and here. A few notes about running Linux are here.