「もっと成果を出さなきゃ」「スキルを増やさなきゃ」。そんな焦りに押され、やることを積み重ねていないでしょうか?けれど、本当に働き方を変えるのは“足し算”ではなく、“引き算”かもしれません。この企画では、エンジニアたちがあえてやめたことと、その後に訪れた変化をたどります。ムダをそぎ落とした先に残る、本当に大切な仕事や自分らしい働き方とは。誰かの“やらない選択”が、あなたの次の一歩を軽くし、前向きに進むヒントになりますように。
こんにちは、中島明日香(@AsuNa_jp)です。私は14歳の時に「女子高生ハッカーがサイバーテロリストから世界を救う」という話の小説を読んだことで、ハッカーに憧れを抱き、セキュリティの世界に飛び込みました。「私もハッカーになりたい!」という想いから独学でコンピュータを学び始め、そして今ではセキュリティの研究開発者としてのキャリアを歩んでおります。
ハッカーを目指して歩んだ、これまでの道のり
ハッカーになるという夢を具体化して、それを現実のものにする道のりについては、以前『Findy Engineer Lab』にて紹介しました。未読者のために簡単に説明すると、自分の目指すようなハッカーになるために、「ハッカー系会議」とも呼ばれる新規のハッキング技術や研究の発表が行われる、権威ある産業系セキュリティ国際会議『Black Hat』[1]にて発表することを目標に定め、それを実際に達成しました。
時には採択率が10%を切ることもあるこの国際会議に採択されるまでの道のりは、特別な才能を持つ訳ではなく、むしろ不器用な私にとっては、中々険しいものでした。しかし、真剣に向き合ったからこそ得られたものも多く、本記事もその道のりの途中で得られたものの1つを紹介したいと思います。
「才能のなさ」に悩んだ日々
冒頭の経緯からハッカーに憧れたことをきっかけに、大学も情報系を学べるところを選びました。加えて大学入学直後から研究室にも所属して、情報セキュリティの研究に拙いながらも取り組んでました。その努力の甲斐と幸運にも恵まれ、大学卒業後はNTTでセキュリティ研究者としてのキャリアをスタートさせました。
入社当時「いよいよこれで私もセキュリティのプロとしての道を歩み始めるんだ!」と心底嬉しかったことは今でもよく覚えています。しかし同時に、プロの研究者として自分がまだあまりにも未熟であることを薄々と感じていました。そもそも私自身が強みとする部分は行動力や体力であり、思考力や技術力に突出したところがありませんでした。もちろん自分なりに研鑽はしていましたが、例えばちょっとしたバグの解決に時間がかかったりしている時は、世界中のハッカーと呼ばれるような人の中でも、さらに一握りしか選ばれないBlackHatで採択されるほどの成果を自分が将来出せるようになるとは到底思えず「自分の才能の無さ」に悩みました。
そこで次第に「卓越した能力を身に着け、誰も見たことがない成果をだすには何が必要なのか?」ということについて考えるようになりました。そしてそのヒントを見つけるべく当時は、他の業界で一流と呼ばれる人の本を読んだり、周囲で突出した成果を出している人をよく観察したり、勉強法について学んだりなど試行錯誤しました。
世界一のプロゲーマーに学んだ、卓越性の身につけ方
その中でも、私の後々の技術力向上に一番役に立った考え方を学んだ本が、プロゲーマー梅原氏著の『勝ち続ける意志力』です。私自身はあまりゲーム(e-Sports)をしないため、本書に出会うまで梅原氏がどのような実績を出した人かについては知りませんでした。ですが各所で話題になっていたため、ヒント探しの一環として手に取って読んでみることにしました。

