【質問#117】エンジニアとしてのキャリア形成が分からない

質問・悩み相談の回答です。

質問

ScalaとKotlin関連の記事でこのブログを見つけ、転職やSIer話なども楽しく拝見させていだきました。
私も転職することとなり、その中で生じた疑問を質問したいと思います。

現在23歳でSIerからゲーム業界に転職します。
元々、ゲーム業界志望でゲーム系の専門学校に入学したのですがゲーム会社相手の就活に疲れてシステム開発を行う会社に今年の4月に新卒で入社しました。
当初はプログラムが書ければいいやと思っていたのですが、周囲のプログラムに対するモチベの低さや、エクセル、ソース管理さえ行っていない低レベルな開発環境に嫌気がさしてきました。
他のSIerに入る気はないし、勉強してWeb系の会社に転職しようなんてことをゲーム業界に就職した友人に話していたら、その友人にゲーム会社の社長を紹介され12月にゲーム会社に勤務することになりました。

転職自体は嬉しいのですが、SIerという環境が嫌で勢い任せで飛び出した感じもあり、少しは計画を立てたほうがよかったかなと後悔しました。
なので、これを機にエンジニアとして、どういったキャリアを形成したいか、というものを考えてみようと思ったのですが、考えていくうちに何が何だか良く分からなくなってしまいました。

キャリアを考える上で、まずは目標を決めようと思い『転職できるだけのスキルを常に持つ』ということを掲げました。
これは今の会社に勤め続けたいたら5年後に転職できる気がしないなぁと思ったことが会社をやめるという決意をさせたことから決めました。
また会社とは契約を結んで労働力を提供する場であり、頼ることも依存することも行うべきではなく、会社が倒れたからと言って私が倒れたくないと思っているからです。

転職を行うためには労働市場における需要と供給を考える必要があります。
今のゲーム業界を考えるとスマートフォンのゲームが一大勢力を築いています。
その中ではゲームエンジン(代表的なものはUnity)と呼ばれる、ゲームを作るための巨大なフレームワークに習熟した人間が求められているのですが私はこの技術があまり好きではありません。
Unityが嫌いというよりも巨大なフレームワークの上で何かを構築していくという作業をあまり楽しめないので、好きじゃないのです。
Webフレームワークで言うとDjangoよりもFlaskのようなフレームワークが好きです。

中学2年生頃からプログラミングを初めて、それ以来楽しく継続してきました。
しかし、何かを作りたくて初めたというよりもプログラミング自体に興味があって初めたということもあってか、〇〇を誰でも簡単に実現できる環境というものにあまり興味がありません。
誰でも簡単にできるなら、わざわざ私が取り組む必要はないと思ってしまいます。

プログラミングが簡単に行え、修正が簡単なので本質的な問題に取り組めるのがゲームエンジンの利点として挙げられますが。
私はプログラマであり、私が取り組むべき本質的な問題はプログラミングにある、と思っているので取り除かれたらやることが無いなぁと感じます。
エンジンの幅広い知識よりも、クリティカルな部分を解決するのがプログラマが取り組むべき本質的な問題だと考えます。

転職するということだけ考えるのならゴチャゴチャ言わずにニーズの高そうな技術を学べば良いのでしょうが、人によって好みもあります。
別に仕事で使うのなら良いのですが、イマイチ好きになれない技術をプライベートの時間を使って学ぶという気にはなれません。

また待遇の面を考えると、人より良い待遇で迎え入れられたいのなら他の人と差をつけることが重要だと思っています。
他人と代えがたい差があるのだから良い条件を提示されるわけで、多くの人と同じならば並かそれ以下の待遇で受け入れられるというわけです。
いまいち好きになれない技術をニーズが高いからと学ぶ私が優れた差を作れる気がしません。

なんてことをゴチャゴチャと考えているうちによく訳が分からなくなってしまい、そもそも転職できるだけのスキルを常に持つという目標設定が間違っていたのだろうかと思い始めました。
もっと具体的にこういう役職に就きたいとか、こういうサービスでどうこうしたいのほうが良かったのだろうかなど。
ただ私はプログラミングが好きで、与えられた課題への解決に向けてプログラマの立場から協力したいのであって、別にこういう素敵なサービスを運営したいとかは無いのです。
そもそも、そういうアイデアが有るなら起業してやるべきだと考えています。

