I have been loving working my way through the backlog of the Software Unscripted podcast! Can't believe I didn't know of it sooner. Thought it'd be fun to have a thread in here to chat about it if there isn't one already.
@Richard Feldman thanks for hosting this, have really enjoyed it.
Most recently listened to the episode with José Valim. Massive respect to him, I feel like he's been such an excellent steward of that language and community. Excited to see what they can do with static types.
thanks! I just recorded a follow-up episode with Jose, hopefully will be out in a month or so
Can't wait. Huge fan of the podcast as well. Have you thought about inviting anyone in from the Koka team? So maybe https://www.microsoft.com/en-us/research/people/daan/ or https://webspace.science.uu.nl/~swier004/?
I don't know any of them, but I'm totally open to it...I wonder if anyone knows them and could make an intro?
Just listened to the episode with Jean Yang. It feels like all of the folks I've been following in software for the past few years end up on your guest list, Richard! Stellar guest line up! :big_smile:
You guys shared some really challenging thoughts about how we want to create these "worlds" of software without chaos or disorder and maybe the right move is moving to the "era of nuance", trying to make things better where we can. Like 2nd law of thermodynamics. We can't escape entropy or Murphy's Law.
Richard shared a thought about feeling like your role is to try to bring ideas from academia into industry and practical use. That resonates with me so much and is something that really draws me to Roc. Wanting to make something that's not just a marginally better programming language but something that at least attempts to make some significant steps forward and push the industry forward.
Great stuff! Please keep up the podcast!
Richard Feldman said:
I don't know any of them, but I'm totally open to it...I wonder if anyone knows them and could make an intro?
I reached out to see if there's any interest. I don't know them but worth a try!
I just listened to the most recent episode with Troels Henriksen. What a great interview. He’s clearly brilliant, fun to hear him derive in real time the implications of Richard’s statements! :big_smile:
I wanted to hear more from him so I also listened to his episode on the array cast https://spotify.link/bVN8qHe2UDb
Casey Muratori not knowing about ORMs made my day. Must be nice :smiling_face_with_tear:
His reaction was so amazing lol
Related to the latest podcast:
So for mojo, I would say that the language essentially is c++ in python clothing. The python is jit compiled instead of interpreted. You can add a lot of extra typing to the python to make it static, templated, etc. Compared to C++ I would say the templating is a lot cleaner. They also have much nicer support for simd and things of that nature to make code faster.
Lastly, mojo has the magic of MLIR. With that I mean, it is easy to extend the language with mlir primitives and then use those primitives. As a direct example, Tensorflow has an mlir dilect that can compile to gpu. You could use that directly in mojo to build a graph and then run it through tensorflow on the gpu. This gives a huge level of extra potential power and flexibility to the language.
Agus Zubiaga said:
Casey Muratori not knowing about ORMs made my day. Must be nice :smiling_face_with_tear:
I also feel very vindicated after having struggled with CSS so much at work. “Nobody knows how to center things!” :laughing:
Johan Lövgren said:
Agus Zubiaga said:
Casey Muratori not knowing about ORMs made my day. Must be nice :smiling_face_with_tear:
I also feel very vindicated after having struggled with CSS so much at work. “Nobody knows how to center things!” :laughing:
I feel this on a deep level. I work in react native and even when you get the right flex styles on everything sometimes you just run into a Yoga bug that has been around for 5 years so you need to so some insane workaround that makes no sense.
Disappointed at my ranking, but it mostly tracks F115DFE2-2B12-4574-853C-8EB59AEFFF6B.jpg
I’ll just have to listen more from now :sweat_smile:
Sweet, I didn't know this was on Spotify, I've listened to a couple of podcasts before after hearing about it on this forum but always just downloaded the file from the website.
It's also in the Apple Podcasts catalogue which means you can listen to it in apps like Overcast (which is my favorite podcast player).
and google podcast for us android users that don't use spotify.
AntennaPod is also very good on android and open source too :)
AntennaPod also had a yearly summary, all generated on device with no telemetry!
Software Unscripted was number 5 for me this year, but that's because I listened to the whole back catalogue, probably won't be so high next year unless Richard releases another 100 or so episodes in 2024 :laughing:
1146b010-45a3-4fb8-864e-ad6c78daf54e.png
Love that José has come back for three episodes now. I learned about Roc through him promoting the first elixir static typing episode. What a guy.
I guess this is the topic for Software Unscripted discussions? I just listened to the Roc reverse interview, and am part-way through the Go one, and I have so many comments. I'm a — I guess somewhat expert? — Go programmer, working at Square, with a pretty huge Go monorepo.
I'm curious what your thoughts are! :smiley:
re: Go package management over-indexing on performance. It's actually trying to avoid falling into 3-SAT, which is very easy to do. Most package managers essentially have a custom solver for the 3-SAT equivalent problem. Go's packaging design is carefully avoiding that.
re: tabs vs spaces for indent and copy/pasting code: in Go, since it's not whitespace-sensitive, you can just past and reformat. IIUC, Roc indentation can indicate scope (or is it usually just laid out to look like that?). So, especially for the copy/paste situation, you might need to decide on your own solution based on first principles.
In a large monorepo, you get a lot of vendored code. du -h
in our monorepo's vendor
folder gives me a terrifying 740M!
That does bring the usual problems of "I want to upgrade package X, but now I have to worry about matching versions of gRPC, protobufs, the GCP libraries, etc." It's not as bad as in Java, but with an undisciplined use of third-party code, it definitely becomes something to think about.
The rest of the monorepo is less than twice that size, if I exclude the protobufs
Our go.mod
has 5 replace
directives, three related to protobufs (Square was very early with protobufs, and made a bunch of custom changes, which I have not yet in 8 years here managed to expunge.) All 5 are to Square-specific forks of a corresponding open-source package.
Although they get less mention, in my personal, non-work Go, I find "workspaces" (go work …
) essential: it lets you define a workspace below a set of directories, and then specify which of those directories to use instead of the real, remote version.
In my "blog" workspace, for my personal blog, I have checkouts of goldmark
, goldmark-pikchr
, and hugo
, since I had to do some custom stuff to make Hugo support pikchr diagrams (unfortunately currently broken, and never got enough "tuits" as the Perl folks used to say.)
blog🐚 ~/gh/blog ls
bin go.work go.work.sum goldmark goldmark-pikchr hugo zellyn.com
blog🐚 ~/gh/blog cat go.work
go 1.20
use (
./goldmark
./goldmark-pikchr
./hugo
)
(Off-topic, that ":shell:" is because I'm using hermit, which is great. I've started using it in all my personal repos, since it dramatically improves the "coming back to this thing in 3 years and how do I even get things compiling again?" experience. I should write a roc package for hermit.)
One last comment on versioning. Go is very committed to the idea that v2 is a completely different package, with a different name. This does _not_ work well for projects that want to create versions every three months (I thought k8s was like that, but its github says it's on v1.26.12, so :shrug:), nor projects that want to number releases based on year/month or similar things.
There are also some kind of subtleties around import paths and version tags and github repos that I really should just go read an internalize once and for all, because they get annoying to constantly not quite understand.
go.mod
also allows v0 "pseudo-version numbers", which look like v0.0.0-20170915032832-14c0d48ead0c
— they encode the shasum and the… datetime, it looks like?
fwiw, the complaining about Go package management that I've seen mostly stems from how the team handled communication with the community: some folks had invested a huge amount of effort into independently developing a traditional solver-based solution, and Russ's more dramatic re-think, while very much in Go's style, kinda came out of nowhere. Opinions and hurt feelings abound, or abounded — it's receding into the past now.
“Functional Programming in Go” thoughts…
One of the reasons it's harder to teach recursion than for loops, even when they compile down to the same CPU steps, is that that shape of tail-call recursion that emulates a loop is a slightly degenerate case of recursion: it's recursion, used to loop. But it's taking a much more powerful machine (recursion) and using an instance of it to do something simple (repeat these steps). Recursion can also do things that go down multiple paths, like graph search or tree traversal, or even fibonacci numbers.
Of course another reason is that recursion just seems to be hard for people to understand, in the same way that people find proof by induction a bit mind-bending. Repeating steps is something you do every day in normal life.
re: hot-code reloading. I love the idea that since all state is in the platform, you can easily swap out roc code! Definitely a win for functional programming. Go does have plugins (link), so it should be possible to segregate, say, handler functionality, out into a plugin, and hot-reload that. Indeed, it appears someone has built a thing that does that: https://github.com/edwingeng/hotswap
re: goroutines and grow-on-demand stacks. IIRC (and it's been a while), the fact that Go has weird stacks and non-standard calling conventions means that it's not that hard to host c libraries in Go — I think the cffi code makes sure the stack is "big enough" and then does a little translation of calling conventions around the handoff — but (unless things have changed) means that it's difficult to host Go code inside of something with C calling conventions and stacks, etc. Even when Google was considering building a giant sidecar-like thing, or inside-out sidecar-like thing ("envelope"), I believe for Go, the plan was to have Go own main
, then hand off to the envelope code and then have it call back into Go. (Although it's been a while… my memory is fuzzy.)
One question I'd be interested in your thoughts on, @Richard Feldman … y'all were talking about Functional Programming quite a bit, and Lane mentioned teaching Functional Programming in Python. Indeed, that was more or less how I learned Functional Programming, a very long time ago at Georgia Tech: the first few weeks of Lisp were limited to purely functional constructs (old-school lisp cons lists lend themselves to that anyway), and then as the quarter went on we settled on a "you can be destructive inside a function, but you should still make it look purely functional to the outside world". That seemed to be what Lane was using "Functional Programming" to mean. As a mostly observer, who has never used a purely functional programming language "in anger", that although that sort of completely technically defines what Functional Programming means, it's really only one half of the story.
The other part seems to be a mix of very powerful higher-level tools for thought and programming: (a) sometimes I'll see Haskell folks talking about Functors and Lifting and Monads, and it seems very powerful: like they're reasoning at one level higher in abstraction than normal imperative programming would lead you to, like they've applied some kind of "Lift" operator on their abstractions (b) there's a sort of inside-out turning about that seems to happen in functional programming. The I/O or Task paradigms seem to do this. Although Roc code goes to some lengths to make Task-based code look sequential, under the covers, it's callbacks all the way down, and it's a slightly mind-bending blend of "my response to this input is a set of instructions to run that'll depend on the next input" kind of thing. It _may_ be analagous to the explicit inside-outing that seems to happen in finger trees and similar immutable data structures. All I know is that I look at monad code in Haskell, or Task code in Roc (a bit, although it really does look like imperative code :smile:), or, say, JSON-parsing code in Elm (or really any parsing code in any of them), and I feel like there's a level of familiarity/comfort with some kind of inside-outing going on that I just don't quite grok.
I find the first paragraph above to be easy to get, as a fairly skilled (imperative) programmer. I've mostly bounced off the second one.
As an example, in the episode y'all did about gradually rewriting your backend Ruby code into Haskell, you mentioned a re-architecting that put the database queries at the start, and then the logic, and finally resulted in a set of mutations to apply. That feels very analagous to the overall way I/O or Tasks work in functional programming languages, and seems like something only a Haskell programmer would have come up with. (It also sounded like a very powerful and lovely abstraction/pattern, and I would gladly listen to like five podcasts in a row if they went deep into the concept until I could grok it enough to apply it elsewhere!)
Wow. Hearing “Combo boxes” brought me back to hacking afternoons after a middle school day
Screenshot-2024-01-23-at-13.30.16.png
Bug Report: Typo in the Spotify description of the last episode
Should be "no squeal databsaes" :sweat_smile:
If you found today's episode a bit hard to follow, here is the paper and a talk https://dl.acm.org/doi/10.1145/3591260 https://www.youtube.com/live/F3z39M0gdJU?feature=shared&t=3545
@Richard Feldman Maybe you can add them to the show notes? Hmmm I guess not, there are multiple references to the show notes from several podcast platforms. Mutating them would break referential integrity.
In that talk, Roc was mentioned, btw
thanks, good idea!
@Chris Wesseling is this an area of interest to you?
It's a very cool subject. I just added HM type inference to the most ugly Lisp known to the internet (JsonLogic). Worked through the papers, and implemented in Python and Typescript.
oh nice! The defunctionalization papers?
And actually listening to your podcast has helped me solve a problem.
that's awesome! What was the problem?
Supporting variadic functions. JsonLogic has some operations that can have different arity. So I solved it in the parser by monomorphisation.
very cool!
I add versions of the functions to the context when I encounter them
But getting nice error messages is hard.
Mine were more like Purescript, when I really want Elm errors :sweat_smile:
@Richard Feldman, big fan of your podcast here. A friend and me think, that John A De Goes (@jdegoes on X.com), the head behind ZIO (great and innovative effect system for Scala, with big focus on Dev Experience) and Golem.cloud (invincible cloud platform around WASM, written in Rust) and You would be an perfect much for a podcast episode, what do You think?
Here a great episode with him:
https://podcasters.spotify.com/pod/show/happypathprogramming/episodes/85-Scala--Rust--and-Durable-Computing-with-John-De-Goes-e29ca1s/a-a66th96
thanks, I'll give it a listen!
where's the issue for lambda set defunctionalization? and can you also send a link to your O-Camel implementation of it?
great question! I don't think we have a GitHub issue for it (unless @Ayaz Hafiz knows of one?) but here's his OCaml implementation: https://github.com/ayazhafiz/cor
This is the meta-issue https://github.com/roc-lang/roc/issues/5969
I really enjoyed yesterday’s episode with Greg Wilson. I resonated a lot with the industrial design analogy.
It’s super cool that he wants to do a book with Roc and I would love to participate! :big_smile:
Yeah, it was a very intriguing talk
Lots to think about in terms of design and verification of design
I really enjoyed that episode. Would love to contribute a chapter, or at least the start of a thing.
I had not heard of Greg Wilson until earlier this month when I listened to the latest CoRecursive episode in which he told his story. I recommend that one as well to anyone who liked the Software Unscripted episode, he talks about some similar topics.
Are there show notes for the Software Unscripted podcast? If so, where can I find them?
there aren't any :big_smile:
is there something in particular you're looking for?
Some books were mentioned and a website, but I could re-listen and make notes.
The World's First Evidence Oriented Programming Language
https://quorumlanguage.com/
@ 19:38
Industrial design
How do the experts solve difficult problems in software development? In this unique and insightful book, leading computer scientists offer case studies that reveal how they found unusual, carefully designed solutions to high-profile projects. You will be able to look over the shoulder of major coding and design experts to see problems through their eyes.
https://www.amazon.com/Beautiful-Code-Leading-Programmers-Practice/dp/0596510047
@ 29:30
Every useful programming language has a certain amount of grit, you can sweep it in the corners, but you cannot get it out of the room.
By https://en.wikipedia.org/wiki/Robin_Milner (no source)
https://en.wikipedia.org/wiki/The_law_of_conservation_of_misery
Architects look at thousands of buildings during their training, and study critiques of those buildings written by masters. In contrast, most software developers only ever get to know a handful of large programs well—usually programs they wrote themselves—and never study the great programs of history. As a result, they repeat one another's mistakes rather than building on one another's successes.
https://aosabook.org/en/index.html
Current design can only be explained by "challenge and response" of the past.
https://en.wikipedia.org/wiki/Arnold_J._Toynbee#Challenge_and_response
The best way to learn design in any field is to study examples, and the most approachable examples are ones that readers are already familiar with. These lessons therefore build small versions of tools that programmers use every day to show how experienced software designers think.
https://third-bit.com/sdxpy/
@ 46:48
Take apart applications, look at how there designed to give you a vocabulary for larger scale design.
@ 52:07
Learn from experts arguing the specifics.
@ 55:44
We need to get better in reading code and understanding what design is embodied in it. And how the code is manufactured.
These are really helpful notes, thank you for sharing.
@Richard Feldman would it be possible to create a Software Unscripted "stream" (I think that's the right name in Zulip) so that each episode could get its own conversation?
Oh, the "converations" are called "Topics" apparently :smile:
I'm ok with it, but I'm curious what others think
I'm good with trying it, if it gets so active that it's distracting we could find a new home for it.
This topic was moved here from #off-topic > Software Unscripted by Richard Feldman.
discovered the pod through Roc and been really enjoying it. great combinations of good guests, good vibes, and good questions
thanks, so glad you're enjoying it! :smiley:
been working through the back catalog of episdoes and I too recall keybase. recently I have been exploring the Codeberg organization and found this interesting project : https://keyoxide.org/
Richard Feldman said:
thanks, so glad you're enjoying it! :smiley:
just listened this morning to your episode about vim etc. have you tried neovim? with neovim's tree-sitter integration you can have the structural movements etc. you were talking about wanting
the last time neovim was my main editor, it didn't ship with tree-sitter integration - but I've recently been using Zed as my main Rust editor and it has tree-sitter built in! I'm really enjoying it :smiley:
Been binging the podcast while driving to/from work, amazing conversations and guests. I've become more aware about a lot of topics I never knew about and definitely my favorite software/programming podcast. Also the intro/outro music is awesome.
Would love to see a convo with ginger bill, since I've heard the issues with providing array programming built-in to not support general operator overloading mentioned and Odin has it. I remember hearing about how to use Arena's for something specific in a text editor, he'd probably be able to answer that too since Odin's virtual.Arena
is common. Odin has a very pragmatic design philosophy, reminds me of Go. Also could mention using your own language at work. I believe (might be wrong) he said his team has a 700k+ LOC Odin codebase integrated with 500k+ LOC of other languages. I think there is a lot of interesting conversation there.
Last updated: Jul 06 2025 at 12:14 UTC