Message Passing Between Sealed Environments
A paludarium has a hard boundary between water and land—built from silicone-sealed glass or stacked stone. The aquatic section can’t read the terrestrial section’s humidity level directly. It can’t peek at soil moisture. The two zones are isolated, but they still affect each other: evaporation from water raises land-side humidity, condensation drips back down, heat transfers through the barrier.
Communicating Sequential Processes (CSP), formalized by Tony Hoare in 1978, treats computation the same way. Processes are sealed. They don’t share memory. They send messages through channels—explicit boundaries where data crosses from one isolated environment to another. If the water pump process needs to tell the misting process that evaporation is high, it sends a message. The misting process waits, receives, reacts.
class Channel {
constructor() { this.queue = []; this.waiting = []; }
send(msg) {
if (this.waiting.length) this.waiting.shift()(msg);
else this.queue.push(msg);
}
async receive() {
if (this.queue.length) return this.queue.shift();
return new Promise(resolve => this.waiting.push(resolve));
}
}
const boundary = new Channel();
setInterval(() => boundary.send({evap: Math.random()}), 1000);
(async () => {
while (true) {
const state = await boundary.receive();
if (state.evap > 0.7) console.log("misting land section");
}
})();
-module(paludarium).
-export([water_zone/1, land_zone/0]).
water_zone(LandPid) ->
Evaporation = rand:uniform(),
LandPid ! {water_state, Evaporation},
timer:sleep(1000),
water_zone(LandPid).
land_zone() ->
receive
{water_state, Evap} when Evap > 0.7 ->
io:format("misting land section~n"),
land_zone();
{water_state, _} ->
land_zone()
end.
No shared state. No race conditions. Each zone runs independently until a message crosses the boundary. The discipline is architectural: you design the channels first, then build processes that respect them—just like sealing the dam before you add water.