私より長くプログラマとして勤めてきた方の意見がほしいのですが知り合いには同年代しかおらず、今回相談させていただきました。
お時間が有るときで良いので、なにかご意見をよろしくおねがいします。

回答

私もそんなに多くの世界を見てきたわけでないので的確なアドバイスができるか不安ですが、可能な限りで回答いたします。

そもそも転職できるだけのスキルを常に持つという目標設定が間違っていたのだろうかと思い始めました。
もっと具体的にこういう役職に就きたいとか、こういうサービスでどうこうしたいのほうが良かったのだろうかなど。

ご質問は、このあたりの「働いていく上で自分の志向や気持ちを踏まえつつどういうスキルを付けるのが良いのか(どういう戦略で生きていくのが良いのか)」ということですね。
それを念頭に置きつつ、頭から質問を拝見して思ったことを書いていきます。

元々、ゲーム業界志望でゲーム系の専門学校に入学したのですがゲーム会社相手の就活に疲れてシステム開発を行う会社に今年の4月に新卒で入社しました。
当初はプログラムが書ければいいやと思っていたのですが、周囲のプログラムに対するモチベの低さや、エクセル、ソース管理さえ行っていない低レベルな開発環境に嫌気がさしてきました。
他のSIerに入る気はないし、勉強してWeb系の会社に転職しようなんてことをゲーム業界に就職した友人に話していたら、その友人にゲーム会社の社長を紹介され12月にゲーム会社に勤務することになりました。

やりたいことが決まっているというのは一つの強みだと思います。大体どんな分野でもトップクラスの知識や技術を有する人は、自分が取り組んでいる仕事のことを好きであることが多いです。そして、その好きなことに取り組む時期が早いほど、そして長くやり続けている人ほど、その傾向は強いです。何かの分野で成功したいならば、好きな分野を選んで一つのことをやり続けるのが最も簡単と思います。「思います」と書きましたが、同様のことは方々の人から聞きますし、一つの真理とさえ言ってもいいと思います。検証はできませんが。

キャリアを考える上で、まずは目標を決めようと思い『転職できるだけのスキルを常に持つ』ということを掲げました。

また会社とは契約を結んで労働力を提供する場であり、頼ることも依存することも行うべきではなく、会社が倒れたからと言って私が倒れたくないと思っているからです。

これは間違いなく正しいと思います。一番悲惨なのは外でつぶしの効く技術も得られず、現在の会社でそれなりのポストのまま、転職することも辞めることもできず硬直してしまうという状態です。最近はブラック企業に務める人に対して「社畜」という言葉が用いられますが、「畜」の意味的には個人的には前述のような状態の社員こそ「社畜」と呼ぶべきと思いますね。最も、ここで言う「社畜」が必ずしも悪ではなくて、幸せな状態も少なからずあるとも思ってますが話がそれるので省略します。

その中ではゲームエンジン(代表的なものはUnity)と呼ばれる、ゲームを作るための巨大なフレームワークに習熟した人間が求められているのですが私はこの技術があまり好きではありません。
Unityが嫌いというよりも巨大なフレームワークの上で何かを構築していくという作業をあまり楽しめないので、好きじゃないのです。
Webフレームワークで言うとDjangoよりもFlaskのようなフレームワークが好きです。

この気持は私も分かります。フレームワークは生産性を劇的に向上させますが、あるフレームワークについての詳細な知識は他のフレームワークではあまり役に立ちません。「フレームワークを使ってもフレームワークとは結婚するな」という格言的な物があったかとおもいますが、それはこういうことだと思います。(個人的にはUnityは好きですけど)

また、

『転職できるだけのスキルを常に持つ』ということ

にも反するところがある程度あります。あるフレームワークに極端に強くなってしまうと、全てそれでこなそうとしてしまって柔軟な考え方ができなくなってしまいますし、求人によっては「XXXXというフレームワークでの開発経験」とまで要求されるようなところもありますから、特定のフレームワークに依存するのは危険と言えます。もっとも、だからといって幅広いスキルを付けていっても「この人ではXXXXというフレームワークに関しては経験が無い」という低い評価をされる可能性も高いです。結局、特定のスキルが高いことをアピールするのは簡単なのですが、幅広いスキルが高いことをアピールするのは難しいという点も悩ましいところです。