図1:Amazonを見ると入社1年目の9月に本書を購入した履歴が残っている
書籍には梅原氏がプロゲーマーとして「勝ち続ける」ための考え方が平易につづられていました。特に「要領は良くなかった」と語る氏が、いかにして成長して卓越した強さを身につけたかという部分の記述が、技術者として決して要領が良い方ではない私に深く刺さりました。特に影響を受けて、実際に行動にうつした考え方、および“やめたこと”について次に紹介します。
やめたこと1: 短期的な結果に焦点を当てるのをやめて、長期的な成長に目を向ける
例えば私は学生時代は、とにかく良い環境にさえ行けば、いろいろと教えてもらって、高い技術力を身に着けることができるのでは、と考えていたところがあります。そのため、良い環境に行くための試験や面接等の対策は入念にしていました。しかし、書籍に書かれている「勝つための努力」と「勝ち続けるための努力」の違いの考え方に触れて、そういった考えを徐々に改めていきました。 (補足:もちろん良い環境にいれば伸びる部分はあるとは思いますが、教えて貰うだけでは卓越した力や指導者を超える力を身に着けることは難しいかと思います。)
先ほどの例でいえば、私は目の前の試験や面接で「勝つための努力」は確かにしていました。しかし残念ながらこれは「勝ち続けるための努力」にはあたりません。本当に技術者としてこの先継続的に成果(それも卓越した成果)を出したい願うのならば、小手先の試験対策に頼らずに、自分の地力を伸ばす方向でもっと努力するべきだったのです。つまりは目の前の勝利(成果)に焦点を当てて一喜一憂するのではなく、自分の長期的な成長にもっと焦点を当てるべきだったのです。
やめたこと2: 才能の有無に囚われるのをやめて、毎日ほんの少しの成長を積み重ねる
「地力で勝負したら、それこそ才能ある人には勝てないのでは?」と思う方も中にはいらっしゃるかもしれません。もちろん世の中には凄い人もいて、普通の人が1週間かけて理解することを1日で理解できる人もいます。しかし才能があっても、何かを10年、20年と継続して取り組める人はほんの一握りです。そのため凡才であったとしても、毎日ほんの少しでも継続的に新しいことを学び、身に着けていくことを10年続けていれば、いつのまにか大きな差となって積み重なっていき、ひいてはそれが卓越した成果に繋がっていくのです。
あたかも自分の考えのように披露してしまいましたが、この考えも書籍を通じて学んだことです。何かを10年継続することは大変なようにも思えます。しかし、むしろ最初から既にセキュリティの道を10年続けていく覚悟が出来ていた私にとっては「1日ちょっとだけでも成長すれば良い」という考えは天啓にも思えました[2]。
地力を育てるための基礎づくり
では「勝つための努力」ではなく「勝ち続けるための努力」をすることに加えて、毎日ほんの少しでも継続的に成長する、という考えをどのように技術力向上に結びつけたかについて紹介します。
ツール頼りでは越えられなかった壁
私の仕事では昔も今も業務でリバースエンジニアリングをすることが多々あります。リバースエンジニアリングとは、実行ファイルを逆アセンブルし(機械語から低級言語であるアセンブリに戻し)、主にそのアセンブリを読み解いてソフトウェアがどのような挙動をしているのかを解析することです。
セキュリティの分野では、ソフトウェアの脆弱性解析やマルウェア解析の際に用いられることがあり、私の周りでも高いリバースエンジニアリング力を身に着けている人が多々います。また私自身も、学生時代からセキュリティを学んでいたこともあり、入社当時からリバースエンジニアリングの基礎的な部分については理解していました。しかし当時は、便利なツールにかなり頼って解析しており、複雑な箇所や未知の箇所の解析はお手上げな状態でした。書籍の考えに照らし合わせると、便利なツールを駆使して目の前の解析を終わらせるのは「勝つための努力」です。もし私が「勝ち続けたい」ならば、自分のリバースエンジニアリング力を基礎から見直して、知識の抜けや甘い所を丁寧に埋める必要がありました。
紙でアセンブリを読むことで地力を育てていく
そこで基礎の抜け漏れを洗い出し、少しでも知識を積み重ねるために、紙に逆アセンブル結果を印刷して読むことにしました。やったこととしては、ごく単純な数行程度のCのコードを一度実行ファイルにコンパイルし、それを今度は逆アセンブルして、Cのコードと逆アセンブル結果を突き合わせて読む、ということをしました。例えば「今日はif文のコードを読んでみよう」「次はfor文のコードを読んでみよう」と少しづつ取り取り組むことで、どんなコードが最終的にどのようなアセンブリになるのか、ということを理解することができました(図2左)。
図2: 左:簡単なif文のコードを逆アセンブルした結果。中央: ループ展開最適化のオプション付きでコンパイルされた実行ファイルの逆アセンブル結果。右: 脆弱性解析の様子
アセンブリやコンパイラについて理解が進んできてからは、例えばコンパイラの最適化オプションを変えて、出力されるアセンブリがどう変化するのかも見るようになりました。具体的には、gccの基本的な最適化オプションである「-O0」や「-O1」などを指定してコンパイルし、そのときに逆アセンブル結果がどう変わるのかを観察しました。また、基本的な最適化オプションだけでなく、ループ展開の最適化オプションの一つである「-funroll-all-loops」を個別に指定した場合に、アセンブリにどのような違いが出るのかも確認しました(図2中央)。
研究の最中、ソフトウェアの脆弱性について理解を深める際も同様に、脆弱性箇所の逆アセンブルされたコードを紙で読んだり(図2右)、それだけでなく逆コンパイル結果(機械語をソースコードの形に戻したもの)や攻撃コードを、解析ツールと併せて紙で読んだりしていました(図3)。

