はじめに
フロントエンドを触っているときに「これ、制御系のプログラムと同じ感覚!」と思うことがありました。
イベントループはスレッドプログラミングのよう。
Vue.js のリアクティブ変数をいじっているときには C++ の演算子オーバーロードを思い出したり。
そこでふと思ったことが、
JavaScript / TypeScript をやっている人は、Rust や C++ に向いているのでは?
逆に、制御系をやっている人はフロントエンドもできるのでは?
AIにこの考えを投げかけてみた
AI としては「半分は同意できるけど、全面的には賛成できない」という反応でした。
ということで、以下、自分なりに整理してみました。
フロントエンド ⇔ 制御系のプログラムには似ている要素が多い!
・型の厳密さ(TypeScript と Rust、C++)
・状態管理の経験(React/Vue.js のリアクティブ変数や状態管理ライブラリと制御系の状態遷移)
・非同期処理の経験(イベントループ、Promise、スレッド)
しかし、ギャップはある!
やはり、プログラミング自体は対応できても、周辺知識や観点が異なりますね。
Web系 ⇒ 制御系の場合の注意点
制御系のライブラリの習熟が必要です。
といっても、フロントエンドの人には習熟するポテンシャルがあるので、大丈夫。
制御系で一番異なるのは、いろいろな機材があるので、それぞれ特性を理解する必要があります。
僕が経験しただけでも、ゲーム機本体、プリンタ、テレビ、ビデオデッキなど。
機材についてはドメイン知識の範疇とも言えますが、一般的に様々な制約がある。
たいてい、メモリのサイズや CPU 性能は固定で、そうそう増強することはできないです。
スケールアウト(サーバー台数を増やす)みたいな対応もできません。
このような制限を前提に設計をします。
デバッグは不便なことが多い。
ブラウザの開発者ツールのような至れり尽くせりの環境はありません。
メモリリークやばし!
制御系 ⇒ Web系の場合の注意点
まず、CSSやライブラリの学習、サーバー管理の習熟が必要。
これは制御系の人にはポテンシャルがあるのでやればできるはず。
しかし、制御系で非同期処理の経験があったとして「非決定的な環境への慣れ」は必要そうです。
Webは「ユーザーがいつ何をクリックするか分からない」「ネットワーク遅延で応答順序が入れ替わる」といった非決定性が常態です。
あと「セキュリティ」の視点が必要。
これは怖いですね。
その他に、マルチスレッドを経験していると、かえってJavaScriptのシングルスレッドやイベントループは独特だと思うかもしれません。
おわりに
「できる」は少し言いすぎみたい、それでもフロントエンドの人、制御系の人には「共通の基礎体力はある」と感じています。
興味がある人は越境してみてはいかが?
※なお、注意点を多めに記述していますが、これは筆者が記事に対して少しでも公平さを担保したい気持ちがあるからです。
ギャップを乗り越えるのは少し大変かもしれませんが、不必要に恐れる必要はないと思います。