〇〇を誰でも簡単に実現できる環境というものにあまり興味がありません。
誰でも簡単にできるなら、わざわざ私が取り組む必要はないと思ってしまいます。

これは私もすごく共感できる考えです。その昔、私は自分でPerlを使ってブログ的なシステムを自分のWebサイトに構築していました。ブログやCMSを使うのはかなり抵抗がありました(今もそうです)。

プログラミングが簡単に行え、修正が簡単なので本質的な問題に取り組めるのがゲームエンジンの利点として挙げられますが。
私はプログラマであり、私が取り組むべき本質的な問題はプログラミングにある、と思っているので取り除かれたらやることが無いなぁと感じます

転職するということだけ考えるのならゴチャゴチャ言わずにニーズの高そうな技術を学べば良いのでしょうが、人によって好みもあります。
別に仕事で使うのなら良いのですが、イマイチ好きになれない技術をプライベートの時間を使って学ぶという気にはなれません。

また待遇の面を考えると、人より良い待遇で迎え入れられたいのなら他の人と差をつけることが重要だと思っています。
他人と代えがたい差があるのだから良い条件を提示されるわけで、多くの人と同じならば並かそれ以下の待遇で受け入れられるというわけです。

このあたりもすごくよく分かります。

もっと具体的にこういう役職に就きたいとか、こういうサービスでどうこうしたいのほうが良かったのだろうか

個人的にはそのように考える必要はないと思います。詳しくは後述します。

ということで。

この問題の本質を簡単に述べるならば、業界が要求していることと、自分のやりたいことにミスマッチがあるということと思います。

「業界が要求していること」とは、質問者の方も分かっておられるとおもいますが、「フレームワークを使って高い生産性でプロダクトを生み出す」ことです。対して、自分のやりたいこと、というのは「フレームワークの上で簡単に動くようなプロダクトを作るんじゃなくて、プログラマとしての問題解決能力が必要とされるコアな部分の開発をしたい」ということだと思います。

ではどうやってこのミスマッチを埋めるかですが、特定の会社の求人内容を個人がコントロールするのは不可能なので方法としては

  • 自分がやりたいことをさせてくれるポストを用意してくれる会社を探す
  • 自分が変わる(業界が欲しているが、つまらないフレームワーク等の習熟を進める、自分がやりたいことをして金を稼ぐために起業する他)

の2つしか無いです。

前者は単純ですが、実際に行動するのは結構しんどく、精神力を要求されます。まず就職活動・転職活動は通常エネルギーを必要とされる行為であるのに対し、自分がやりたいことをさせてくれる会社に当たるまでガチャを繰り返さなければならないのですから。大体の会社は面接の時点でお互いを完全に理解してハッピーなマッチングができるわけではないです。会社で実際に働いてみて初めて分かることのほうが圧倒的に多いです。

質問者の方が望むような会社は少ないにせよゼロではないと思います。私はゲーム方面には強くないのですが、例えば思い当たるところだと、Factorioというゲームの開発にはかなり純粋なプログラミング能力が必要とされていると思いますね。これはC++で作られているらしいですが、数万というレベルのオブジェクトのリアルタイムの位置と生産・消費をあのサイズで高速に実現するにはUnityでは無理とは思えませんがそれなりに難しいと思います(詳しくはこのあたり)。

あとは、古くはコンシューマ向けゲームは低レベルな命令をダイレクトに使ってパフォーマンスチューニングしていたという話もよく聞きますが、これも最近では要求されるところは殆ど無いでしょうね。Steam上のゲームがNintendo Switchに移植されるくらいですから…。

ちなみに私は後者の「自分が変わる」を選択しました。

自分が変わるか、それとも自分を受け入れてくれる場所を探すか、それはどちらも苦痛や労力を伴う選択です。こういう選択は自分ですべきだと思うので私は下手に助言できませんが、代わりに私がとった「自分が変わる」という選択を参考までに説明したいと思います。

私はプログラマではなくて、もっと文学的・芸術的な方面で生きていきたいと思っていました。

小学生の頃は漫画をたくさん書いて友達に見せたりしていました。当時好きだった漫画は「沈黙の艦隊」やマガジンで沢山連載していた不良漫画でしたね。だいぶ頭がおかしかったと思います。でも、漫画で食っていくのが難しいことは幼い私にもよく理解できました。そんじょそこらのやつには負けないと思っていますが、しかし、漫画で食っていくにはずば抜けた才能が必要なのです。大学のときは某出版社から「うちで連載してくれ」と言われたのですが断りました(当ブログで何度も言及している唯一の自慢)。

