The Joy of Coding: Observable
software-artist.com
software-artist.com
Yes, in music, composers do work together although I wouldn't make a general rule about it. Writers tend to be solitary. They reach out to people when they're researching something for a story. But outlining, thinking through story lines, and the actual typing part are solitary. From interviews with writers, I get the impression that a good editor is indispensable for developing a story though.
Likewise, painters and sculptors in my acquaintance work alone.
Read this made me think of John Carmack and Michael Abrash, working on the Quake engine. Both are programming artists, but in different ways. When they came together, working on Quake, I'm sure we can all agree that the result was magic.
Not sure where I first read about their work on Quake, but The Graphics Programming Black Book[1] contains some details in the forewords from both. There's also more details in various sections.
I think there are similarly great teams in software that have multiple hits (Pike, Thompson, and Ritchie being one that comes to mind).
Is this its elegance? That it exposes general purpose programming and an exhaustive library list to the Muggles? So that people without a CS background can do Real Work?
I'm with you on gut reaction, though. Python always struck me as an open-source VBA.
Lack of ownership of responsibility is still quite a big roadblock for many companies.
Some of them had already produced detailed requirements documents but those documents never really represented the reality.
If you would like to receive a weekly puzzle from me - called the Monday Morning Tickler - all you gotta do is send a request to:
rj@mical.org (RJ Mical)Observable seems to be a cross between Jupiter notebooks and plain old javascript, but sufficienly different from either to feel uncannily bizarre. Those imports in the bottom of a notebook! And I am still not sure whether it has access to the whole node_modules ecosystem or not (since it has to run in the browser and doesn't seem to involve a transpiler). I remember looking at some notebooks that involved React and thinking to myself that they felt plain wrong.
The fact you can reorder cells in any way you want (and import cells from other notebooks) is the whole point — this way you can build narratives with code, embedding important bits in the story while leaving out fluff like imports at the bottom. Maybe you just haven't seen notebooks that take good advantage of this, but I'll shamelessly plug mine as an example: https://observablehq.com/@mourner/martin-real-time-rtin-terr...
You do have access to nearly the whole NPM ecosystem. Most useful packages either provide a browser build in their package (which gets picked up automatically), or you can use https://bundle.run/ to produce a browser bundle for any Node package.
It's based on reactive programming though. Cells observe the entities mentioned in them and update accordingly when they change, which is why you can have imports at the bottom, and you don't have to care about cell evaluation order as with Jupyter Notebooks.
More like a cross between literate programming and Excel, in a browser.
I urge you to give it a shot for a few weeks. It is significantly different from other programming environments, and what at first might feel “uncannily bizarre” pretty quickly starts to like a huge leap forward.
The idea behind Observable is that it observes changes to cells (wherever they occur in document order) and reflects those changes everywhere else in the dependency tree, similar to databinding techniques like used in MobX or classic Knockout. (One way to think about Observable is that every cell is a Knockout "computed property".)
[1] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
const cards = [...Array(13).keys()];
const standardDeck = Array(4).fill().reduce((acc, v) => {
return acc.concat(cards);
}, []);
const makeShuffledDeck = () => {
const deckInst = standardDeck.slice();
const shuffledDeck = [];
while (deckInst.length) {
const removeIdx = Math.floor(Math.random() * deckInst.length);
shuffledDeck.push(deckInst[removeIdx]);
deckInst.splice(removeIdx, 1);
}
return shuffledDeck;
};
const numDrawsNeeded = () => {
const counts = Array(13).fill(0);
const deck = makeShuffledDeck();
while (deck.length) {
const card = deck.pop()
if (++counts[card] === 4) {
return standardDeck.length - deck.length;
}
}
throw "Drew all cards, but never found 4 of a kind.";
};
// average
const numTrials = 10000;
console.log([...Array(numTrials)].map(numDrawsNeeded).reduce((acc, v) => {
return acc + v;
}, 0) / numTrials);
/*
// max
const numTrials = 10000;
console.log([...Array(numTrials)].map(numDrawsNeeded).reduce((acc, v) => {
return Math.max(acc, v);
}, 0));
*/"magic notebook" "thinking with code" "visionary software artist"
It's a javascript notebook by the way
He worked for Engelbart! Worked on ARPANet! Was sending email in 1975! And is still coding! What an inspiration. Very cool blog.
Engelbart, Xerox Parc, EA, Silicon Graphics, and Google Maps? Yeah, he can call out his own laws.
Here are few quotes from his blog posts I like:
This lovely showcase current times. :)
> The complexity of the systems involved has almost kept pace. In 1982 my entire development environment was 250 KB (three floppies). Today my Darworms project directory alone is about 100 MB or 400 time larger.
https://www.software-artist.com/software-artist-1982-vs-toda...
Here you can know why?:
> For fun but, alas, probably not for profit. I enjoy coding. I retired in 2017. I want to learn front-end development, JavaScript (ES6), modern frontend development practices, HTML 5 and canvas graphics.