こんにちは、ソフトウェアエンジニアのたろーです。
現在クイックのエンジニアチームでは「手を動かし、具現化力を高める」ことを目的として、メンバー各々が「何を作るか」「何を使うか」を考え、個人で開発、学習を行う取組を行っています。
今回はこの取組の中で「何を使うか」もうちょっと堅く言うと「技術選定をどうするか」を自分の中で色々と考えながらすすめる機会があったので書いていきたいと思います。
本記事での「技術選定」とは主にプログラミング言語、フレームワーク、ライブラリ、ミドルウェア、インフラ、クラウドサービス等のエンジニアリングに係る手法や手段に何を使うかを選定する作業のことを指します。
しかし、エンジニア領域に関わらず、デザインツールやマーケティングツール等でもある程度共通する事はあると思いますので、是非エンジニア以外の方にも自身が業務や個人で利用しているツール等に置き換えて読んでいただけますと幸いです。
業務開発での技術選定と個人学習での技術選定との違い
まず、最初に私が考える業務での技術選定と個人学習での技術選定の違いからお話させていただきたいと思います。
業務上での技術選定について
基本的には、その技術を利用することで「業務(事業・サービス・プロダクト)が持つ目的を達成できるか」が軸になります。主に業務上で求められるQCD(Quality、Cost、Delivery)を実現できるかが大きな焦点となることが多いと思います。
もちろん、この選定スコープはプロダクトやサービスのローンチ時だけでなく、保守運用や日常的な機能改善にも含まれます。
さらに、これらを実現するためには、どのような要素を満たす必要があるかを要素分解していくと、
- 開発対象の機能と技術の相性(実現難易度・開発効率)
- 現チームメンバーの利用技術に対しての知見、ノウハウの有無や学習教育コスト
- 利用技術をスキルスタックにもつエンジニアの採用難易度
- トレンド性、将来性
- 受けられるサポートや利用コスト(そもそもOSSにするかベンダー製にするか)
- セキュリティ
等々、全てをここで挙げ切ることはできませんが、多くの要素を検討する必要があります。 これらの要素を目的や状況に合わせて優先順位をつけ、どの技術であればどの程度満たすことができるかを調査検討しながら技術選定していくことが多いと思います。
個人学習での技術選定について
「個人学習」という名の通り、個人自身がその技術を学習することで何を達成したいのかが軸になると思います。もちろん、社会や事業で達成したいことがあり、そのために個人学習するというシチュエーションは多いですが、業務上での技術選定との大きな違いは、「最終的な決定権は常に自分にある」ということです。
学習の目的としては、以下のようなものが挙げられます。
- 業務で利用している技術の理解促進、スキルアップ
- 業務利用予定の技術の事前習得を行いたい
- 新しいものやトレンド技術をとりあえず触ってみたい
- 個人的に作ってみたいサービスやプロダクトがあるため
- スキルスタックを増やし自身の市場価値を上げるため
など、人によって様々です。これらの目的を達成するために学習対象の技術選定を行うとなると、もう少し要素を分解しながら何を学習するか選定する必要があります。 その際に調査、検討する要素としては、以下のようなものが挙げられます。
- トレンド性、将来性
- 機能性(何ができるか)
- 学習コストや難易度
- 利用コストやサポート
- 事業利用している場合はどのように、どのような背景で利用しているか
など、色々な要素があります。
そして要素分解していくと
「あれ、目的は違えど個別に考えることって業務と似てるんじゃない?」
と気づいてきます。実際にコーディング等のアウトプットを行う前から、つまり「何を使おう」という技術選定の時点から業務で活かせる知見やスキルの習得は始まっているわけです。
私が個人学習での技術選定で軸にしたこと
私の場合は、個人学習の技術選定の軸として以下のことを意識しています。
- WEBアプリケーションの開発に関連するもの
- 現在自身では業務利用を行っていないが、将来選択肢として取りうるもの
- 一定以上のトレンド、市場シェアや将来性があるもの
情報収集を行い、実際に手を動かして感覚を掴み、業務やチーム開発に組み込んだ時のメリットやネックになりそうなところをイメージを膨らませながら、ひたすら探りまくっています。
実際に現在学習中のものは以下の通りです。
領域 | 利用技術 |
---|---|
バックエンド | Java+Spring Boot 3 |
フロントエンド | Svelte+Tailwind |
データ・ストレージ | DynamoDB |
インフラ | 未定(ローカル開発にはAmazon CorrettoのDockerイメージを利用していますが、production用にはECS+Fargateを使おうかなくらいの感覚) |
それぞれの選定軸は以下の通りです。
利用技術 | 選定軸 |
---|---|
Spring Boot、Tailwind | 市場シェアのあるアーキテクトのスキルや知識の向上 |
Svelte | トレンド傾向が高く、将来性の見込まれる技術の検証 |
DynamoDB | 業務で課題に感じているNoSQLやキャッシュ機構の活用について知見を増やすため |
ここでは大枠なフレームワークやアーキテクチャのみ書いてますが、細かなモジュール、ライブラリやAPI等も選定する際に目的やテーマをもってなぜ選ぶのかは意識するようにしています。
ただ、ここまで堅めに書いていますが、それぞれの選定軸は意識しつつも、「ちょっと気になるからさわってみよう」とか、「楽しそうだから」という気持ちが正直大きいです。さらに言えば、学習しているという気持ちよりも、楽しんでいるという気持ちの方が大きいです。この感覚が大事で、エンジニアとして生きていく醍醐味の一つでもあると思います。
最後に
「エンジニアは一生勉強し続けなければならない」とよく言われますが、エンジニアに限らずどの職業においても同じだと思います。 しかし「やらなくてはならないから」やるか、「やってみたいから」やるかはその人次第です。
とりあえず「やってみよう→やってみる」を繰り返していると、勉強という感覚がなくなってきて、個人の興味で行っていたことが、シームレスに業務にも活かされてくるようになるはずです。
強い目的意識をもって学習することもすごく大事だと思いますが、せっかくなのでもっと気軽に「なにやろうか、なに使おうか」と考えて、とりあえずラフに楽しみながら手を動かしてみるのはいかがでしょうか?考えはじめるところからすでに学習は始まっているはずです!
\\『真のユーザーファーストでマーケットを創造する』仲間を募集中です!! //