- 左から右へプログラミングする方法では、コードを入力した瞬間からプログラムが有効な状態を保つため、エディタの自動補完などのツール支援を最大化できる
- Pythonのリスト内包表記は、宣言されていない変数と型推論の欠如により、自動補完機能を妨げる
- RustやJavaScriptは、プログラムを左から右へ自然に構成できるため、変数の利用やメソッド探索がより直感的になる
- CとPythonの関数型スタイルは、関数名や構造の発見しにくさによって、効率的なコーディング体験を損なう
- 複雑度の高いロジックでは、左から右へ展開されるコードのほうが読みやすく、保守性や拡張性に優れている
左から右へプログラミングする
コードは入力した瞬間から有効でなければならない
Pythonのリスト内包表記の限界
- Pythonのリスト内包表記構文
words_on_lines = [line.split() for line in text.splitlines()] は、宣言されていない変数(line)にアクセスする必要があるため、エディタが自動補完や型推論を十分に提供できないという問題がある
- コードを部分的に入力する過程では
words_on_lines = [line.sp のように入力すると、エディタは line の型を知らないため、メソッドを提案できない
- 変数名のタイプミス(
lime など)のような潜在的なエラーも検出しにくくなる
- 適切な提案を受けるには未完成のコードを書かなければならず、その過程が直感的でなく不便になる
Rustにおける左から右の構成
- Rustの例(
let words_on_lines = text.lines().map(|line| line.split_whitespace());)では
- 無名関数の宣言とともに変数(
line)が最初に登場した瞬間に宣言と見なされるため、すぐに自動補完とメソッド提案が可能になる
- 実際に
split_whitespace というメソッドも自動提案のおかげで簡単に見つけられた
- この方法では、プログラムが常に部分的にでも有効な状態を保つため、IDEやエディタがリアルタイムでコーディングを支援できる
段階的開示(Progressive Disclosure)とAPIの使いやすさ
- 段階的開示(Progressive Disclosure) は、利用者が必要な分だけ複雑さを体験する設計原則であり、プログラミングにも適用できる
- 例: 画像を追加するときだけ関連オプションが現れるワードプロセッサのUXに似ている
- C言語ではこのような支援が不足している
FILE *file に関連するすべての関数が file. から探索できるわけではないため、関数名のパターン(fread, fclose など)を覚えなければならず、機能を発見しにくい
- 一方で理想的な言語なら、
file. を通じたメソッド提案によって関連機能を簡単に段階的に発見できる
関数とメソッドの発見しやすさの違い
- Pythonの
map(len, text.split()) とJavaScriptの text.split(" ").map(word => word.length) の例を比較すると
- Pythonでは
len、length、size など関数名が予想しづらく、何度か試して初めて実際の動作が分かる
- JavaScriptでは
word. の後に .l だけ入力しても、エディタが length などのメソッドを提示するため、発見しやすさが高い
map のような高階関数でも、実際の戻り値とデータ型が即座に明確になる
複雑なロジックほど構造的に書く利点
- 複雑度の高いロジック(
filter、lambda が入れ子になった長いPythonコード)では
- コードの始まりと終わりを繰り返し確認する必要があり、条件式や括弧の対応などで可読性の低下と理解の難しさが生じる
- 同じロジックのJavaScript版では、コードを上から下へ、左から右へ順番に読んで理解できる
核心原則
コードは入力する瞬間ごとに有効でなければならない
text 単独の入力でもプログラムは有効な状態を保つ
text.split(" ") まで書いても、その後 .map(word => word.length) まで続けて入力するときも、全体として常に中間状態が有効である
- このようなコーディングパターンは、エディタのリアルタイム支援の可能性を高め、REPL環境では即座に結果を確認することもできる
結論
- APIと言語設計は、コードを左から右へ自然に入力しながら、中間段階ごとに有効なプログラムを作れるよう支援すべきである
- 良いAPI設計こそが、このようなコーディング体験の改善の鍵である
まだコメントはありません。