どうやったらコードを深く理解できるのか?
理解するのにコツや方法はあるのか?効率よく理解する方法はないのか?
このような疑問や、下記が当てはまる方は読む価値があるかもしれません。その答えです。
- コードの理解レベルが低い
- コードを深く理解できるのは一部の優れたエンジニアだけだと思っている
- よくわからないけど動いてるから、まぁいいか
- たいていコピペだ
- 理解したいけど、そんな時間ない
今回は、「Roles of Variables in Experts’ Programming Knowledge」という論文を紹介したいと思います。
コード理解の核となる変数を、10個の役割と関連付けることで理解に繋がるという内容です。
また記憶術を使って変数の役割を、一瞬で記憶していただくところまで案内します。
今回紹介する論文
Roles of Variables in Experts’ Programming Knowledge(変数の役割)
- Jorma Sajaniemi: ヨルマ・サジャニェミ(ヨエンスー大学 コンピュータサイエンス学部)
- Raquel Navarro Prieto: ラケル・ナバロ・プリエト(ポンペウ・ファブラ大学)
論文の概要
いろんなプログラミング言語の変数を研究したけど、変数は10個に分類できるよ。
プログラムにおける変数の99%を理解するのに、必要なのは10個の役割だけだよ。
10個の役割を教えた生徒と、教えなかった生徒ではプログラムの理解に差があったよ。
変数の役割
番号 | 役割 | 簡単な説明 |
---|---|---|
1 | Fixed value | 計算を行わず、その後変更されない変数。 |
2 | Stepper | システム的で予測可能な連続した値を進行する変数。 |
3 | Follower | 新しい値を常に他の変数の古い値から取得する変数。 |
4 | Most-recent holder | 連続した値を通過する際に最新の値を保持する変数、または単に最新の入力値を保持する変数。 |
5 | Most-wanted holder | 最良または最適な値を保持する変数。 |
6 | Gatherer | 個々の値の効果を累積する変数。 |
7 | Transformation | 常に他の変数の値から同じ計算を使用して新しい値を取得する変数。 |
8 | One-way flag | 値が変更されたら初期値を取得できない2つの値を持つ変数。 |
9 | Temporary | 非常に短い時間だけ値を保持する変数。 |
10 | Organizer | 要素を再配置するために使用される配列。 |
JavaScriptでの例
1:Fixed value (固定値)
const fixedValue = 42; // 固定の値
2:Stepper (ステッパー)
let stepperValue = 0;
function step() {
stepperValue += 1;
console.log(stepperValue);
}
// 例として5回呼び出す
for (let i = 0; i < 5; i++) {
step();
}
3:Follower (フォロワー)
let oldVariable = 5;
let followerVariable = oldVariable; // 古い変数の値をフォロー
// oldVariableの値が変更された場合、followerVariableも変更されます
oldVariable = 10;
console.log(followerVariable); // 結果は10
4:Most-recent holder (最新値保持者)
let mostRecentValue;
function updateValue(newValue) {
mostRecentValue = newValue;
}
updateValue(42);
console.log(mostRecentValue); // 結果は42
5:Most-wanted holder (最良値保持者)
let mostWantedValue;
function setMostWantedValue(value) {
if (value > mostWantedValue || mostWantedValue === undefined) {
mostWantedValue = value;
}
}
setMostWantedValue(30);
setMostWantedValue(50);
setMostWantedValue(20);
console.log(mostWantedValue); // 結果は50
6:Gatherer (ギャザラー)
let total = 0;
function addToTotal(value) {
total += value;
}
addToTotal(5);
addToTotal(10);
addToTotal(20);
console.log(total); // 結果は35
7:Transformation (変換)
let inputVariable = 5;
function transformValue(value) {
return value * 2;
}
let transformedValue = transformValue(inputVariable);
console.log(transformedValue); // 結果は10
8:One-way flag (片道フラグ)
let flag = false;
let initialValue = 42;
function updateFlag() {
if (!flag) {
flag = true;
}
}
updateFlag();
console.log(flag); // 結果はtrue
console.log(initialValue); // 結果は42
9:Temporary (一時的な変数 tempやt)
function performOperation() {
let temporaryValue = 100;
// temporaryValueを使用した操作
console.log(temporaryValue);
}
performOperation(); // 一時的な変数は関数内でのみアクセス可能
// console.log(temporaryValue); // エラー:temporaryValueは関数外からはアクセスできない
10 :Organizer (オーガナイザー):
const organizerArray = [1, 2, 3, 4, 5];
// 配列の要素を再配置
organizerArray.sort((a, b) => b - a);
console.log(organizerArray); // 結果は[5, 4, 3, 2, 1]
記憶術で一発で覚える
さて、ざっと紹介しましたがどうでしょうか?
覚えられないですよね。
何事にもコツがあるので、記憶術を使って楽に記憶してしまいましょう。
記憶術についてはこちらの本を参考にしました。興味ある方はどうぞ。
記憶術にはジャーニー法、数字形システム、ドミニク・システム、複合イメージ法といろいろありますが、今回はジャーニー法を使って記憶します。
ジャーニー法とは?
実在する道に、目印となるポイントを用意します。そのポイントに記憶したい「物」を置きます。
頭の中でその道をたどりながら、各ポイントに置いた「物」を想像するだけで記憶できます。
順番が決まっているものも楽に記憶できます。
例)
覚えたいもの:ハンカチ、マッチ棒、メガネ、時計、
番号 | ポイント | 記憶したいもの | イメージ |
---|---|---|---|
1 | 玄関 | ハンカチ | 自宅前に白いハンカチが落ちている。レース付きだから女性のだな。 |
2 | 隣の家 | マッチ棒 | 隣の家の子供がマッチ棒で遊んでいる。火事にならなければいいが。。。 |
3 | バス停 | メガネ | バス停に人が並んでいる。全員メガネをかけている。 |
4 | 売店 | 時計 | 売店に並びながら腕時計を見る。「まだ時間あるから間に合うな」 |
こんな感じで、実在する(自分がよく知っている)道を使って、各ポイントに「物」を置くだけです。各ポイントではより記憶に残るように色や、香り、その時の自分の感情をイメージすると定着がよくなります。
奇抜なもの、あり得ない者、ショッキングなもの、エッチなものは覚えやすいです。
こんな感じで実在する道に10の変数を置いて記憶してみてください。復習するときは頭の中でその道を歩くだけです。
ジャーニー法を使って変数を記憶する例
では参考に僕のルートを紹介します。
また今回紹介した変数は10個でしたが、これを改良した11個のバージョンで記憶しています。
こちらの「書籍」に11個の変数と、各変数をイメージしやすいようにアイコンにした例があります。僕はこれを使っています。例えば、固定値は「⨂」こんなアイコンです。
ルート:改札出口から会社まで
番号 | ポイント | 記憶したいもの | イメージ |
---|---|---|---|
1 | 改札 | 固定値 | 改札を通る。ICカードに固定値のアイコンが大きく描かれている。 |
2 | 売店 | ステッパー | 売店に人が並んでいる。for文のようだ。人数分繰り返されて、会計が実行される。 |
3 | 階段手前の分岐点 | フラグ | true,falseのように人が左右に分かれていく |
4 | ジムの入り口 | ウォーカー | ジムの看板にウォーカーのアイコン。規則的なループではなく、どのマシーンを使うかは人それぞれだ。木構造を走査するプログラムのようだ。 |
5 | スーパーの入り口 | 直近の値の保持者 | スーバーの買い物客が、買ったものを持って出ていく。買った商品はすぐ消費される |
6 | 物産展 | 最も重要な値の保持者 | 物産展にダイヤモンドのアイコン。重要なものが売っている。 |
7 | コンビニ | ギャザラー | 大勢のビジネスマンが、欲しい物を購入している。収集者のようだ。 |
8 | たばこ販売店 | コンテナ | 喫煙者が喫煙コーナーに出入りしている。追加削除が可能なリストや配列のようだ。 |
9 | 以前勤めていた会社の前 | フォロワー | 当時を思い出す。時間軸の違う自分が格納されている。その値を受けて今の自分になっている。常に他の変数とセットで利用されるフォロワーのようだ。 |
10 | 小学校の正門 | オーガナイザー | 保護者が自転車を押しながら並んでいる。子供の影響で順番が入れ替わったりする。値が並び替えられるオーガナイザーのようだ。 |
11 | 会社の玄関 | テンポラリ | 玄関を開けた瞬間だけ涼しく感じる。短期間だけ使われる変数。tempやtを連想させる。またアイコンの時計も連想。 |
こんな感じで作成しておくとすぐ覚えることができます。
また時間が立てば忘却するので、復習は必要ですがよく通る道を頭の中で歩くだけです。
最後に
今回は、コード理解の核となる変数の役割について解説しました。
ぜひご活用ください。
この記事があなたの参考や助けになっていれば幸いです。
ありがとうございました。