Since joining the Recurse Center (RC), I’ve been posting about the process, my projects, and what I’m learning. See all the weekly installments or filter for posts with the Recurse tag.
Disclaimer: I re-watched Chef last night, so culinary metaphors are top-of-mind.
Now we’re cooking with gas
After three weeks of regular study and practice, I can now write small, actually-useful Rust programs!
Shellfish on the menu
This week:
- Read chapters 8–12 of the Rust book. It’s also been incredibly useful for connecting other ideas (like string handling and the quirks of unicode) and re-visiting lower-level concepts that don’t come up that much during most AI engineering — e.g. intricacies of stack vs heap allocation.
- Rustlings exercises 44–64 (enums, strings, modules, hashmaps, options, errors, generics, traits).
- Rustlings quizzes 2 and 3 (with no LSP or hints).
I implemented minigrep, a Rust grep clone, following Chapter 12 of Rust book. I went about it in a try-and-check fashion – reading the spec, implementing the code myself and getting it to work, then checking the reference solution in the book to improve on my attempt. That was a really helpful tutorial and gave me a lot of direction for how to structure and implement the MVP of mtop.
Working in the test kitchen
I also got some experience doing a TDD-style Rust project. It’s a very different style of working to the usual cowboy scripting that happens when doing exploratory work in Python or JavaScript.
I quite enjoy the procedure and rigour. It’s interesting to see how the language and tools encourage more upfront consideration and stringency, but how that can pay off with faster and more atomic iterations later.
This graphic from one of my favourite YouTube channels sums it up:
Many cooks
A lovely illustration of this cropped up when pair programming with Sharp on Liam’s rasteriser project. Liam “drove” and we “navigated” through implementing affine translations, fixing a resulting bug, and then implementing z-axis rotations. The strict typing, helpful compiler output, and Liam’s existing unit tests made for a radically different workflow to when I implemented a raytracer in JavaScript.
Instead of a frustrating experience of trying to validate everything manually and littering the code with console.log
statements, the core loop of compile, find error, recompile, test was rapid and confident and fun.
Clearly the laissez faire workflow of quick Python and JS scripting is irreplaceable in activities like data exploration and quick demos. But my experiences with Rust this week offer a clear example of another approach we can take when working on large, complex projects.
Getting grilled
Aside from this great pairing experience, I also did some more generous learning and facilitating this past week:
- Neural networks: zero to hero group: shared tips, ideas, intuitions with the group. Ended up giving an impromptu TED talk on the history of AI in response to some questions. People have mentioned that they find these useful and they keep asking me more questions. Should I give an AI talk at RC? On what topics precisely?
- Ad hoc hosted the Creative Coding meetup.
As an aside, I’m finding that a lot of my answers in the NN group follow the template of “yeah, it’s a bit of a dark art — some heuristics to work off, but all the variables interfere with each other, so it’s a lot of intuition-based guessing and trial-and-error.”
How much of this is an inherent challenge of the ML domain? How much is this just the way it feels to be on the far-right of the Dunning-Kruger curve 1 in any domain?
Universal Plums
I made github.com/gianlucatruda/universal-plums
Another Creative Coding special at the Recurse Center. This week’s prompt was:
I have eaten
the plums
that were in
the icebox
and which
you were probably
saving
for breakfast
Forgive me
they were delicious
so sweet
and so cold
— “This Is Just to Say,” William Carlos Williams (1934)
The vision: A resource-management click-game about plums with ridiculously over-the-top 3D graphics. So it’s like the fantastic Universal Paperclips, except not as good, they’re plums, you’re not a rogue AI, and your device gets hotter because of WebGL running.
The reality:
Let him cook
I finally started deeper research on my mtop
project. There are a few uninteresting challenges with reverse-engineering Apple APIs / ABIs and other tools to get all the information I might want. Fortunately, others have walked these paths before and I can learn from them and combine their approaches. Notes and progress here.
Upshot, I’m learning about ABIs vs APIs and how systems languages / OS software interface with one another.
I’ve also been reading and watching a lot of YouTube on various developer things — DevOps, history of Rails and current performance comparison to JS/Node stacks, Go, irl Rust, game dev, career progression, LLM developments. But it feels more like consolidation than procrastination.
I probably shouldn’t reference Dunning-Kruger so casually, as it seems like the whole phenomenon is just a statistical quirk. But most people seem to intuitively know that Dunning-Kruger refers to some kind of competency curve and we have intuitions for that, so it’s a useful meme to gesture at in explanations. ↩︎