Web系自社開発企業でソフトウェアエンジニアとして働く3つのメリット
こんにちは、DUです。
タイトルにある通り、ソフトウェアエンジニア(以下、エンジニア)として企業で働くことのメリットを3つ紹介していきます。
2. どの規模の会社でエンジニアとして働くべきか悩んでいる方
1つ注意事項としては、今回はあくまで「エンジニアの技術的なスキルを伸ばす」という観点から会社で働くことのメリットについて焦点を当てています。
また、「フリーランスのエンジニアで仕事をこなしていくこと」と「会社員のエンジニアとして仕事をこなすこと」は、エンジニアとしての立ち位置、スキルセットも異なりますし、思想や見方によって様々な意見があることは承知しています。
こちらでは、それらに関して優劣をつけているわけではないこと、あくまでエンジニアとして成長する上で会社で働くことのメリットについて筆者目線で語っていることをご理解ください。
本題に入る前に、簡単な私の自己紹介です。
私は2015年頃からWeb開発を始めました。卒論ではLinuxサーバー上で計算したデータをPythonやFortranを用いて処理していました。その後、新卒として現在の会社に入社し、間も無く4年が経過します。フリーランスの経験はありません。
3つのメリット
結論から先に述べますと、以下の3点が会社員としてエンジニアをするメリットになります。
2. 一定規模以上のシステムを扱える
3. 経験の蓄積ができる
それぞれについて、もう少し深くみていきましょう。
1. 他人のコードが読める(チーム開発)
まず1つ目は、他人のコードを読めることです。一番大きな収穫が期待できるのは、自分よりもできる人のコードを読むことですが、ここでは特に「質」にはこだわっていません。とにかく自分が書いたもの以外のコードを読むことが大事だと考えています。
コードの書き方は千差万別
コードは書く人によって、振る舞いは同じでもコードは全く異なります。
そもそも、「コードが書けること」と同じくらい大事なことが「コードを読めること」です。コードを読めないということは、プログラムがどのように動くのか本質的に理解していないことと同義です。
どんなに自分がコードを書ける人間であったとしても、あなたが作るコードは必ず何か別のエンジニアが書いたコードに依存しているでしょう。Web開発であればオープンソースソフトウェア(以下、OSS)として開発されたフレームワーク・ライブラリなどの恩恵を受けていることがほとんどです。
コードが読めないと、エラーが発生した時いつまでもググることでしか解決できないエンジニアになってしまいます。(ほとんどのケースはこれで事足ります。ただし、コピペエンジニアとは別です。)
特にメジャーどころの問題から離れれば離れるほど、最終的にはコードリーディングでしか問題解決できないケースが増えてきます。
また、コードを書いているだけではいつまでも進歩しません。人のコードから学ぶことで自身のコードが洗練されていきます。
そういった意味で、人それぞれに書き方の癖や好みがあり、自分とは異なる書き方をしておくことに慣れておくことは非常に大きなメリットです。
自分が考えるきっかけに
他人の書いたコードを読むと、見たことのない書き方に遭遇します。そこがチャンスです。
自分が書いたものと異なったアプローチをしていると、なぜそのような書き方をしたのか、自分のものとの違いは何かを考えるわけです。
その過程を経ると、「同じような関数でも内部の実装は全然違っていた」や「今まで面倒な実装していたけど、こんな便利な関数があったんだ」など新しい発見が必ずあります。他人のコードは知識を獲得するための良いきっかけを与えてくれるのです。
また今まで自分で開発していたときに、なんとなく非効率さ・汚さを感じていた部分を他人のコードを通して客観的に評価することで、より良い書き方を模索するようにもなります。
個人の開発では
動くから良いか
と見過ごしていたところを、再考させてくれるのも非常にありがたいポイントです。
その他
その他にも自分の開発スコープからは得られないような、技術的な課題を一緒に経験できたり、コードの保守性、綺麗な書き方などチームで開発することによって意識してくる点も増えてきます。
それらの観点から、チーム内のベストプラクティスを確立したり、課題解決のための新技術導入に至ったり、エンジニアとして成長するきっかけを得ることができます。
チーム開発でもたらされる技術的な伸びしろは無限大です。
もちろん最終的には人間同士ですので、色々な感情や面倒な点は多数存在しますが、純粋に良い部分だけを考えると非常に大きなメリットと言えるでしょう。
2. 一定規模以上のシステムを扱える
次は、一定数以上のユーザーのいるシステムの開発・保守に携われる点です。
エンジニアと名乗る以上、動作するソフトウェアを作ることは最低限の仕事です。もちろん、動作させることが困難なシステム(UI/UXに凝ったWebサービス 等)であれば実装できること自体に価値があります。
しかし、Web開発そのものは既に2,30年の歴史があり、簡単なCRUDサービスをつくり上げること自体に大きな技術的ハードルはありません。
HTML/CSSであったりWordpressなどのCMSなどを経験すれば、あるいはWIXなどHP作成ツールを使うことで、システム自体は「誰でも作れるもの」へと変化したのです。
そんな時代だからこそ、ユーザーが多くいるシステムを設計・開発・運用・保守できることが本当の意味での「エンジニア」と呼べると考えており、その経験を積めることが会社員でエンジニアをすることの2つ目のメリットです。
規模の拡大に合わせた技術課題
ユーザー数の多いシステムで設計を誤ると、レスポンスタイムが非常に遅かったり、アクティブユーザーの多い時間帯は繋がらないなど、「仕様は満たしているが使えないシステム」となってしまいます。
要するに
1人だけで使えば正常に動作するが、1万人を越えるユーザーからのアクセスがくるとシステムが正常に動作しません
という残念な状態です。
中・大規模のシステムの開発設計が難しい点は、各システムの種類(サービスの業種や特性)によって特性を見極め、最適な設計を進めていく必要があるからです。
この要件に対応する技術的な課題に取り組めることが、「誰でも作れる」アプリの開発エンジニアから飛躍する次のステップです。
技術課題のレベルによりますが、よほど特殊なことでない限り、既に最適な解決策が提案されています。それらの技術課題に取り組むことで、「モダン」な技術の導入を経験していくでしょう。その過程で同時にソフトウェア開発の技術的な進歩や歴史に触れることになり、「なぜこの技術が生まれたのか」や「なぜこの技術に優位性があるのか」が少しずつわかるようになってきます。
技術課題の本質的な解決策
また技術課題に対して真剣に取り組もうとすればするほど、最終的によりコンピューターサイエンス(以下、CS)の素養が重視されてきます。
新しいOSSの導入だけでは間に合わない部分を、
データ構造
アルゴリズム
最適なシステム設計
など、より詳細なレベルでの考慮が必要になってくるからです。
Google, Facebook, Amazonなど名だたるIT企業やシリコンバレーが求めている人材はこれらの素養がある人であることも、面接内容などから推測できます。
未知の問題に対して、自分の知っていることから論理立てて解決策を組み立てる能力が必要なのです。
これらの視点は実際にある程度の規模でユーザーを抱えるシステムがないと考える機会も得られません。技術的なことに興味があればあるほど、会社員としてエンジニアをするメリットを享受できるでしょう。
3. 経験の蓄積ができる
最後に挙げるメリットは「経験の蓄積」です。
会社という組織に属していると、良い意味でも悪い意味でも「経験」することができます。これらの両方の経験が自分の中で、どの領域かを問わず「ベストプラクティス」と「ワーストプラクティス」を確立するのに役立ちます。
0からの最良の解決策を見つけるのは困難
本当の意味で何もないところから、「ベストプラクティス」を構築することは非常に困難です。
日々与えられた課題の中からの試行錯誤の積み重ねが経験となり、あなたの経験からの「ベストプラクティス」が生まれます。
思いがけない経験
また、組織に属している以上自分の思い通りにいかないこともあります。自分の意図せず色々なプロジェクトに割り当てられることもあるでしょう。
しかし、五月雨式に案件に入ることで、思いがけない領域の知見が身に付くこともあります。
私の場合は
1. 自分からは学ばないであろうPerlのコーディング
2. 誰でも使えるDockerによりローカル開発環境構築
3. 最低限の品質保証・テスト自動化
4. リリースフロー改善・自動化
などが、それに値します。もちろん、これら全てが無理やりやれと言われたものではありません。アサインされたプロジェクトの中のタスクもあれば、自分で必要だと見定めて取り組んだものもあります。
結果として、これらの素養はソフトウェア開発において、
「新しい言語の習得・特性の把握」
「メンテナンス性の高い環境構築」
「品質を担保したの開発」
「属人化・ミスを防ぐための運用フロー構築」
とどれも今後に活かせるような考え方を築く礎となったため非常に良かったと感じています。
ソフトウェア開発はものすごいスピードで日々進歩しており、その分野も非常に幅広くなってきています。この状態から探索的に自分の興味と結びつけて勉強していくことは、なかなか大変です。
「経験させてもらえること」で絞られた領域・分野において、より良い最適解を探す機会が得られます。それらが初めのうちは点と点であっても、繰り返すことでやがて線となり、ソフトウェア開発の全体像が見えてくるでしょう。
おわりに
以上が私の考える、会社員エンジニアとして働くことのメリットです。
最後まで目を通していただきありがとうございました。
冒頭でも述べた通り、目指すエンジニア像によって何をメリットと捉えるか変わると思います。また、会社員でなくても経験できることもあったかもしれません。あくまで、一個人の意見として一人でも多くの方の参考になれば幸いです。