図3: 各種脆弱性や攻撃コードを紙と併用して解析することで理解を深めている様子
少しの成長を積み重ねたその先に見えてきたこと
私自身が不器用なことも相まって、一気に成長することはもちろんありませんでした。正直今でもそれは変わりません。ただ、自分の技術者・研究者としての少しづつの成長が「誰も見たことがない結果や成果」に繋がることが多々ありました。
例えば、書籍を読んだ約一年後の2014年秋、韓国で開催される女性限定の国際的なセキュリティ大会[3]「Power of XX」に参加する機会があり、そのオンライン予選会に参加しました。通常複数人で参加するコンテストですが、生憎と他に都合がつく女性エンジニアが見つからず、私一人で参加することになりました。一般的に単独での予選突破は難しいことから、腕試しのつもりで参加したところ、大会の中では比較的高得点に設定された、難易度の高いリバースエンジニアリングの問題を解ききり、予選を突破することができました。

図4: 一人チームkunoichiとして参加。数十いるチームの中から5位で予選突破
数十チームいる中で、一人で参加している自分が予選を突破するとは夢にも思わず、驚いたとともに自分の成長を実感することができました。ただ、残念ながら仕事との調整がつけられず、先方とも協議した結果、最終的には代理で他の女性エンジニアに韓国の決勝大会に出場してもらいました。
その後もリバースエンジニアリングおよび低レイヤ技術に関しては継続的に学び続けており、例えば最近でも、Undocumented(未公開)なWindowsカーネルデータ構造をリバースエンジニアリングし(図5)、それを使った新しいキーロガー検知の技術をインド最大級の産業系セキュリティ国際会議「NULLCON」で発表しました。

図5: 未公開のカーネルデータ構造 gphkHashTableを解析した様子
本研究は、英国の国家サイバーセキュリティセンター(NCSC)のCTOが毎週公開しているニュースレターの中でも、注目のトピックの一つとして取り上げられました[4]。BlackHatでの発表成果が最終的には米国政府の目に留まったことは、以前の記事で紹介しましたが、今回も同様の成果が出せたことで、いわゆる「一発屋」に留まらない実力が身につけられていることを改めて実感しました。
焦らなくていい、成長には時間がかかるから
いかがでしたでしょうか。私自身は今も変わらず結構不器用なので、正直今でも急成長する若手などを見るといつも大変感心させられてしまいます。加えてこの10年間、実際には上手く成果が出ない時期や辛い時期が続くことだってありました。もちろん人間なので焦る時だってあります。天才でない限りはほとんどのエンジニアは、そのような時期や焦りを経験するのではないでしょうか。
そんな時はこの記事で紹介したように、目の前の結果に一喜一憂しすぎずに、自分の長期的な成長に重きを置き、日々の些細な学びに意識を向けることをお勧めします。例えば「今日はこの技術用語の意味を知った」といったレベルのささやかな成長でもいいのです。それを年単位で続けていけば、いつの間にか大きな成長につながり、その積み重ねがやがて目に見える結果や成果に結びついていくのですから。
-
Black Hatには主に「Black Hat USA」「Black Hat Europe」「Black Hat Asia」があり、それぞれ米国、イギリス、シンガポールで開催されます。USAが最高峰ですが、他も時には採択率10%を切るほどの難関会議です。 ↩
-
この記事で紹介した内容以外にも「優勝に浸った時点で成長はない」や「変化なくして成長はない」といった、何かを卓越したいと願う人に向けての金言の多いおすすめの1冊となります。 ↩
-
CTF (Capture The Flag)と呼ばれる種類のセキュリティコンテスト。ハッキングコンテストとも称されることがある。 ↩
-
CTO at NCSC Summary: week ending March 9th: https://ctoatncsc.substack.com/p/cto-at-ncsc-summary-week-ending-march-b85 ↩
