読者です 読者をやめる 読者になる 読者になる

StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

どちらも一長一短の「短時間集中 vs 長時間ダラダラ」

日記

効率的なコードが書けない

 年末年始、帰省してたのですが、12/28〜1/2ぐらいまで、実家の部屋にこもってずっと実験データの分析をやっていました(たまに家族で食事に出かけたりした)。
 まともな体勢で寝た日が1日ぐらいしかなく、机の後ろにベッドがあるので後ろに倒れ込むような形で仮眠してたら朝になってたみたいなのが続き、脚とかがむくんできました。


 といっても、大した分析をやったわけではなく、ごくありきたりな分析を何パターンもやってただけなのですが、データの種類が多かったので前処理部分でやることが色々あったのと、あとは単純作業を自動化するプログラミングのスキルが不足しているせいで、時間がかかってしまいました。


 一回書き上げたコードや計算結果を見なおしていて、何か前提とか処理方法の間違いに気づいた時、効率的に書けていればごく少数の箇所を直すだけでいんでしょうが、そういうのがまだ全然できないです。
 いつもどおりRで書いていて、今回書いたコード自体は4500行ぐらいになってるのですが、内容的にはコピペが多用されていておぞましい限りですね……。
 自分でなんとなく「ここはこういう関数でまとめれば」ってイメージできる範囲でも、書き直したら何分の1かに圧縮できる気がするのですが、頭使うのがめんどくさいんですよねーw


 似たような処理を反復するときの工夫こそがキモなのに、上手い書き方を考えるよりも「とりあえず早く計算結果が見たいんだよ」って思ってしまって、何も考えずに前の処理のコードをコピペしてテキストの置換でとりあえず回してしまったりします。
 こういうのが積み重なるとあとで修正とかをするのが大変で、結局トータルでは非効率になってしまうので、きちんと計画的にコードを書いたほうがいいのは分かっているし、以前よりは工夫できるようになってきました。
 でも、べつにルーチン的な処理を繰り返すためのプログラムを作ってるわけではなく単に目の前のデータを思いつきで掘っていく作業なので、プログラミングというよりは「統計ソフトをCUIで操作してる」という感じだし、何より「こういう計算してみたらどうかな?」って思った時に、とりあえずすぐに結果を見たいという誘惑に勝てないことがけっこうあります。


 要するに、スキル不足のせいで、スマートなコードを考えることに時間を使うよりも、ベタ打ちコピペで乗り切ったほうがその場限りでは速い……ということがけっこうあるわけですね。そう考えるとやっぱり、「すぐに計算結果が見たい」と「あとあと効率的に処理できる」を両立できるように勉強してスキルを上げるしかないですね。
 私は文系ですので、学生時代から「勉強」と言えば本を読むことという感じで、特に人文・社会科学の「古典」を読むことに時間を割いてきました。が、去年ぐらいからは英語・統計・プログラミングの勉強と、あとは実証系の論文の読み込みに時間を使うようにしていて、今年も基本的にはそういう感じで生きていこうと思います。それが大事だと思っているからというより、単に自分のスキルが足りてないからです。ほんとは岩波文庫とか読んで暮らしたいです。
 
  

