2014年8月7日
大学院に入った時に知っておきたかった、ソフトウェアエンジニアとして学んだ9つのこと
(2014-06-30)by Manuel Ebert
本記事は、原著者の許諾のもとに翻訳・掲載しております。
3年前、私はバルセロナの神経科学の研究室で働いていました。被験者に電極を取り付けたり、認知体系の授業で講義をしたりと多忙な日々を過ごしていました。現在はソフトウェアの製作で生計を立てています。
もちろん科学研究をしていた当時も多くのソフトウェアを書きました。40GBの脳スキャンデータを解析するには、計算処理のプログラムを、気合を入れて書かなければなりません。私は常に優秀なプログラマでしたが、学術研究の職(および、私の約束された将来)に別れを告げて、 小規模ながらも野心的なスタートアップ企業 で働き始めるまで、気付かなかったことがあります。それは、ソフトウェアエンジニアであるということはどういうことか、ということです。そしてさらに重要なことですが、ソフトウェアエンジニアの業界に身を置くということはどういうことか、ということです。プログラミング言語やライブラリ、アルゴリズムやデザインパターンについて多くの知識を得ることではありません。意識の持ち方の話です。
大学院で研究を始める前に、この意識の持ち方さえ分かっていれば、もっと仕事がやりやすかったでしょう。
この記事は若かりし頃の自分へ宛てた覚書であり、過去3年間にわたって、時には痛みを伴って学んだことです。
1. 知性は過大評価されている
若い頃は、頭がいいことは大いに役に立ちます。小さな池にすむ大きな魚のようなものですね。さらに、言葉巧みに自分を表現するコツを心得ていれば、効果は倍増です。実際、頭がよくてそつなく会話ができれば、全く勉強しなくても高校のみならず大学生活だってほぼうまく切り抜けることができます(それでも物理は勉強しなくてはならないでしょう。方程式をスラスラとまくしたてるなんて無理ですから)。もしあなたがそうだとしたら、おめでとうございます。あなたはラッキーですね。その一方、とても不運でもあります。あなたが知識をつまみ食いしながら、努力もせずに駆け足で学校生活を送っている間に、他の人は、将来もっと重要になることを学んだはずですから。それは勤勉さ、粘り強さ、そして人脈作りです。さらにこの後で述べる8つの項目の中にも、学んだものがあるでしょう。
私たちの社会は知性を過大評価しています。私がかつて神経科学の分野で仕事をしていたと話すと、相手はよくこんな反応をします。「すごい、とても頭がいいんですね」。確かに私はバカではありませんが、私より物を知らない人が、神経学者としては私より優秀であるなんてことはよくあります。
知性は確かに仕事を成功へ導く鍵となるものです。しかし、それだけで仕事を成し遂げることはできません。勤勉さと厳しさを身に着け、信頼できるネットワークを持ち、愚か者にならないこと。これらは、ソフトウェアエンジニアのみならず、大学院という名の小さな世界の外で活躍する、あらゆるプロフェッショナルにとって必要不可欠な資質なのです。
2. 自分の仕事に誇りを持つ
この格言は使い古されたものかもしれませんが、それでも若者への重要な教訓が込められています。どんな仕事をしているにせよ、誇りを持ちましょう。何事も目的を達成するための単なる手段に過ぎない、などということはありません。もちろん出版物に自分の名前が掲載されれば誰だって嬉しいものです。しかし実際の成果物とは、いくつもの仮説を捨て去った末に何かを思いつくことそれ自体であり、実験を行うことそのものなのです(実験対象が人間の場合もあれば試験管の中の浮遊物の場合もありますが)。徹底的にデータを分析して有効性を立証するプロセスや、最初に犯したとんでもないミスのせいで、何度も実験をやり直すはめになった経験、こうしたすべてが成果なのです。これをソフトウェア製作に当てはめてみると、仕様を設計し、既存のオープンソースコードを研究し、新しい理論的な枠組みやプログラミング言語を学び、バグを修正し、ソースコードの書き直しや保守管理をすることを意味します。もしこうした作業に喜びを見出だせず、書籍の出版や製品を発売するための単なる手続きに過ぎないと思うのなら、その分野において真の熟練者にはなれないでしょう。自分の技能を極めたいという野心がなければ、科学者であれエンジニアであれ、たとえ何であったとしても、現在やっていることは時間の無駄です。
興味本位のプロジェクト に携わることは、自分の技術的好奇心を大切にしている証と言えます。そのプロジェクトは、差し迫った必要性などなく、純粋な興味に基づくささやかな仕事であり、楽しめるものだからです。面白いことに、こうしたプロジェクトは、ソフトウェアの業界ではよく見かけますが(現在、私たちが毎日使っている製品の多くは、かつて誰かの興味本位のプロジェクトとして始まったものです)、科学の世界ではほとんどありません。私のお気に入りの名言の1つである、コンラート・ローレンツの言葉をご紹介します。
毎朝の食事前に、温存してきた仮説を捨て去ることは、科学の研究者にとって効果的な訓練である
この言葉をくだらないと思うようなら、科学の研究者になるべきではないでしょう。
3. 新しいツールを習得する
前の話題の最後の部分に関連するのですが、新しいツールの習得に時間を割きましょう。抽象的な知識をやみくもに得るだけではなく、実際にツールを習得することは、ものごとを成し遂げる上で助けとなります。その努力はすぐに報われるでしょう。
新しいツールは、上述した興味本位のプロジェクトを通じて学ぶのがいいでしょう。そして新しいものを作る度に、初めての技法を試してみるといいと思います。その時に失敗を恐れる必要はありませんよ。そもそも大した投資も必要なく、その上、新たな知識が得られるのですから。結果的にうまくいかなかったり興味を失ってしまったり、はたまた少し挑戦の度が過ぎたなと思うような場合だって、さほどの問題にはならないでしょうし、自尊心が傷つくことだってないはずです。
以下、学究的な方々にお勧めしたい、すばらしいツールをご紹介します。
-
Gitと Github 。Gitを使うと作業の管理が楽になりますし、バックアップについての不安も解消されます。そしてGuthubでは、たくさんのすばらしいコードを参照できるため、同じようなコードを何度も一から記述する手間が省けます。ただし、ここで忘れてはならないことが1つ。必ず同僚や仲間たちと一緒に出来上がったプログラムをチェックしてください。あなた以外に誰も目を通していないようなプログラムでデータの解析をするのは御法度です(若かりし頃の自分にこんなことまで言わなきゃならないなんてある意味信じられないことですが、とにかく伝えることにします。君は確かに腕の立つプログラマだけど、今でも潜在的なミスを犯してチェック時に発見されることがある。だから現在の私はすっかり改心し、科学的な成果の約3割にはバグがあって何らかの誤りを含んでいると思うようになったくらいだよ)。
-
イラストレーションソフト。私の個人的なお気に入りは Inkscape ですが、業界標準と言えばAdobe社のIllustratorですね。最近、評判の高い Sketch もすばらしいと思います。これらのソフトをプロットやグラフの後処理に使うと、MatlabやMatplotlibでプロット命令を記述するよりもずっと楽なことが多いです。
-
テキスト/コードエディタの効果的な使用方法を習得しましょう。 Sublime Text はすばらしいエディタで、VimやEmacsに比べるとはるかに扱いやすく習得も容易です。加えて、ショートカットを覚えると時間の節約にもなりますよ。
-
話し方を覚えましょう。TEDTalksを見て、熟練した話し手たちが、約15分もの間、どのようにして観客の心をつかみ説得力のある話を展開しているかに注意を払ってみてください。そして、鏡の前で練習してみましょう。あなたの体や声自体もツールとなり得るのです。
-
Python、R、HTML、Javascriptの基礎知識を身につけましょう。後になって物事がスムーズに進むことが多いです。もし、すでにプログラミングの知識があれば、コンピュータビジョン、自然言語処理、ウェブスクレイピング、音楽合成、またはロボット関連!などでもいいので、とにかく新しいアスペクトやライブラリに触れ、学習していくといいと思います。
何か問題が生じた時に考えつくソリューションは、自分が使えるツールに制限されることがほとんどです。つまり、新しいツールを学ぶということは、問題の解決に対して新たな視点を得るということでもあるのです。
あなたが学生であれば、1週間のうちの1日を新しいツールの学習日とすることを強くお勧めします。博士号を取得して自分の研究を始めるようになったら、それを2日に増やしてもいいでしょう。長い目で見れば、将来にわたり多くの時間を節約できるはずですし、周囲の人たちがあなたの有用性に目を丸くするはずです。もしこれを負担に感じたり、そこまで時間を割けずプレッシャーに感じたりするようであれば、その時は、今、何に時間を費やすべきか先輩たちに相談してみてください。
4. 利害関係者としての地位を確保し、自分の指針を知らしめる
通常の感覚で言うと、上司やCEOというのは常に機関や企業の利益のために動いていると考えられます。それが仕事ですから当然です。
でも、企業にしても研究所にしても意識を持った存在ではないわけで、それ自体に利害的意識が内在しているわけではありませんよね。実際、私たちが会社の利益という時には、出資者、利害関係者の利益を指しているわけです。ここで真の疑問が生じます。CEOや上司たちは、誰を利害関係者と考え、その利益をどれほど重要視しているのか、ということです。
あなたのボスが、利害関係者は自分一人だと(つまり、できるだけたくさんの株式を公開し、素早くエグジットして最大限に利益を出したいと)考えている場合、できるだけ早くその組織から離れることをお勧めします。ボスのいいように操られ犠牲になるのが目に見えていますからね。では、他に利害関係者がいるとしたら誰でしょうか? 投資家や助成金交付者、従業員、学生、それとも人類全体? ポイントは、いち早くそれを見つけ出すことです。もし、あなたが利害関係者だと思われていなければ、すぐに出て行きましょう。あなたが仕事を愛していればいるほど、一方的に利用される状況は悪化の一途をたどるばかりだと思われます。
5. Shipping it
シッピングはテック業界ではトレンドとも言える用語です。一般的な意味は、製品を倉庫から出して消費者に届けるということですが、それよりももっと精神的な面に重きが置かれています。どういうことかと言うと、「消費者の手元で稼働するまでは、自分の仕事は無価値なのであって、常にそこを最終目標とすべきだ」というような意味です。
私が研究生活をしていた頃に作成したソフトウェアは、基本的には1つのシステム専用のものでした。そのため、数十万人のユーザを前提とするようなコードを書くというのは私にとって全くの異次元であり、自分自身がプロとしてコードを書くようになってからは、その経験のなさを痛感することがよくあります。
ただ、シッピングという発想には、数年にわたって手を加えながら手塩にかけて完璧な製品を作る必要はないという考えがあります。つまり、シンプルなアイデアでも、とにかくそれを伝えるということです。許容される最小限のものでいいですよ。複雑な仕組みは後から徐々に試していけばいいですからね。基本の枠組みがあるなら、ひとまずそれを出してみましょう。
6. 80対20の法則を知る
80対20の法則とは、望む成果の80%を達成するために、プロジェクトにあてる時間の20%を費やすというもの。残された時間の80%は、後の20%を成し遂げるためのものです。これは郊外から都市へドライブするような感覚で、20%の時間をかけ、80%の走行距離を進むことと同じです。ですが、交通渋滞に遭遇したら、たどり着くまでの残りの20%の距離に大幅な時間を取られることになります。
よくプロジェクトに必要な時間を低く見積もりがちなので、この法則を頭に入れておくことが肝心なのです。これは特に科学者とエンジニアが陥る傾向にあり、原因の1つに経験不足が挙げられます。経験を積めば積むほど、誰も予想だにしない失敗や、どんなおかしなエッジケースが発生するかをあらかじめ予測する力が養われていくのです。
まだ経験が浅い人は、単純にプロジェクトに必要と思われる時間に5をかけて、見積もった時間の5分の1を過ぎた時点で“完成間近”かどうかを予想してみましょう。
7. 魂を売らないこと
私が博士号取得に踏み切った背景には、よこしまな理由がいくつかあり、理由の1つを“学問的な罪”と呼んでいます。私は当時、博士号を取得する道へ進まなければ、自分の才能を無駄にしてしまうと信じていました。また、私の学問におけるキャリアを築くために手を尽くしてくれた人たちには借りがあると感じていたのです。教授や奨学金を払ってくれた恩人たちはみんな、私が研究に専念できるよう支えてくれたものの、私は期待に応えられませんでした。彼らは私の未来に投資したにもかかわらず、結果的に還元されることも、偉大な科学者を輩出することもなく、ガッカリしているかもしれません。ですが、それは彼ら自身の悩みの種であって、私には関係のないことです。
これは別の職業にも当てはまります。あなたに投資しようとする人が現われても、大抵は自分の利益や目的のためでしょう。投資したからと言って、あなたの魂まで所有することはできませんよね。
8. コンフォートゾーンから脱却する
私がこの世界をどう見ているかを図で表しました。
自分のコンフォートゾーンにとどまっていれば、すべてを把握することができます。馴染みのある環境だと、諸問題の対処の仕方も手馴れていることでしょう。言ってみれば、代わり映えのしない環境です。何か新しいことに挑戦し、成長したいならコンフォートゾーンから脱しなければなりません。そこは学習の出発点であり、ワクワクするようなことが起きるゾーンでもあるのです。そこにはあらゆることに即座に対応することが困難な世界が広がっています。
もちろん、時に途方に暮れることもあるでしょう。その時あなたはパニックゾーンにいることになります。完全に思考がシャットダウンした状態です。そこではせいぜい、誰かが助け船を出してくれることを祈るしかありません。
パニックゾーンのすぐ手前にスイートゾーンがあります。そこはたくさんの挑戦が待ち受けていて、最も多くを学び、著しく成長し、変化できるゾーンです。ぜひそこを目指してください。
安全など忘れ去るのだ
生きることの恐怖を感じる所に住みなさい
あなたに対する評価をぶち壊すのです
悪名高くあれ
-ジャラール・ウッディーン・ルーミー
9. 雑念をコントロールする
ゆったりと座って、目を閉じ、普段通りに呼吸をしてみましょう。鼻息が上唇の上の肌にかかる感触に全神経を注いでみてください。ただ、それだけに集中するのです。
あなたの集中力が切れるまでの時間はどれくらいでしたか? 集中力は5分間続きましたか? きっと無理ですよね。1分間続いたらいい方でしょう。20秒かそれ以下だとしたら、あなたはいたって正常です。あなたの心は猿のような状態で、とにかく一番近い木の枝をつかもうと躍起になっています。これを、もうちょっと学問的に言い換えてみましょう。専門的に言うと、いわゆる連想的思考です。何かクリエイティブなことをする時に連想的思考はもってこいですが、集中力を損なう要因にもなります。ですが、ありがたいことに集中する方法は習得することができます。この世には多くの生産性技術が存在しますが、すべて表面的なものに過ぎません。必要なのはクッキングタイマーでも、無料のライティングソフトウェアでもありません。雑念を操ることが大切なのです。
私にとって効果てきめんな方法が、あなたにも役に立つとは一概には言えません。私は瞑想することによってすばらしい効果を得ましたが(瞑想には有益な副作用がたくさんあります)、そのスタイルや流儀は千差万別なので、万人に合うような方法を教えることはできません。そこでお勧めしたいのが、心をベストな状態に保つことに真剣に取り組むことです。精神の鍛練に少なくとも通常の2倍の時間を費やしましょう。心の贅肉を少しばかりそぎ落とすのです。精神の視力を研ぎ澄まし、背中を鍛えることで心を真っすぐな状態に保ちましょう。
議論に参加し、フィードバックをくれたベネディクト、ジュディス、ガブリエル、ピーターに感謝します。
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
- Twitter: @yosuke_furukawa
- Github: yosuke-furukawa