メソッド屋のブログ

米マイクロソフト Software Development Engineer 牛尾の日記です。ソフトウェア開発の上手なやり方を追求するのがライフワーク。本ブログは、個人の意見であり、所属会社とは関係がありません。

ADHD プログラマの私がやっと見つけた「達成すること」が出来る方法

私は昔から ADHD で昔から発想力や問題解決力はあるのだが、自分自身が何かのスキルを上達することが非常に苦手だ。コンサルとか、エバンジェリストみたいな「人にやってもらう仕事」は得意だが、プログラマとか、ヴォーカリストとか、自分が本当になりたかった職業には何回もチャレンジして何回も失敗してきた。

f:id:simplearchitect:20180701232738j:plain

 遠くから見ていると私は何かが出来てるように見えるかもしれないが、冗談抜きで人の3倍ぐらい時間をかけないと成果が出ない。しかも、中途半端にしか完成しない。だから、土日も常に何か努力していないと不安になる。

 多分私と同じようなADHDの人は、自分的に努力しても何も達成出来ない辛さを感じているかもしれない。過去にも色々試してみたのだが、47年生きてやっと自分でも実施できる対策が見つかったので、同じ様なことで苦しんでいる人のヒントになればと思い久々にこのブログを書いてみた。

「自分で何かを作れる人」が長年の憧れ

大変な偶然なのだが、今は私はエバンジェリストからプログラマになれた。ただ、それは私の実力というより、組織変更でロールが変わったためだった。NEC に新卒で入社した時は、OSのコマンドを担当したいと言ったのだが、配属は営業部門だった。営業活動は全くやる気が出ず、仕事が終わったら、会社に行ってUnixをずっと触っていた。そしたらある先輩が私をSEにしてくれた。

それからもプログラマになる事は心の中で燻っていたのだけど、「自分がやる仕事」は本当に全く出来なかった。仕事だけじゃなくて、スポーツも、勉強も、音楽も、何か「自分が上達する」という事に関しては致命的にうまくいかない。

f:id:simplearchitect:20180701233243j:plain

スポーツも全然だめ。皆勤賞で、6年間やってたバスケは誰より1時間早く来てシューティングしたり毎朝ランニングとかやってたけど、レギュラーどころか、一秒も試合に出れなかった。

風向きが変わって来たのは、オブジェクト指向とか、アジャイルとかをやり始めてから、「コンサル」や「コーチ」みたいなもの、つまり、「人に何かやってもらう」とか、「仕組みを考える」とかは得意な様だった。それからもそういう人生だったけど、自分が本当になりたかったものは、「自分で何かを作れる人」だった。

3倍の努力をいつまで続けたらいいだろう?

今回はたまたま、憧れのプログラマになって、多分会社としては、今はロールが変わったばかりで能力に関しては多めに見てくれているが、私がマイクロソフトに入れる程優れたプログラマではない事は明白だ。このまま、3倍の努力を続けていないと、実力が無いのだからいつクビになっても仕方がない。しかし、「三倍の努力」は生活の殆どの時間を奪う。朝起きて、寝るまで、今はほぼ仕事、筋トレしかやっていない様な生活だ。同僚がバケーションを楽しみながらも、効率よく色々なものをマスターしていくのを横目に、自分は時間がずっとかかり、しかも中途半端。

f:id:simplearchitect:20180701233605j:plain

47年も ADHDをやっていると、こういう事も自分では受け入れている。ないものを嘆いても仕方ないから、別の方法を試すしかない。効果があったものとして、医師に処方されたリタリン。これは現在禁止されている。Lumosity というゲーム(科学的に効果がないと判定されたらしいが、ADHDの自分には集中力を上げる効果があるので今も契約している。)

www.lumosity.com

あとは、それよりも強力なのが、オメガスリーのフィッシュオイル(こちらは、科学的にも効果が認められている)ただし、1日の「ここぞ」というところでそれを飲むので、効果は長くは続かない。

item.rakuten.co.jp

他に BCAA という筋トレで使うパウダーも集中力を保ってくれる働きがあるので、よく使う。朝型にして、仕事の後、運動をがっつりして仕事に戻るという働き方も、物凄くよくて、脳のキレも最高にはなるのだが、ADHDの「達成出来ない」問題は解決しない。しかし、ある日ふとした事で、解決策を思いつた。

item.rakuten.co.jp

プログラミングをしていて気づいた事

先日プログラミングの技術調査をして、サンプルコードを書こうと思っていてパソコンに向った。やりたかった事は、たった1つのAPIの検証。しかし朝7時から初めて気づいたら15時だった。しかも、終わっていない。ADHDの私が昔から何回も体験した感覚。いつもながら自分にがっかりする。自分が知らず知らずに無意識にやってる見積りでは、「2時間ぐらいでできるかな。余裕を持って」だった。しかし、いつも私の考えている見積りは大幅に遅い方に間違うのが普通だ。

