見出し画像

サービス開発におけるマイナーな言語選択の光と影

ファンズ株式会社 CTO の若松(@yshnb)です。弊社のサービスではバックエンドシステムの開発言語として、 Scala を中心に開発しています。

前回まではあまり具体的な技術に触れずマネジメントのお話を書いてきたのですが、今回はこの Scala という開発言語の選定背景と、それによる開発組織について書いていきたいと思います。


ファンズにおける技術スタックの特徴

開発するプロダクトは「Funds」がメイン

弊社では個人投資家の方向けに、投資という形での間接的な融資機会を提供する貸付ファンドのオンラインマーケット「Funds」を運営しています。ほかにも派生的に運営している事業はあるのですが、プロダクトとしてシステム開発が必要な事業は現在のところ Funds が中心であり、多数のプロダクトを同時並行で開発するような組織ではありません。

中心的な開発言語の1つとして Scala を採用

冒頭でも述べましたが、 Funds ではバックエンドシステムの開発言語として Scala を中心に開発しています。

フロントエンドは TypeScript を中心として使っていますし、メインのアプリケーション以外では一部で JavaScript や Python や Go なども使用していますが、なんだかんだで Scala を中心に開発をしている点は、他社と比較したときの特徴的な点になるのではないかと考えています。

開発組織はスタートアップかつ少数精鋭組織を志向

また弊社はスタートアップで、ソフトウェアエンジニアはフロントエンドエンジニアとバックエンドエンジニアを合わせても正社員で10人強、業務委託を含めても15人程度です。年月を経ながら少しずつ人数も増えてはいますが、開発組織としてはそれほど人数の多い組織ではないと思います。

Scala 未経験の方を採用した実績もありますが、こうした事情から、バックエンドの開発者には基本的には Scala 経験者を中心に採用しています。

Funds が開発言語に Scala を採用した理由

バックエンドのシステムに Scala を採用するという意思決定をしたのは 2017 年の末でした。当時は Scala を採用する企業も一定数あったものの、 Scala 自体は当時としてもスタンダードといえる選択肢ではなかったと思います。

そのため、カジュアル面談などで弊社のお話を紹介したときに Scala の採用理由を聞かれることもあり、この際には次のようなお話をさせていただいています。

型システムが強力なため不具合を型レベルで検出しやすい

弊社は金融領域のシステムを開発しているという点で、不具合があった場合、その不具合の内容によってはかなり大きな問題となることもあり、単に後から直せばよいというものではありません。

Scala では静的型付けを行うことに加え、関数型プログラミングの特徴を備えた、比較的強力な型システムを持つ言語です。コンパイルの段階で多くの問題点を検出することができ、安全なシステムを開発するという点では有利な特徴を備えていると考えていました。

関数型言語と呼ばれる言語は Scala 以外でも Haskell や OCaml、F#、Clojure といった選択肢もありますし、最近は Rust を採用する企業も増えつつあるように思います。ただ技術選定をした当時の2017年頃における関数型言語の性質を持つ上記のような言語の中で、 Scala はプロダクトでの採用実績も比較的多く、頭1つ抜けた存在だったのではないかと思います。

言語の表現力が高く、ドメイン自体が複雑な事業領域に適している

金融という領域は複雑なドメインであることから、この点でも一定の考慮をする必要があります。 Scala は関数型言語の特徴とオブジェクト指向言語の特徴を併せ持つマルチパラダイムの言語であり、型システムの強力さに加えて言語自体の表現力の高さがあります。

表現力が高いことは表裏一体で、コードの書き手に左右されるという側面もあり、必ずしもメリットではないと考えています。ただとりわけ複雑な業務ドメインで、少数精鋭の組織で取り組むための開発言語としては、有利な特性を持っていると考えていました。

私自身に Scala の開発経験があり、ハマりどころを想定できた

Funds というサービスに取り組む以前にも、業界のサービス開発をしてはいましたが、 Funds は本命のサービスでした。

