ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】

弊社に５年間在籍していたロシアの天才ハッカーが先日退職しました。

ハッキング世界大会優勝の経歴を持ち、テレビ出演の経験もある彼ですが、正直こんなに長く活躍してくれるとは思っていませんでした。彼のようなタレントが入社した場合、得てして日本の大企業にありがちな官僚主義に辟易してすぐに退職するか、もしくはマスコットキャラとして落ち着くかのどちらかのケースがほとんどなのですが、彼は最後まで現場の第一線で活躍してくれました。

そんな彼が最後に残していった退職メールがなかなか印象的だったので、その拙訳をここに掲載します（転載について本人同意済み。弊社特有の部分は一部省いています。）

************************************************************

ああ、なんという長い旅だったろう。この会社で５年間もセキュリティを担当していたよ（諸々の失敗は許してくれ）

俺は他の退職者のように面白いことは書けないが、私のこの退職メールを読んでくれている人、特に新人エンジニアのために、仕事を改善するための、いくつかの俺の考えを伝えよう。
これを俺の”新人エンジニアサバイバルガイド”と名付ける。中堅エンジニアにも、いくつかのアイデアを汲み取って、新人教育に活用してほしい。
このガイドには、この会社でエンジニアとしてスタートダッシュを決めて、高給取りのエンジニアになるための、俺のちっぽけなアイデアが詰め込んである。


#Application Engineer
1.技術的なスキルをマスターしよう。もっともよい教材のリストはこれだ。
https://www.google.com/about/careers/students/guide-to-technical-development.html
コースに学生向けと書かれていても気にするな。俺は学生じゃないけどここにあるほとんどのコースを受講した。

2.コードのクオリティに腹をたてるな。同僚の2倍のスピードでリリースをするよう心がけろ。
自分の担当箇所以外でも、明らかに壊れてる箇所を見つけたら、pull requestを送れ。
そうすればお前もイカした奴の仲間入りだ。
品質を確保するためのツールをマスターしろ(IDEs, Jenkins and testing suites, git, ssh)

3.Stack Overflowを使うな。内容をよく理解しないであそこからコピペをするものには、大いなる災いが訪れるであろう。
特にひどいのが暗号化のサンプルだ。99%のサンプルは間違っている！それを使うのではなく、社内のセキュリティチームに相談をしてアドバイスを受けろ。それが賢い人間のやり方ってもんだ。

4.英語を学ぼう。もし海外から来て日本で働いてるなら、日本語を学ぼう。もし両方マスターしてるなら、Javaの勉強でもしたらいいんじゃないかな ;-)

5.Chef, Ansible, Puppetを学ぼう。運用エンジニアの時間を浪費するのはやめよう。

6.常に４つの環境を用意しておこう。３つじゃなくて４つだ。すなわち、開発環境、QA環境(次期バージョンのテスト用)、統合テスト環境(現行バージョンから次期バージョンへのデプロイテスト用)、そして本番環境だ。

#Infrastructure Engineer
1.SLAがいくつに設定されているのか、またそれがどのように計算されるかを理解しよう。単一のデータセンターで運用する限り、目標とするSLAには決して到達しないだろう。

2.Failoverにダウンタイムが伴う構成は、high availabilityなシステムとは呼べない。

3.常にTLSを使おう。社内サービスであってもだ。

4.アプリケーションはnginxを経由して公開しよう。

5.システムのハードニングをしよう。そのためのchefのレシピがここにある。
http://dev-sec.io/

6.開発者と一緒に仕事をしよう。彼らが何をしたがってるのか理解するよう努めよう。よりよいソリューションの布教活動をしよう。例えば、キューワーカーモデル、非同期IO、中央レポジトリとフォワーダーによる非同期ロギング、自動化デプロイ、オートスケーリングなどだ。


#Database Administrator
1.技術的なスキルをマスターしよう。たとえ、濃縮ウラン認定DBA資格を取ったとしても、学習をやめてはならない。学ぶべきことはまだまだあるのだから。

2.CAP理論を学習し、各データベースソリューションにどのような違いがあるのかを理解しよう

3.それぞれのDBに管理者ごとにユーザを作成しよう。LDAPと連携していればよりベターだ。ログをできるだけ残せ。最低でも監査ログとスロークエリログは忘れるな。そしてそのログをSplunkやKibanaで見れるようにするんだ。

4.証明書ベースの認証をアプリケーションに推奨しよう。そして接続にはTLSを使おう。

5.DBのハードニングをしよう。特にOracleの場合は。 — https://benchmarks.cisecurity.org

6.テスト環境をできるだけ本番環境に近づけよう。もし本番でExadataを使っているならば、ステージング環境、統合テスト環境も同様にそうすべきだ。そこでコストをケチってはいけない。

#Security Engineer
この中には新人向けとしては、いささか高度すぎるものも含まれている。

1.不満を述べるのをやめて、修正のためのPull Requestを送ろう。さもなくばマネージャーにでもなったほうがましだろう。でないと、問題を解決することなく、何度も何度も苦しむことになる。

2.セキュリティソリューションを構築せよ。"encryption as a service" や "AppScan as a service" といった人間を介さないサービスを提供できたら素晴らしい。 HashiCorp Vault as a serviceや、TLS証明書管理ツール、 GRCツールなどやるべきことはたくさんある。

3.暗号理論に秀でよ。これは学べば学ぶほど退屈な代物だ。ただ、HMACしてから暗号化と、暗号化してからHMACの違いがわからないようでは、到底エースセキュリティエンジニアとはいえない。

#Technical Program Manager
新人の君がこれにあたることはないだろう。この章はむしろエンジニアからマネジメントへのキャリアチェンジを試みている人のためにある。

1.スポンサーをゲットしろ。スポンサーとは君の案件について、強いモチベーションを持つ役員のことだ。もしそのようなスポンサーがいなければ、その案件は中止し他のもっと重要なものにフォーカスしよう。役員を説得しようとするな。彼らはきっと君の相手に疲れてしまうから。

2.君の案件が最重要案件だと思い込むな。会社には君の案件より重要な無数の最重要案件がある。その時は辛くても、その新しい案件にフォーカスしなおし、時が来るのを待とう。

3.社内の様々な部署の人間とネットワークを構築しよう。

4.経理を学習しよう。

5.プロダクトマネジメントを学習しよう。

6.スピードよりクオリティを優先しよう。急いでもそんなによいことはないし、急がせることは君の責任ではない。よりよいものを提供するために十分な時間を確保しよう。

えーと、これで全部かな。
もしこのアドバイスが横柄に感じられたとしたら謝ろう。
参考にするもよし、無視するもよし、賛成するもよし、しないもよしだ。
これは、すべて俺の経験に基づいた個人的な考えだ。