ラバーダック・デバッグとは、達人プログラマー: 熟達に向けたあなたの旅(原題: The Pragamtic Programmer: From Journeyman to Master) において、「プログラマーがラバー・ダックを持ち歩き、ラバー・ダックに向かってコードを1行ずつ説明することによりデバッグを行う」という話が元となっている、デバッグ手法である。
この場合、「無生物に対して独り言を行う」事によって、「コードを説明して問題の原因を探し出し、デバッグする」ということを行っている。しかしながら、「独り言を行う」という行為は、環境によっては(周りのことを考えると)できないケースがある。
そこで、別記事でも述べられているSlackでのダイレクトメッセージによるラバーダック・デバッグについて、実際に3ヶ月ほど実践したときに行った事、コツを挙げる。
https://qiita.com/karronoli/items/b1e9c47ad03db2b92a4b
チャット用SNSの書き方に則ってアイデアを短く書く
Slack分報の別記事でも紹介されている書き方のように、チャット用SNS(例として、X(旧Twitter)やLINEなど)のように、一言だけやった(やっている)ことを返すスタンスを取っている。これによって、アウトプットのハードルを下げて、「良いものを出さなければならない」事によるプレッシャーを減らすことはできる。
https://freelanch.co.jp/useful/times/
過去のアイデアが間違っていたとしても、削除・変更するのではなく(必要ならば)線を引く
「過去にあげたけど後々見ると間違っているアイデア」
当然だが、誤字があったら文の見やすさの観点から、編集による変更をするべきではある(Slackのようなデジタルツールならばそれを行うのは容易い)。ただし、「思考ルートを保存する」という観点から見れば、過去のアイデアが間違っていたとしても、それは消してしまうべきではない。それは「失敗に至ったルート」としても活用して、消去法で正確なルートを導くことができる。
コードを読んでいくときは、箇条書きにする
ラバーダック・デバッグにおける「一行ずつ読む」という特性上、(見やすさ、読みやすさの観点から)Slackの「箇条書き機能」は非常に相性がいい。個人的なおすすめとしては、コード行の把握がしやすい「1. , 2. , 3. , ......」である。以下に例を示す。
.......
const generatePath = (pathname: string, params: object) => {
// パスの中でコロン(:)で始まるパラメータ名を抽出する
const paramNames = pathname.match(/:[^/]+/g) || [];
// パラメータが足りない場合はエラーを投げる
paramNames.forEach((param) => {
const paramName = param.substring(1); // コロンを取り除く
if (!(paramName in params)) {
throw new Error(`Missing required parameter: ${paramName}`);
}
});
// パスを生成する
let generatedPath = pathname;
paramNames.forEach((param) => {
const paramName = param.substring(1) as keyof typeof params; // コロンを取り除く
const paramValue = params[paramName];
generatedPath = generatedPath.replace(param, paramValue);
});
return generatedPath;
};
......
1. generatePathはpathname(string)とparams(object)をパラメータとする関数
2. paramNamesは、受け取ったpathnameからコロンから始まるパラメータを取得した配列
3. paramNames.forEach((param) => {});という処理でparamNamesの中の要素paramごとに処理(4~5)
4. 要素paramからコロンを取り除いたparamNameを定義する
5. paramsの中にparamNameが存在しないときはエラーメッセージ
6. 変数generatePathにpathnameを代入
7. paramNames.forEach((param) => {});という処理でparamNamesの中の要素paramごとに処理(8~10)
8. paramNameに、paramの最初の一文字(コロン)を除いた部分文字列を代入しつつparamsのキーとする
9. paramValueは、paramsからキーparamNameを用いて取り出した値
10. 変数generatePathのparam部分について、paramValueに置き換える
11. 変数generatePathを返す
緩急をつけてこれを行っていく
「長く続けていく方法」は人によって様々であるので、これについては一個人の意見である。緩急をつけるべきと思っている理由は、「アレやコレをしなければならない」というプレッシャーを除いて、自然と行うことのできる習慣に昇華しようという意図があるためだ。
後書き
個人的にSlackの自分用ダイレクトメッセージを用いて、業務効率の改善を図った際に、行ったことを述べさせてもらった。しかしながら、人によって意見はさまざまであると思うので、「自分が思う業務効率の改善手段」があれば、是非ともコメントなどに書いていただけると、とても助かる所存である。