究極の immutable を追え

公開日: 2025/08/22

そういうお話です。

🎵 本日の一曲

ねこすい

イミュータブルとは?

不変を意味する。

rust の例

rust の変数は、mutをつけないと変更できない。 変更されているように見えるのはシャドーイングされてるだけ

fn main() {
    let x = 3;
    let x = 4; // シャドーイング
    let mut x = 3;
    x = 4; // ミュータブル
}

kotlin の例

valをつけると immutable になる。 varにするとミュータブルになる。 シャドーイングは推奨されてない。

OS での例

ハーベスターという仮想化基盤では、ベアメタル上の OS がイミュータブルとなってる。
言い換えると、再起動すると中身がリセットされる。

代わりに、Kubernetes の設定を etcd に、一部の設定ファイルのみを可変とすることで、必要最低限の可変が許容されてる
言い換えると、変更できるところだけ残るようになってる。

ルーター機なども rom と ram、nvram、フラッシュメモリと必要に応じてメモリを使い分けている。

メリットはランサムウェアへの耐性が強くなること
不変の世界じゃ、暗号化する(変更する)、消すという作業もできないからね。

イミュータブルが必要な理由

他の人と情報を共有する時は、イミュータブルにしたほうがいい。
情報が広まれば広まるほど、変更が効かなくなるから。

プログラミングで必要な理由

関数の前提として、入力が何らかに処理にかけられ、出力されるである。
一方通行である。 まさか入力で入れた変数が結果として入力から帰ってくるとは思いたくない。

fn add_5(num: &mut i32) {
    *num += 5;
}

fn main() {
    let mut x = 0;
    add_5(&mut x);
    println!("{}", x);
}

できてしまう。 変数 x を関数に入力させ、 println で x の中身を出力させれば、見事に値が変わってる。 rust ではmut のおかげで値が変わることを目に見えてわかる。

x = { num: 0 };
add_5(x);

console.log(x);

出力はどうなるだろう? 0 を期待したいが、結果は 5 となる。

add_5関数の内容
function add_5(num_obj) {
  num_obj.num = num_obj.num + 5;
}

javascript ではオブジェクトの場合参照渡しを行うため、このようなことが実現できてしまう。

javascriptの例というより、mut がない場合をみて欲しかった。
関数に入れた変数が、そのまま出力として内容が書き換えられていたという事例である。

変更は少ない方が信用される

例えば、カラオケの予定を決めたとする。 直前になってキャンセルされたら普通キレる。
一週間前なら諦める。

変更をかけるというのは他の人への影響を考えなければならない
変更は少ない方が、めんどさが減る

変更は少ない方が信頼される、と思う。

SSD にやさしい

一般的に ssd は書き込みに寿命があると言われる。
一方ランダムアクセスは強い。

変更は差分のみの記録とすれば、書き込みを少なくすることができる。
そして、ランサムウェアへの耐性が高くなる

note

暗号化するという差分のみを記録するので、元データは残るため

note

HDD のようにランダムアクセスに弱いと、ディスク中に散らばる差分データを組み合わせるだけで時間がかかる

まとめ

immutable によってシステムの耐性を強化しよう。
...ところでこの記事いる?