新卒研修でエンジニアのお仕事について話しました
ピクシブの2019年度の新卒研修で発表した内容です。
文脈としては、新卒全員(ビジネス職も含む)に社内の色んな職種について話すパートでエンジニアの職種について話してくれとのことだったのですが、「今こういう仕事があります」だと深みがないので、「なぜこういう仕事があるのか」を重点的に話すことにしました。
エンジニアリングとは
エンジニアリング:課題解決のためにシステムを作ること
システム:複数の要素が相互作用しながら動く仕組みのこと
ソフトウェアエンジニアリング:課題解決のためにソフトウェアというシステムを作ること
ソフトウェアも、複数の要素が相互作用しながら動く仕組みですね。
Q: ソフトウェアではない「システム」は何がありますか?
例えば、「風が吹けば桶屋が儲かる」。
人と人との関係も、システムといえます。
ソフトウェアエンジニアリングの歴史
元々は、こういう機械を作るのがエンジニアリングでした。「エンジン」ですね。
1960年代頃にソフトウェアエンジニアという言葉が生まれたようです。
1990年頃まで、ソフトウェアは「機械の一部として売るもの」でした。(組み込みソフトウェア)
1995年頃からパソコンが普及して、パッケージソフトというものが生まれました。
同じく1995年頃からインターネットが普及して、ウェブサービスが生まれました。
ウェブサービスのソフトウェアは、サーバーで動きます。サーバーはデータセンターというところにあります。
Q: 組み込みソフトウェアと、パッケージソフトと、ウェブサービスの大きな違いは何でしょうか?
リリースの頻度が全然違います。
- 1度きり
- 数ヶ月〜数年に1回
- 毎日〜毎週
頻繁にリリースできるということは、頻繁に改善できるということです。
2000年頃はドットコムバブルというものがあって、数万社がライバル達に先んじて成功しようと戦っていました。Googleですら、検索エンジン会社の中では18番目と後発でした。
毎日リリースして毎日改善することは、ウェブサービスの会社にとっては生命線です。そのためには、ソフトウェア開発のやり方をそれまでと大きく変える必要がありました。
要件定義に数週間、開発に数ヶ月、テストに数週間なんて、とてもじゃないですがかけていられません。
アジャイルソフトウェア開発
そんな流れの中で出てきた考え方がリーンとかアジャイルという考え方です。(Lean = 無駄のない、Agile = 俊敏な)
いかに最速で最高の価値をユーザーに届けていくか、その開発プロセスを常に改善し続けましょう、という考え方です。
すべての仕事は、「本質的な価値提供」をするための「作業」から成り立っています。
作業は減らし、本質的な価値提供は増やしたいですよね。
例えば、メールを送るのは作業で、本質的な価値提供は「相手に情報を伝えること」のはずです。(さらに本質的な価値提供は、情報が伝わった結果のアクションが起こることのはずです)
メールのテンプレを作っておくとか、メールじゃなくてSlackにするとかでも、目的が達成できれば良いわけです。
ソフトウェアエンジニアリングも同様です。脳内で組み立てた処理がコードを書かずに動いたら一番良いはずです。
実際、世の中はそういう方向に猛スピードで進化してきました。
例えばRuby on Railsは、一般的なウェブアプリケーションで作るようなものを最小限のコードで実現することを目指して作られたフレームワークです。
ここまでのまとめ
- 「いかに最速で最高の価値をユーザーに届けていくか、その開発プロセスを常に改善し続けましょう」という流れ
- 「作業」を減らして「本質的な価値提供」を簡単に実現できるようにソフトウェアエンジニアリングは進化している
(ここまで20分ぐらい)
社内の「エンジニア」とその周辺のお仕事紹介
ここまでの内容を踏まえて、「実際にやっている仕事」だけではなく、「本質的な価値」と「本質的な価値提供を効率化する仕事」にフォーカスして見ていきます。
サーバーサイドエンジニア
RubyやPHPやScalaやJavaやGoなどを書いて、サーバーで動くビジネスロジックや、ビジネスロジック同士を繋ぐ処理を作ります。
ビジネスロジックとは、サービスとして提供したい処理の本体のことです。
「商品を3件カートに入れて注文すると、発送のフローにまわる」みたいなのがビジネスロジックです。
本質的な価値
ビジネスロジックをソフトウェアとして実現することです。
本質的な価値提供を効率化する仕事
Ruby on Railsのようなフレームワークを作ったり、ソフトウェアをリリース(デプロイ)するためのソフトウェアを作ったりすることです。
インフラエンジニア
サーバーや、その上で動くOSやミドルウェアを管理します。
本質的な価値
サーバーサイドエンジニアがビジネスロジックに集中できるように、サーバーやOSやミドルウェアのことを(あまり)意識しなくてもソフトウェアが動く状態を実現することです。
本質的な価値提供を効率化する仕事
インフラエンジニアが手作業でやっている仕事を自動化する、あるいは無くすことです。
フロントエンドエンジニア
JavaScriptなどを書いてUIを作ります。
本質的な価値
サービスが提供したいユーザー体験を、ウェブのUIとして実現することです。
本質的な価値提供を効率化する仕事
ReactやVueのようなフロントエンドのフレームワークを作ったり、サーバーサイドのAPIをフロントエンドから使いやすいように作ったりすることです。
アプリエンジニア
iPhoneやAndroidのアプリを作ります。
広い意味では、VRoidを作っているUnityエンジニアもアプリエンジニアと言えるかもしれません。
本質的な価値
サービスが提供したいユーザー体験を、アプリのUIとして実現することです。
本質的な価値提供を効率化する仕事
よく使うコンポーネントなどをライブラリとして作ったり、既に公開されているライブラリに機能追加することで、ゼロから作らなくても良くなります。
アプリを作るための設計指針を作って、次にコードを書く人が迷わないようにするのも効率化のための仕事です。
レコメンドエンジニア
機械学習などを使ってレコメンドを実現します。
本質的な価値
サービスが実現したいユーザー体験を、レコメンドを通じて実現することです。
本質的な価値提供を効率化する仕事
データ活用の基盤を整備したり、データを使える状態にしたり、機械学習のフレームワークを整えることです。
その他
以上が社内で多いエンジニアですが、他にも次のようなお仕事もあります。
配信技術エンジニア
画像や動画の変換と配信に関する開発をします。
テストエンジニア
エンジニアがテストを書くための仕組みを整えます。
自動テストがあることで、バグに早めに気付けるので開発が効率化します。
セキュリティエンジニア
これも同様に、セキュリティを強化することでサービス開発を効率化します。
データアナリスト / UXリサーチャー
データ分析のためのコードを書くが、サービスを開発するとは限りません。
このような、コードは書くけれど大きなシステムを組み上げるわけではないお仕事は今後増えていくと思います。
デザイナー
フロントエンドのコードも書くけど肩書き上はデザイナーというパターンもあります。
マネージャー / CTO
経営の課題解決のために開発組織というシステムを作ることがお仕事です。
(ここまで40分)
ソフトウェアエンジニアのキャリア
ソフトウェアエンジニアのキャリアをとりあえず2つ紹介します。
本質的な価値提供の効率化を追求する
(ソフトウェアエンジニアに限らず)すべての仕事は「本質的な価値提供」と「作業」から成り立っており、「作業」を減らして「本質的な価値提供」を増やすことが求められます。
作業 : 効率化 = 8 : 2 ぐらいの考え方で仕事をすると良いと思います。
もし効率化のほうに向いていれば、チームと相談して6 : 4とか5 : 5ぐらいにすると良いと思います。
もっと追求したくなったら、技術開発本部と相談して専業化できるかもしれません。
(もしくは、転職のときかもしれません)
本質的な価値提供のために、隣接分野に進む
アプリエンジニアもサーバーサイドのエンジニアも、本質的には「ユーザーにサービスを届ける」ことなので、目的のためなら手段は選ばずに色々な技術に手を出してみるのは、俯瞰した視点を得られ、キャリアにとってもプラスになると思います。
本質的な価値提供のために配信技術のような難しいエンジニアリングに挑戦してみるのも、もちろんプラスになると思います。
データ分析したりデザインをやったりマネジメントをするのも、実は本質的な価値提供はまったく同じです。
ソフトウェアエンジニアの将来
サーバーサイドエンジニアやフロントエンドエンジニアという職種ができたのは、たったの10年前ぐらいです。
(その前はウェブエンジニアとHTMLコーダーとかがありました)
今ある職種も、たぶん10年後は別の名前に分かれていると思います。
10年もすると、プログラミングできることが当たり前な時代が来ます。
世間一般ではまだ先でしょうが、少なくともIT企業はそうなるはずです。
つまり、時代が変わっても応用が効くように挑戦し続けることが大事です!