f:id:simplearchitect:20180701235324j:plain

XP とかだったら、理想見積という考え方をやるときは、邪魔が一切入らない状態でという条件で見積もりをして、初回は2.5倍する。人はだいたい見積りが下手だ。しかし、私の場合はこの度合いがもっとひどい感じ。

筋トレに向かう電車の中で、なんでこんなことが起こったのだろう?というのをふと考えてみる事にした。今までは、ADHDだからこんなもんと思っていたけど、本人は本当に嫌な事だった。本当に。思い起こしてみると、もっとも大きな問題は「最初に思ったことと、関係ないことを大量にしていること」だった。ちなみに、次点は、「何かを調べているうちに、前にやっていたことを忘れる」だった。

全ての行動をはじめる前に書いてから始める

次の日にやってみたこととしては、やるタスクをリストアップしてから仕事をしてみようと思ったことだった。これは、例えばアジャイルの世界で有名なテスト駆動開発でも、最初にタスクリストを自分の手元の紙に書いてから始めるというのがある。

f:id:simplearchitect:20180701235852j:plain

一定の効果はあるものの、ADHDの自分には「効ききらない」のも過去に試して知っている。しかし、今回は何かをするときに、先に紙に書かないと行動しないと決めてやってみた。

すぐに違うことを初めてしまう事に気づく

すると気づいたのだが、自分はすぐに違うことを始めようとするのだ。それも、「Webサーフィンしてしまう」とか、「Youtubeを見てしまう」とかわかりやすいもの以外が大量にあるのだ。

一つの例として私は、API の使い方を理解して、あるプロジェクトにコントリビュートしようと思った。今日のゴールは、無理せず、APIを調べて、その使い方を理解するためにサンプルを書くことだ。

Task
1. Azure Functions の Function Keys を Golang で取得する方法を調べる

 今回は、Azure Functions の Functions Keys をGo lang で取得する方法を調べたかったはずなのに、APIリファレンスを見ているうちに、次々と違うことが頭に浮かぶ。

  • 「あ、そういえば、次は CORSもすぐ調べないといけないな」
  • 「あ、これ、CORSのAPIだ。」
  • 「この構造体一体なんだろう?」
  • 「コード読んでみよう」
  • 「あれ、このプロバイダって一体なんだ?」
  • 「この文法よくわからないな」
  • 「サンプルプログラム作ってみよう」
  • 「あれ、venderのディレクトリが認識できないぞ」
  • Google で調べてみよう」
  • 「うーんよくわからない」
  • 「さっき何を調べているんだっけ?」

-> 時間ぎれ 

みたいな感じで、一切何も達成できておらず、身にもなっていない。

f:id:simplearchitect:20180701235543j:plain

こんな事だと、いくら最初にタスクリストを書いても効果がないのは当然だ。多かれ少なかれ人にはあるのかもしれないけど、ADHDの人にはこの特徴が顕著なのかもしれない。ADHDの原因として、今有力な説は、前頭葉が不活性で、短期記憶が人より短く、短期に覚えておけるものが少ない→だからすぐ気が散るというものらしいので、そらそうだなという感じだ。

行動する直前にタスクを書く

通常にタスクをリストアップするのは自分には通用しないと悟ったので、次にとった作戦は、タスクをこなしている途中で、「これをしてみよう」と途中で思った事も、まず、その場でタスクリストにまず書いてから、それをやるべきか考えてから、行動するという作戦にして見た。

f:id:simplearchitect:20180702000716j:plain

これは正直めちゃめちゃ有効な作戦だった。途中で思いついた事は、今すぐやるのが「悪い事」とは限らないのだが、今は違う事に集中した方がいい事の方が圧倒的に多い。だから、一旦紙に書いてみると、「あー、これ今しないほうがいいや」と思うことが多い。たまに「確かに今のゴールにはこれはやった方がいい」となる場合もあるけど、前のように、あっちいって、こっち行って何も達成できないとかが激減して、自分が普段見かけた「普通の人」と同じ程度の生産性を出せている。

ADHD 特有の短期記憶の弱さにも有効

しかも、いいことにこの方法で行くと、ADHDの短期記憶が弱い欠点の助けにもなる。例えば、よくあるのが、コードの意味を理解すために、メソッドを読む -> ロジックを読む -> その過程で知らない構造体が出てくる -> 構造体を探し回る -> その間になぜ構造体を理解したかったのかを忘れる ということなのだが、これも最初は

1. ○○メソッドを理解する

というタスクだったとすると、これを調べているうちに、内部で使われている認証ライブラリがサンプルに必要であると気づく。そこの引数にはどんな値が渡せるのだろう。その型を調べないとと考える。 その時点でタスクを追加する。なぜ調べているかも書いておき、調べたら、Linkなども貼って置いたりする(すぐに忘れて、 ブラウザがタブの嵐になって、探せなくなるから)

