Elements of Computing Systems Retrospective

Tom Stuart edited this page Aug 20, 2015 · 13 revisions
Clone this wiki locally

Just under 10 months since we started, this meeting marked the end of our adventures with Noam Nisan and Shimon Schocken's "Elements of Computing Systems (Building a Modern Computer from First Principles)". We celebrated by splitting the meeting into two parts:

  1. A show & tell for attendees to demonstrate code that they'd built along the way both inside and outside of the meetings;
  2. A retrospective on our experience with the book and the club in general.

Show & Tell

Chris began the show & tell by demonstrating his new hdl.js project:

As something he had been contemplating before joining the club, it was fascinating to see a live demo of his own hardware description language and see a visualisation of his graph-based approach unfold as he defined chips.

(Aside: the visualisations were produced by viz.js which renders .dot files as SVG in the browser.)

Kevin followed with a run-through of his Hack simulator written in Rust, wowing us (after waiting for Cargo to finish compiling things) with a working game of Pong. Tom highlighted how this Hack simulator had been invaluable while he was working on his VM test suites for earlier meetings.

Leo then demonstrated hack-js, a JavaScript implementation of the Hack platform. Like Kevin, he dazzled us with his Pong-playing skills but this time in the browser. We raised the possibility of using this to put a playable version of Pong.hack on our site; after all, Leo's optimisation efforts might make it easier on the CPU than our current cellular automaton header.

Leo also demonstrated a full end-to-end test of our software, from a high level program written in Jack to VM code to assembly to binary to running in the browser. In honour of the book's nickname—"NAND2Tetris"—he showed an elegant Tetromino, suspended in flight.

As a "One more thing...", Leo also showed us hack-x86, an implementation of the Hack platform written in C that compiles to ELF meaning that it could be used to boot an x86 system.

You mean you could put this on a floppy disk and use it play Pong in a high school during the '90s?

Flabbergasted, we watched as Leo demonstrated a poignant game of Pong in QEMU which, once finished, could only be attempted again by restarting the computer.

Adam then explained that attending the club had inspired him to write his own programming language: SwiftScript. Learning from CoffeeScript, he demonstrated lexing his language into Ruby data structures using a grammar written in Yacc.

Finally, Chris Lowis demonstrated a browser-based interpreter for Max Mathews' MUSIC programming language. Using Web Audio APIs, Chris was able to play a piece of music written in MUSIC that he had found printed in a manual from the '50s. We discussed the almost archaeological thrill of having no idea what the piece might sound like until the interpreter was complete.


The retrospective took the form of a timeline from the first meeting (4th November 2014) to the last (4th August 2015). We all wrote down memorable events along the way and placed them on the timeline with some indication of whether they were positive or negative. We then ran through everyone's events and picked out key themes to discuss in more detail:

  • The early meetings were praised for their amount of discussion and focus on understanding;
  • The focussed group sessions on test-driving the development of the book's exercises thanks to Tom's extracurricular work was discussed as a positive but...
  • There was clearly a point towards the middle of the timeline where our group work became more fractious and we concentrated only on completing the exercises at the expense of our shared understanding. Members who had dropped out raised the issue that, once lost, our relentless drive to finish the exercises at all costs made it difficult to ask questions;
  • Tom expressed some regret over his work on the tests. It was unclear to him whether they had ultimately had a positive (providing structure) or negative (suppressing discussion and understanding) influence on the group as a whole;
  • "What is the goal of the club?" There was no definitive answer but a discussion that, while our goal may shift (e.g. from learning something new to writing software together to just having fun), we should better interrogate ourselves after meetings. There was a feeling that some meetings in particular were frustrating and difficult but we never really discussed this in the group and attempted to correct it;
  • The amount of time (and therefore commitment) required for the book was raised as an obvious pain point: we weren't keen to repeat our odd 3 week frequency but also discussed choosing much smaller, self-contained projects (e.g. a paper) to encourage people to join the meetings;
  • The anarchic nature of the club (with no clear leader) might be improved slightly by using a tool like Harmonia to assign responsibility to members for meetings: e.g. ensuring we stay on track and asking for feedback at the end of every meeting;
  • It was noted that solely hosting the meetings at Geckoboard puts an unfair burden on Leo so we did discuss alternate venues which would be easier if the club's schedule was different;
  • We wondered about the lack of discussion on the mailing list and whether this was a problem. Tom said he'd set up a Slack channel for the group and we'd try this out to allow for more 'ephemeral' discussion.
  • All that said, there was a sense of achievement at having completed the book and—as demonstrated in the show & tell—having produced some amazing software. While we can definitely make changes for the better (and more frequently), we ended on a very positive note.


Random topics of discussion:


Thanks to Leo and Geckoboard for hosting and to Chris, Kevin, Leo, Adam and Chris for demonstrating their work and to Paul for facilitating the retrospective and writing up the meeting.