スタートアップでは、プロダクトの開発が終わらずサービスが開始できないというのは、企業としての生死に直結します。当時もそのような要求があり、短期間でプロダクトをリリースまで持っていく必要がありました。このようなフェーズでは言語をフラットに評価したうえで判断することは難しく、自分たちのその時点のケイパビリティの中から実現可能な選択肢の中から技術を選ぶ必要があります。

当時の私は CTO というわけではなかったものの、開発をリードする立場ではあり、以前の在籍企業でも0→1でのプロダクト開発経験があった Scala を採用しました。

技術軸がバラバラなメンバーの中での技術選定の難しさ

実はこの時の採用判断について、スムーズに意思決定できたわけではありません。 Scala という技術は当時もマイナーでありましたし、もともと Scala が使えるメンバーの集まった開発組織というわけではなかったので、チームの中でスムーズに合意を得られたわけではありませんでした。

それでもなお、何かしらの意思決定をしてプロダクトの開発を進行させなければならず、止むを得ず Scala を選択して開発することにしたのですが、当時としては難しい問題であったことは確かです。

2024年現在の Scala という選択肢

引き続き使われている企業もあれば、転換を図る会社もある

2017年当時の情勢でいえば、アドテクや FinTech 関連の事業を営む一部の企業で採用されており、弊社以外でも一定新規採用企業がある状況でした。

個人的な観測範囲では、2024年現在でも引き続き Scala を使用しているものの、新規に Scala を採用する企業は少なくなっているほか、 Scala を採用している企業の中でも、 Scala エンジニアが採用できないという理由から、 Scala 以外への技術転換を図っている会社もいるようです。

当時と比べて代替的な選択肢は増えている

Scala の言語機能自体は強力であり、 Scala にしかないアドバンテージもあるとは思っています。

ただし当時と比べ、 Better Java のようなポジションとして Kotlin の台頭や、 Java 自身の言語機能の拡充により、 JVM 上で動作する開発言語としても以前と比べて Scala を積極的に採用する理由は弱くなっていると感じています。

Scala でも LLVM ベースでネイティブコードを生成できる Scala Native もありますが、プロダクションで採用するランタイムとしては、やはり JVM が標準的な選択肢だと思います。

企業としてマイナーな開発言語を選ぶ利点

マイナーな開発言語での経験を持つ方は、経験の幅も広いことが多い

あくまで一般論としての話なのですが、Scala を含むマイナーな開発言語での開発を経験しているエンジニアの方であっても、プログラミングをその言語から始めるような方は決して多くはないでしょう。その言語以外のよりメジャーな開発言語による開発も経験されていることが多く、一定の経験を積んでいる方が多いのも特徴です。

採用する開発言語に関心のある開発者を積極的に採用しやすい

Scala を含め、マイナーな開発言語をプロダクト開発に採用している企業が多くない中で、 Scala を中心に使っているということは、 Scala で開発をしていきたい方を採用しやすいという特性があります。

また逆の視点で見るとマイナーな開発言語を組織として採用することで、 Scala での開発に携わっていきたいと考える方々に、雇用機会を創出することができます。

開発言語の選定による開発組織作りの制約

採用ターゲットとなる開発者の母集団が少ない

Scala に取り組む開発者の数が少ないことは事実です。そのため、経験者を採用しようとするならば、自ずと採用市場の中でも小さな母集団の中から開発者を採用する必要があります。

もちろん、Scala で開発できる人材を採用する企業自体も多くはないため、需要と供給の双方が小さいという状況ではあります。

マイナーな開発言語で大きな開発組織を作ることは難しい

弊社の場合は Scala を利用しているのですが、 Scala 自体がメジャーな技術であるとは言えません。そのため経験者を集めてくるということは難しく、自社で人材を育成することが必要になります。

一方で大企業であればともかく、スタートアップではそこまでの余力があるわけではありません。また大企業であったとしても必ずしも指導者がいなければ、現実的に実現することは難しいでしょう。

少数精鋭の組織を志向する場合、多くのメンバーを集める必要がないため大きな問題にはなりませんが、数十名以上の開発者を擁する組織では、一定の課題があるように感じます。

開発言語の経験は採用基準の1つにすぎない