あとは作詞という行為も好きで、高校のときには友達のバンドのために歌詞を何度か書いたりしていました。映画も好きで、高校のときは文化祭で映画をとって放映したりしてましたね。Flashムービーはたくさん作りましたし、今もAdobe AfterEffectsやPremireで何か作ることもあります。

プログラミングやWeb系の技術に関しても、それ自体が好きだというのももちろんありますが、元を正すと自分が書いた文章や作品を公開したいから、という気持ちが強かったように思います。そして、もちろん前述したようにプリミティブな技術を好み、フレームワークなどの簡易な技術で構成するプロダクトを好まない傾向はありました。

一番はやはり文章な気がします。私は日本語の長文を書いているとき、最も満足感を感じます。小説を書きたいと思ったのは高校生の時で、それからずっとネタを貯め続け、ようやく書き始めたのがFactory on the moonです。実は、この前にも漫画と小説は合わせて3回ほど作っているのですが。

で。私は今、商業的な技術で商業的な仕事をして飯を食っているわけです。

そこに何があったのかというと、簡単に言うと、得意なことと好きなことを分け、得意なことを仕事にして好きなことを趣味にしたのです。そのうえで更に、好きなことを多少のお金に還元したのです。そうすることで心に折り合いが付きました。

私の得意なことというのは、直感的にプログラミングやシステムエンジニアリング分野の技術を大まかに理解して使用するスキルと思っています。何か一つの分野に特化したものはないですが、まんべんなく何となく分かる。こういうスキルはサービス(プロダクト)立ち上げの黎明期に生きると思っていて、今まさにそういう環境で仕事をしています。前述したとおり、「まんべんなく大体できる」というスキルはアピールしにくいので私も転職のときは苦労しましたが、主に運によってなんとかなった気がしています。

一方で私が好きなこととというのは、その文学的・芸術的な方面ですね。

私は得意なことと好きなことを分け、得意なことを仕事にしつつ、好きなことを趣味で追求しようと思いました。これは、今振り返っても合理的な考えと思います。

好きなことを仕事にしたら、結局色々な人の色々な意思に影響を受けて好きなことができなくなります。仕事はまずは商業性が優先しますからね。会社は基本的には利益を上げるのが目的ですから。

私は仕事はそれなりに得意なことで攻めつつ、好きなことは趣味で行うこととしました。そうすることで、生活に必要なお金を確保しつつ自分の好きなことは自分ひとりで思い切りできるようになりました。

なんだか自分語りの方面にそれてしまいましたが、改めてプログラミングという分野に限定して考えてみますと、例えば私はsashimiというものを今作っていまして(制作が停滞していますがいずれ必要になるので開発自体は続けます)、これがプログラミング分野における私の「好きなこと」の一つです。フレームワーク(やブログ)を使うのが嫌だなぁ…という気持ちを自分でフレームワークを作るという方面に昇華したわけですね。

そして重要なことは、得意なことを仕事にするのはそこまで苦でないということです。そりゃ、好きなことと社会が求めていることがマッチしていたら幸せですが、必ずしもそうとは限りません。そんな中で、得意なことを仕事にしつつ、並行して好きなことを余暇にするというのは最大値の幸福は得られないが極大値くらいではあると思っています。

ただし私の選択にも欠点はあり、それは好きなことに最大の時間をかけれないということです。前述したとおり、この世界は好きなことを人より長い時間取り組んでいた人が成功しやすくなっています。ということは、ある分野で成功してその道のトップクラスに立つという可能性を低くするということです。それと引き換えに、人並みの幸せを得たという感じでしょうか。

ただ、繰り返しますがそこにネガティブな感情はなく、正しい選択をしたという満足感はあります。そもそも商業的な技術を追求していき、商業的な成功を目指す活動には楽しみも強いです(これは年をとってから理解しました)。

という感じで、私はやりたいことと世間が求めていることとのギャップに自分の気持の折り合いを付けています。答えは一つでは無いですし、そもそもも正解も無い問題です。沢山悩んで自分の道を決めて頂けたら良いと思います。その意思決定の中で以上が何かの参考になりましたら幸いです。