コーディングや設計で難所に出くわした時にすること

仕事や趣味でコードを書いているとき、設計をしているときに難所に出くわすことがあります。
そんなときに僕が意識的に心がけていることを紹介します。
もっと良い方法があったらぜひ教えてください。→皆様。


難所に出くわす前に「もうすぐ難所だな」と気づいているときは、すでに冷静な状態で心構えができています。
この場合はきちんと対処ができることが多いです。


何度も考えがループしていたり、難しすぎて他の事に逃避しているときは集中力がないか、難所にさしかかっているサインなので、難所の場合は以下の5つを順番に試しています。

  • 絵を描く
  • 人に言葉にして説明する
  • 思考の流れをテキストにする
  • 散歩する
  • 次の日に持ち越す

絵を描く

設計やコーディングに関して、分かっていることを絵や図にあえて描いてみます。
分からないところは箱を描いて中に? とでも書いておけば良いです。
絵を書く過程で、自分がどこが分かっていないかがきちんと認識できます。
ディスプレイから目が離れて、ブラウザでのサイト巡回も止まるので集中力を取り戻せます。
僕はこの絵をデジタルで保存しておいてWikiなどの貼りたかったのでWACOM FAVO コミックパック CTE-440/W2を買いました。

人に言葉にして説明する

仕事の場合、周りに同僚がいて同じような仕事をしていることもあります。
そのときは自分が何で困っているかを背景もあわせて丁寧に説明します。
同僚が答えを知っている場合もありますし、人に説明することで考えが整理され気づけば自己解決することも良くあります。

思考の流れをテキストにする

これは集中力が途切れがちで考えがまとまらないときや、あまりに難しすぎて脳内容量が足りなくなったときに有効です。
Aを決めるにはBを決める。Bを決めるにはCとDを考える。Cを考えるにはEとFの・・・。
のように深追いしていって元のの目的を「Aを決める」に戻ってこれなくなるのを防げます。
これはこの記事の最後に実際のサンプルを載せておきました。

散歩する

ちょっと席を立って歩きながら考えます。
仕事中ならば、トイレに立つのが有効です。
これは経験則的に、環境を変えて歩きながら考えると良い考えが思いつくというもので、他の人に有効かどうかは謎です。

次の日に持ち越す

上を全部試しても一切進まないのであれば、今日はあきらめて明日の自分に期待します。
特に夜に考えて分からないものは翌朝に考えると一瞬で答えが出たりするので寝ちゃいましょう。

思考の流れテキストサンプル

今日書いたやつです。かなり適当ですが意外と有効なんですよ。
ここから↓

  • ISO9660のデータ構造体にvnode
  • FileSystemEntryがグローバルであれば良い?
  • read(vnode, buf, size)→vnode->read(buf,size)
    • seekとの関係は?
    • seekインターフェースある?→ある
    • seekは範囲チェックだけかね
    • readのときに範囲を渡せばよい
      • openされたときにoffsetオブジェクトを作ればよい
      • open時に id ⇔ (vnode , offsetオブジェクト)を作成
      • seek時にはxxseekで範囲チェック。OKならoffsetオブジェクトを更新
    • なぜこんなことを考えているか?
      • vnodeは一つ
      • iso9660nodeも一つ
      • iso9660fileがiso9660nodeにあたる
      • 最良の設計か?
  • 流れのまとめ
    • open 命令
    • vlookup で vnode, iso9660node作成
    • このopenにひもづいた file構造体っぽいもの(offset, vnode含む)
    • file構造体 →id を返す
    • read(id,
  • 結局何をすればよいか
  • vnode_read(vnode, offset, hogehoge, hogegheo)という関数を作れば始まる気がする
  • そのまえに vopenだ
  • そのまえに vlookupだ。
    • パスを探索して vnode を返す
    • そのFSのルートディレクトリの vnode は?あらかじめセットする
  • こうかな

int Vnode::lookup(vnode* diretory, const MonAPI::CString& file, vnode** found)
{
return diretory->lookup(file, found);
}

    • ん。うっすらとモヤモヤな気持ちになってきた。
    • directory->fs->lookupかなぁ。
    • direcotry->fs->lookupにする
    • FileSystem クラスがちょうどあるのでlookupを実装する
    • すでに過去に lookupされていて vnodeが作られている場合の処理を書かねば
    • どうやって保持しようか
    • direcotoryキャッシュ・directory entry cacheを作る
    • directoryキャッシュの仕組みは外側に作るべきだ
    • インターフェースは?