2011-11-30

エンジニアの面接でアルゴリズムを組ませる理由

@shibataismさんが、日経Bizアカデミーに「日本のエンジニアはシリコンバレーで通用するのか?」という記事を書いている。

「僕は文系だけど、エンジニアとして一流だ」と自己主張する人がいますが、採用側から見て実際にそうであることは稀です。シリコンバレーの企業では、採用面接の際に「 ○○アルゴリズムを書いてみてください」といったように、具体的かつ実践的な課題が出されます。こうした面接で、文系の人は(そもそも大学できちんと勉強したことがないので)適切な回答をするのが難しい場合が多いのです。

とあるのだが、アメリカの大学で数学を勉強し、プログラミングは独習したソフトウェアエンジニアとして1、少し補足してみたいと思う。

「文系」だからといって諦める必要はない

これはまあその人の経験によるのだろうけど、文系出身のエンジニアだからといって諦める必要はない。[平林さん](https://fallabs.com/mikio/)のように、文系出身でも、独学で実力をつけた凄腕エンジニアもいるし、[フェイスブックの優秀なエンジニアの中には、大学を卒業していない人もいる](https://ktamura.com/epriestley.html)。ウェブに関して言えば、バックエンドのエンジニアは、大学でComputer Scienceを学んだ人たちが多いけれど、フロントエンド(HTML/CSS/JavaScriptと場合によってはRuby/PHP/Perl/Python+データベースの利用といったアプリケーションレイヤーまで)は、文系あるいは高卒の人たちも多い。例えば[MooTools](https://mootools.net)のコミッターをしている[Aaron Newton](https://clientcide.com)は大学でジャズギターを専攻していたし、[改良版PHPとも言えるXHPを作った](https://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919)フェイスブックのMarcel Laverdetは、ルイジアナの大学をドロップアウトしている。ただ、記事で指摘されているように、日本から来る場合、ビザの関係で、文系出身のエンジニアは職探しが難しいかもしれない。

アルゴリズムは重要

@shibataismさんが言っているように、こちらの面接では実際にコードを書いてアルゴリズムを組むことになる。これに加えて、経験によってはシステムのデザインなどもすることになるが、まず基本的なアルゴリズムが組めないと、そこで面接が終わってしまう。

なぜアルゴリズムがそんなに大事か?これには2つ理由がある。

  1. 速く基本的なアルゴリズムが正しく組める人は、他のコードを書かせてもバグを入れにくいうえ、作業が速い。もちろん、アルゴリズムを組むのが遅くても、バグの少ないコードを書く人は沢山いる。でも、アルゴリズムを速く正確に組める人は概して他のコードを書かせても素早いし、バグを入れにくい。雇う側からすれば、バグが少なく開発スピードが速いに越したことはない。
  2. 効率的なアルゴリズムはコスト削減につながる。当然の話だが、同じ機能だったら出来る限り少ないリソースでできた方が、コストが減って儲けにつながる。ソフトウェアもビジネスなので、コストが低いに越したことはない。そこで様々なソフトウェアの最適化がされるのだが、多くの場合、もっとも大幅にリソース使用量を減らせるのが、より効率的なアルゴリズムを使うことだ。裏を返せば、効率的なアルゴリズムがちゃちゃっと組めないエンジニアは、コードを書く度に、それだけ会社に損をさせていることになる。

そんなわけで、アメリカのソフトウェア会社の面接では間違いなく具体的なアルゴリズムの実装が要求されるのだ。じゃあどう準備したらいいのという話になるが...

別に大学で情報学/工学を既習しなくてもアルゴリズムは組めるようになる

大学でコンピュータサイエンスを学べば、単位取得のために否応でもアルゴリズムを勉強することになるが、先端の研究はともかく仕事で必要な基礎は、恐れおののくようなものではない。必要とされるのは、高校一年生くらいまでの数学の知識と、論理的に考える力と、時間を割いて練習することだ。アルゴリズムを学ぶには、理論(どう体系的にアルゴリズムを分析するかなど)と実装(どうやってアルゴリズムをプログラムとして記述するか)の両方をやらなくてはいけない。
  1. 理論に関しては、一冊なんか本を決めて読みこむとよい。ぼくはAlgorithm Designという本を読んで、基礎を覚えた気がする。Algorithm Designはいい本なんだが、少し高いので、英語でも構わない(Algorithm Designも原書は英語だが)という人は、このタダの本の方がよいかもしれない。
  2. 実装に関しては、とにかくプログラムを組むことを勧める。先にあげた本には、いろいろとアルゴリズムの演習問題が載っているので、それらを実際にプログラムに変換してみるとよい練習になる。実際にプログラムを組むとなると、データ構造についても実践で学ぶことになるのでタメになる。

    以上シリコンバレーのソフトウェアエンジニアの面接の話。まとめれば「アルゴリズムは超大事だけど『文系』だからといって怖がる必要はない」だろうか。


  1. 一応コンピューターサイエンスの学位は持っているが、一行たりともまともなコードを書かずに卒業できてしまった。いい加減なものだ。

Creative Commons License