最近、採用にも絡んでいるので、エンジニアになるまでの自分語りをします。
まだまだ青二才ですが、世界に通用するプロダクトが日本からもっと素晴らしいアプリケーションを生み出す人材が現れてくれることを願って、色々書きます。
プログラミングを正しく習うこと・たくさんの知識から判断すること
ある程度プログラミングのことがわかってくると、作りたいものを自分なりの方法で実装したくなる気持ちが大きくなってくることがあります。そうすると、自己流で色々作って、なんだか自分はなんでもできる気持ちになり、自分のやり方に確固たる自信を持つようになってきます。こうなったら初心者を脱却したと思っても良いですが、この頃になると自分のやり方が絶対的に正しいように思えてきて、自分のできる範囲のことで物事を考えてしまうような状態に陥ることがあるかもしれません。しかしそうした実装は実は、ライブラリを使って簡単に実現できたり、あなたのやり方よりもお決まりのデザインパターンがあってそれに従って書いた方が良いことなどがあります。間違ったやり方にこだわるほどあなたの才能開花は遅れます。いつも書いているコードに少しでも違和感を感じた時、本当にこれが正解なのか疑う癖はつけて置くといいでしょう。色々なところから正しく書き方を学び、追求することによって、読みやすいコードやいいコードは誰の目から見てもこれ以上よい方法がないのが自明という状態になります。
先人達の知恵を新しいものから学ぶこと
常に新しいやり方がベストということはありませんが、先人達が積み重ねた知恵というものを、知らずして自己流を貫くことは長期的に見ると重大な損失になる可能性があります。新しいものの方が、古いものの課題を捉え解決している可能性が高いため、新しい技術の歴史を辿ると芋づる式に古い技術の知識も手に入れることになります。特に仮想化技術は、昔は物理的な環境がなければ学ぶことができなかった、networkや、クラスタ構成などの技術を機能というレイヤにフォーカスして学ぶのが容易になったことは特筆に値します。とはいえ、ネットワークやインフラを物理的に構成することで物理的な接続を理解することで、仮想環境が物理環境の何に代替されているのか差分を見るとよく理解が深まったりします。
人の言うことを真にウケないこと
自分が明確に今ある解決方法の正しさを判断できることの方が大事です。技術力の前ではみな平等です。どんなに相手が自分より偉かったりベテランだとしても、ミスは誰にでもありますし、そう言う人たちがいつでも正しいとは限りません。時には自分の間違いに気づかされることもありますが、間違いを恐れてはいけません。賢い解決策を常に求める姿勢で、間違えた時は素直に認めて次に活かせば良いのです。不幸にも間違っていることがわかってはいるけど、言われたから言われた通りにやらなければいけないという環境になっている会社もよくありますが、そのような環境になっている会社であれば、健全ではないため、あなたの才能を無駄にしないために、環境を変えるか移るかした方が良いかと思われます。プログラミングを仕事にすると、想定外や緊急的な多くのことが起こります。時には短時間で難しい判断を迫られる場面も多々ありますが、プロとして、最も正しい答えに近いと思われる判断をしなければいけません。その時に最も頼りになる経験は、如何に多くのことに出くわしたり、失敗してきたかによります。自分で買ったラズパイの自作ドライバのバグでおじゃんにした経験だったり、並列実行中の、クエリのプロセスをキルしてデッドロックした経験だったり、プロジェクトディレクトリを丸ごとrm -fr ./srcで消してしまってextundeleteで復元した経験だったりします。生々しい成功・失敗経験から取り返しがつくもの、つかないものの区別がつくようになり、どこまで踏み込んで作業して良いのか、どのように不測の事態に対処するのが良いのか思いつく可能性が高くなります。職業エンジニアリングは決断力と判断力が非常に強く要求されます。正しい判断を下す確度を上げるために、自分のPCをぶっ壊してもよいと思えるくらいの気持ちでコマンドを上から順に打ち込み続けるようなこともしていました。本番で絶対やってはいけないことを影響の小さい範囲でやってみることは物事の仕組みを理解するのに役立ったりします。
自分の価値(できること)を正しく知ること
自分に何ができるのか正しく語れる人ってなかなか居ないと思いますが、僕は学生時代にゲームを作り、Webアプリを作り、ARアプリを作り、デプロイツールを作り、martipartを使用して画像アップロードの仕組みを作ったり、epubフォーマットのファイルを自前でビルドするスクリプトを作ったり、DroneをAndroid端末から操作するSDKを使ってアプリケーションを作るということを学生時代にしていました。これは、ひとつひとつのクオリティは高いものから低いものまでありましたが、人に提供するサービスを作るに当たって、どうやって作るか分かっているところ、分かっていないところが色々ありました。自分に何ができるかを知っていると人は自分のできないことに目が向くようになります。僕が相手の方の技術力を知りたい時にまずする質問は、あなたのやりたいことと、できることを教えてくださいといいます。やりたいことのなかには、まだ自分ができていないと思うこと(得意すぎて出来ることを言う人もいますが)、できることはその詳細をどれだけ細かく説明できているかでその人がどれだけ何ができるかある程度わかることがあります。もしエンジニアになりたい方がいらっしゃればこのようにある程度自分のできることやその価値を正しく知って置くといいと思います。
とにかく知識の吸収に時間をかけること
一つの技術に対してなにひとつ疑問点がないくらいに理解することはとても時間がかかります。山のようにある公式ドキュメントの隅々まで読んで仕組みを把握しているというような人は滅多にいません。ですが、こうした苦労はするべきです。同じ言語の技術書でも書いてることが100%ほぼ一緒になることはほとんどありません。複数の情報から検証を経ると、技術の理解への確信は深まります。私は年間技術書40冊を読むというのを学生時代に実施しましたが、よく知っていて使い慣れた言語でも、未だに自分の知らない知識に衝撃を受けることが多々あります。また、これくらい書籍を読むようになると、複数の書籍から重要な事項の差分が見えるようになり、蓄積された知識の検証ができ、自分の中に土台が出来上がります。
この世の最先端の情報を得るために、言語の壁を超えること
この世の最良のソリューションは日本語で書かれているとは限りません。
英語は特に有用な情報を書いていることも多いので、英語くらいは普通に読みましょう。よくTOEICなどから勉強を始めようとする方がいますが、TOEICなどの常用英語とは技術文書は性質的に異なるため日常的な英語の文章を読めたところで、そこまで読めるようになりません。日常英語に困らないレベルであれば、最初から英語の技術文書を読んでください。TOEICができたとしてもそもそも英文の技術書は技術特有の独自の概念が多く、抽象度が高いため読みにくいことがわかると思いますし、技術を使ってから読むと読みやすかったりするため、TOEICで勉強するくらいであれば、そのまま英語の技術文書を読んだ方が、英語の技術文書を読むために英語を勉強するという観点では、情報を得ながら英語を勉強できるので手っ取り早くて良いです。
今はレベルが低くても、数年後を見越す目を持つこと
エンジニアの成長は年単位で目算した方が良いです。始めてすぐは自分の技術レベルが低いために右も左もわからず、不安に思うことがあるかもしれません。ただそれは、当たり前で、不安を振り切って、淡々とやるべきことをやっていれば、半年くらいで、成果の芽が出始めます。未経験からエンジニアリングが出来る人は時々いますが、未経験だろうが学生時代に勉強していようが、必要な過程を正しく通れば、習得速度に差はあれども、ある程度のことは誰でも出来るようになります。私は年間技術書40冊を読むというのを学生時代に実施しましたと書きましたが、これは、緩すぎず厳しすぎずちょうど良いくらいの目標なのですが、情報系の大学を出てたとして、これくらいの勉強を積まれてる学生さんはそうはいないので、自分は社会に出た瞬間から即戦力として働けることは自明でした。私は未経験からエンジニアリングが出来るようになる人は大抵このような努力を自発的に出来る人だと思っていて、未経験から始めても出来るようになると思いますし、未経験からでも出来るようになる人は大抵エンジニアでなくても成功するような人だと思っています。いきなり大きなものを作ろうと考えて地道な努力を避ける人はだいたい失敗します。できる範囲のことをできるようになってそれをどんどん広げていける人は成功する確率が高いです。
技術の進歩速度を意識しておくこと
一年で追いつけない間にその技術は今までの二年分くらい先に進んでいたり毎日何か新しいものが追加されたり、変更されたりするので、一年で今ある技術に追いつけないのだとしたらその技術で食っていくことは諦めた方が懸命です。追いつく頃にはもう、それを使う理由が無くなっていたりするからです。例えばgruntやgulpといったタスクランナーでJavaScriptの管理の効率化が出来るように当初は衝撃的でしたが、現在ではそのほとんどの機能を代替出来るwebpackなどがあったりして、gulpですでに色々作ってしまっているからということと、使うのが難しいからという理由以外でwebpackを使わない理由は現在ではそんなになかったりします。(node.js用のタスクランナーとしてgulpを使い続けるという選択はあります)。今ある技術に追いつけないかもしれないけどそれでもその技術で食っていきたいと本気で思うのなら全力で追いかけましょう。悩んだり、遠回りしている時間はないはずです。
これからエンジニアを目指したい人へ。
是非エンジニアの世界に飛び込んできてください。
そして、その世界に飛び込んできてその奥深さや世界の広さを
感じてください。
時にはその広さ深さ故に果てしなさに途方に暮れて、
自信を喪失してしまうかもしれませんが、
一つできることが増えるたび、テクノロジーや技術
を使用する喜びを感じることができると思います。
私は自分を育ててくれた技術を使って、その世界で恩返しがしたいのです。
私はプログラミングに挑戦し続ける人を応援し、自分も技術を使って世の中に変化を与えることに挑戦し続けていきたいと思っています。