特定の開発言語、とりわけ Scala による開発経験は唯一の採用基準ではありません。弊社の事業に関心を持っていただけたり、「開発組織のバリュー策定から4年経っての振り返り」にある開発組織のバリューのような組織としての考え方に共感いただける方を求めています。

そのため Scala での開発経験があるからといって、必ずしも弊社にマッチするとは限りません。こうした中で母集団が小さいと、結果として人材採用が難しくなるのは明らかなことかと思います。

マイナーな開発言語の開発者を増やすために

実のところ私自身、 Scala に対して強いこだわりがあるわけではないのですがないのですが、 Scala を採用する企業が増えるかどうかはエコシステムの将来にも影響することであり、この観点から Scala を採用する企業やプロダクトが増えてほしい、という気持ちはあります。

Scala が使える開発者の市場価値を上げることで、 Scala による開発に参入するエンジニアを増やしていきたい

開発者にとってエンジニアとしてはキャリアを築く上でも、取り組んだ開発経験により、次のステージのキャリアに活かせることが重要でしょう。

転職市場においてマイナーな開発言語の経験では、いざ転職をしようと考えたとしても、その開発経験が活かせないということも起こりえます。これは Scala での開発に限らず、弊社での経験がその後のキャリア形成にとって有利な経験を築けようにしたい、というマネジメントとしての意識もあります。

この観点で Scala という言語を捉えたとき、Scala を使用している企業が決して多いとは言えません。 Scala を採用する弊社としては、 Scala を利用するエンジニアや企業が増えていくことが望ましいと考えています。

このとき Scala による開発経験がソフトウェアエンジニアと経験値として付加価値になるのであれば、 Scala でのアプリケーション開発もチャレンジしてみようと考えやすくなるのではないか?と感じています。

実際、 Scala による開発ではオブジェクト指向的なパラダイムと関数型的なパラダイムが両立するものであり、ほかの開発言語による開発においても一定のアドバンテージはあるものと考えています。

コミュニティ自体に貢献することで人材の維持に貢献したい

開発言語として Scala を選定して7年ほど経つ中で、 Scala を使用する企業も数としては減りつつあるのが現状です。実際にプロダクトを開発する企業の中でも、新規の Scala エンジニアが採用できないので Scala 以外の技術を採用するという声を聞くことがあります。

スタートアップである以上、開発としてまだまだ貢献できることは限定的ではありますが、エコシステムを支えることは、巡り巡って弊社にとっても利益につながると考えています。

弊社としては微力ながら、数年前より Scala のカンファレンスである ScalaMatsuri でのスポンサーとして支援させていただいています。

一方で、コミュニティやエコシステムに対し、まだまだ十分に貢献できているわけではないという課題意識もあります。弊社自体のビジネスを成長させ、利益創出をしていくことで、長期的には技術コミュニティに対しても還元していくことができるとよいなと考えています。

まとめ

サービス開発における技術の選定は、その技術と共に生きていくこと

少し前に Scala をメインの開発言語として採用する他社の CTO の方とお話しした時に、「引き続き Scala を使っていく」という話を聞き、少なくとも弊社だけではないのだと安心したこともありました。

Scala をメインの開発言語として採用し、実際に開発したプロダクトを運用している弊社でも、今後も Scala を使用し続けていく方針です。

持続可能な開発を実現しようとするときに、こうしたマイナーな開発言語を選択した場合、開発言語の命運に左右されることになります。一定の課題もありますが、ある種この選択を正解にできるように取り組んでいければなと考えています。


前回までの記事はこちら


最後に

恒例の内容ではありますが、人材募集についても触れておきます。

人材募集について

現在募集中のポジションについてはこちらです。もしご興味のある方は、ぜひご連絡いただけると嬉しく思います。

Scala での開発に関心のある方へ

今回お話した Scala での開発に携わっていただくサーバーサイドエンジニアについてはしばらくポジションをクローズしていましたが、2024年7月現在、あらためて募集をしているので、もしご興味のある方はご覧いただけると嬉しいです。

その他の採用情報

ファンズの採用に関する情報については、以下の内容もご覧ください!


この記事が気に入ったらサポートをしてみませんか?