まとまった時間でしかできないこと

 なのでまぁ、時間をムダにしてしまって年賀状もほとんど書いてないという悲惨な年末年始ではあったのですが、自分のスキル不足の問題は措いといて、やっぱ「時間を気にせず、引きこもってだらだらデータをいじくりまわす」時間は大事だなと思いました。
 なんというか、まず連続していることが大事で、同じ10時間でも「コーヒーとお菓子とトイレ以外はずっとパソコンに向かってる連続した10時間」と「仕事終わりの2時間×5日間」だと、全然できることが違う気がします。そして「明日までにこれとこれを終わらせないといけない」みたいな切迫感が全くないというのも大事です。「だらだらしてる」というと悪く聞こえますが、要は「リラックスした状態で作業できてる」わけです。


 「集中した短時間の作業」を繰り返したほうが効率的にできる作業も多いし、ふつうは休憩を挟んだほうが人間の脳は効率的に働くと言われますね。「仕事がデキる人は短時間で集中して片付けるのだ」とかドヤ顔で言ってる人よくみかけます。
 しかし短時間集中方式のせいで失うものもあると思うので、とりあえず3点挙げておきます。


 第一に、コードを書きながらデータを分析していくみたいな作業の場合、直前に何を書いていたのかという記憶がフレッシュな状態で頭に残ってないと、整合性のあるものが書けないので、集中力が低下しても眠気で作業効率が低下しても、とにかくまとめてやったほうが良い場面はけっこうあると思います。文章を書く作業とかでも同じような場面がけっこうある。


 第二に、「こういう計算してみたらどうなるか見てみたい!」って思いついてしまったら、その欲求がMAXな瞬間に取り組んだほうが良いと思います。そこで「あ、もう寝る時間だ、作業効率を低下させないために続きは明日にしよう」って割り切るのが「デキる男」なのかというと、そうとは限らないんじゃないでしょうか。次の日にはモチベーションがなくなっていたり、発想が浮かばなくなっていたりする恐れがあります。


 第三に、先ほども書きましたが、時間内に終わらせなきゃという切迫感がストレスになることもあって、時間無制限のほうがリラックスできたりします
 そういえば、「アメとムチ」方式のマネジメントは、ルーティン作業には効果的だが、クリエイティブな作業には向かないとかよく言われますね。外発的動機付けと内発的動機付けの話です。それに似てると思うんですが、本来やりたくない作業をイヤイヤやっているのであれば、リラックスのために休憩を挟むほうが効率的だと思います。しかし自分が「やりたくてたまらん」と思っている作業であれば、むしろ「終わりの時間を気にしなくていい」ことによってリラックスできる効果が大きいように思います。深夜にテレビゲームとか麻雀をやってる状態と同じなんじゃないでしょうか(私はどっちもやらないですが)。


 サラリーマンの仕事でも、たぶん「夜中まで延々作業する派」と「定時までに集中して終わらせる派」の対立がどこの会社でもあると思います。で、通常は定時派のほうが正しいとされることが多く、「長時間頑張るより集中して短時間でやったほうが生産性が高いんだよ。そんなことも知らないの?」とか言われて、夜中派は肩身が狭かったりします。しかしそれって、「仕事は辛いもの」っていう前提が勝手に置かれてるんじゃないでしょうか。
 「義務感でイヤイヤやっている仕事」とか「ゴールが明確な単純作業」であれば、定時派の言ってるとおりで間違いないとしても、「本人が好きでやってる作業」とか「芋づる式にいろんな発想が出てくる」ような場合は、夜中派が良いものを作り上げることだって結構あるんじゃないでしょうか。ちなみに夜中派は好きでやってるので、定時派が想像するよりも心理的にリラックスしているし、適当に息抜きもしています。
 本人の性格にもよると思うので、他人に深夜作業を進めようとは全く思いませんし、会社だと残業代の問題とかがあると思いますが(私自身は、30代になってからは、長期的な健康を考えて深夜作業はなるべくやらないことにした)。


 あとなんだかんだで、集中力の有無とか頭のキレの良し悪しとかに関係なく、とにかく時間をかけないと良い物ができない作業ってものもあって、そういうのは夜中派のスタミナが活かされる領域ですね。そもそも、筋肉における「速筋と遅筋」、ランナーにおける「短距離型と長距離型」みたいな感じで、脳ミソにも瞬発型と持久型があると思います。「3時間で70%ぐらいの出来のものを作れるけどそれ以上に仕上げる気にはならない」タイプと、「3日かかるけど根性で99%ぐらいまで仕上げられる」タイプがいて、前者のほうが活躍の場面が多いと思いますが、どうしても99%のものが必要っていう場面もあると思う(研究なんかはそうでしょう)。


 でも結局はやはり一長一短で、両方の組み合わせが大事という感じかなとも思います。分析用のコードでも、夜中にダラダラと書き上げて分析してみた後、いったん寝てからちょっと見直すといろいろ改善策を思いついたりとかしますし。
 「連続した10時間」の中でしかできない作業があるのと同時に、「連続した10時間」の中では発見できないミスとかもあるし、ほんとにずっと時間を気にしなかったら結局何も仕上がらないしねw


 ……まぁ深夜作業の話はべつにどうでもよくて、何が言いたかったかというと、「終わりを気にせず作業できる時間がとれたので、全く遊びに出かけたりしてないし睡眠不足だけど、充実した年末年始であったと同時に、スキル不足を痛感したので今年は頑張ります」という話でした。