1. ○○メソッドを理解する
1.2. 認証ライブラリに引き渡せる構造体の条件を調べる
  https://docs.microsoft.com/en-us/.......

その構造体を探している間にもいろんな事に気が散る。あれ、このGetXXというメソッドこんなところにあったとか。前に調べていたやつだ。コードを見てみようとか考える。でもそれをやり始める前にグッとがまんして、先にに書いてみる

1. ○○メソッドを理解する
1.2. 認証ライブラリに引き渡せる構造体の条件を調べる
1.3. GetXXメソッドのコードを読む

そこで、ふと我に帰る。「おっと、これは全然関係ないじゃないか」と。そこで、このタスクを Parking Lot (駐車場に入れる)Parking Lot は今やらないけど、重要なことという意味。

1. ○○メソッドを理解する
1.2. 認証ライブラリに引き渡せる構造体の条件を調べる
Parking Lot
GetXXメソッドのコードを読む

ポイントをまとめると

  • 何か思いついてやろうと思う前に書いてから始める
  • タスクの内容は常にアップデートする
  • タスクリストは常に追記し続ける

という単純なもの。通常のタスクリストの粒度よりずっと細かくなるのだが、ADHDの私にとっては「思いつく」-> 「違う事始める」にめちゃめちゃ効果がある。たったこれだけ。

別のサンプル

このやり方をより理解するためにに、私がこのメソッドを「歌の練習」に適用した時の手書きのカオスなタスクリストを公開したい。これをみるとどんだけ気が散ってるねん!という感じがわかると思う。どんな感じだったかをシェアしたい

f:id:simplearchitect:20180701230809j:plain

最初に書いたタスクリストはこれだけだった。

最初の1小節を完璧に歌う
1. あいた喉の状態をキープする
2. 母音、子音のバランスをとる
3. 正しい音程と、音の長さを確認する

もちろん、全部できると思っていないので、1. 2. 3. は優先順位で最悪 1. だけでもいいと思って練習を始める。練習をし始めると、いろんな事を頭が思いつく。突然ウォームアップを歌い出そうとする。ちょっと待て、その前に、書いてから。これは、ゴールに近いのか?と考える。どう考えても違うので、Parking Lot の方に

最初の1小節を完璧に歌う
1. あいた喉の状態をキープする
2. 母音、子音のバランスをとる
3. 正しい音程と、音の長さを確認する
ウォーミングアップする

次に思いついたのが、喉があいた状態をキープするために、テンポを落とした状態で歌ってみる。という事。確かに、これは、最初にやっている「あいた喉の状態をキープ」の練習に有効で今やるべきなので書いてから、今実施。(ちなみに、実際の写真は自分でも字が読めないほどカオスやけど、やってるときは認識している)

最初の1小節を完璧に歌う
1. あいた喉の状態をキープする
 ・ゆっくり歌ってみる(キープしたまま)
2. 母音、子音のバランスをとる
3. 正しい音程と、音の長さを確認する

次に思いついたのが、あー、そういえば、イタリアに旅行に行きたかったけど、まだ予約してないなという事。もちろん関係ないから、パーキングロットへ。もちろん今やらない。

最初の1小節を完璧に歌う
1. あいた喉の状態をキープする
 ・ゆっくり歌ってみる(キープしたまま)
2. 母音、子音のバランスをとる
3. 正しい音程と、音の長さを確認する
ウォーミングアップする
イタリア旅行調査

次に思いついたのが、ヘッドボイス、ミドルボイス、チェストヴォイスをいつ切り替えるかを考えないといけないなという事。これは重要だけど、「あいた喉の状態をキープする事を できるようになる練習」とは違うよな。今しない。

最初の1小節を完璧に歌う
1. あいた喉の状態をキープする
 ・ゆっくり歌ってみる(キープしたまま)
2. 母音、子音のバランスをとる
3. 正しい音程と、音の長さを確認する
ウォーミングアップする
イタリア旅行
ピアノで音をとって、ヘッドヴォイス、ミドルヴォイス、チェストヴォイスの切り替えを確認する

次に思いついたのは、「あー、英語の発音悪いな。母音と子音のバランスを調整しないと聞こえが悪い」しかし、これは書く前に、リストをみると、2でやる事になっているので、今はまずは喉の状態をキープする練習を続ける。

といった感じで、振り返ってみると、これがこの後もずっと続いて「これでもか!」というほど気が散っている。しかし、この単純なリストがあれば、気が散っても、元の目的に戻ってくることができるので、結局この日は、1. はおろか 2. まで達成できた。まじで、人生でこんなことはじめてちゃうやろか!

まとめ

先の例でも、この方法を使ったら、プログラミングの方も超順調で何回も脱線しそうになったり、忘れたりということなく、「達成」することができた。こんなのは人生ではじめて。 この方法がADHDの人の全員に有効かはわからないですが、自分を救ってくれた方法なので、シェアしておこうと思いました。