読者です 読者をやめる 読者になる 読者になる

タオルケット体操

サツバツいんたーねっと

どの言語を業務で使うべき?

photo by matt512

僕なりの選び方

まえおき

この記事で述べるのは仕事をする際にどういう風にプロジェクトで使う言語を選ぶべきかという話であって、どの言語や環境が優れているかとか、関数型言語で時空間がどうだとかそういうポエットなおはなしをするつもりはないです。そういうプリミティブな議論はQii…じゃなくて pplog が向いてるんじゃないでしょうか。

また、この記事の主旨はあくまで実務で効率厨をするための思考順序を書いたものです。初心者がどの言語を学ぶべきか? のような話については、この記事も参考にならなくはないでしょうけども ハッカーになろう も合わせて読むとモチベーションがいい感じにあがると思います。

選ぶ基準(優先度順)

どの環境で動かすか

はい。
Webでークラウドでーみたいな感じだったらここはあまり考えなくても良いのですが、弊社みたく組み込みっぽい製品も作る(僕はあんまり詳しくない)ところだとストレージやメモリの都合だったり、そもそもファイルの概念がなかったりとかで使える言語がめっちゃ限られたりすることがままあります。
超貧弱な環境であったり、SDKの選択肢がないような状況であればC言語一択になってしまいそうです。もうちょっと余裕がある環境であればlua, mruby, MicroPythonだとかも使えるかもしれません。

また、某Appleのためのアプリケーションを作るのであればObjective-CSwiftを使うのが自然ですし、Windowsであれば特に理由がない限り.NETが優れています。
そういった環境で別の言語やツールセットを使えるようなもの(Monoとか、TitaniumMobileとか)も存在しますが、何か特別にどうしてもそれを採用したいという理由がない限りは使わない方が良いでしょう。僕の観測した範囲だとそういったものは後々に技術的負債となってのしかかってきます。自然が一番。

でもブラウザであってもJavaScriptは書きたくない! ふしぎだね!

どういう製品を作るのか

上と少し重複しますけども、例えば複数の環境で動くGUIのアプリケーションを作りたいというのであればJVM言語が真っ先に候補に上がるでしょう。あるいは、チャレンジャーであれば最近オープンソース化した.NETも良いかもしれません。
その他、単体での処理速度が必要なのか、スケールさせたいのか、とにかく早く世の中に送り出したいのか、など、そのプロダクトを作る上で機能面で絶対に外せないものを上げていくと候補が絞られてしまうことがままあります。

選ぶ基準というよりも、ここら辺は制約に近い感じかもしれませんね。

作りたいものに適した機能があるか、向いているか

例えば、並列処理を超簡単に書きたい! とかだとGo言語のゴルーティンなんかはそれだけで選択肢に入るんじゃあないでしょうか。
あとはスケールさせて、障害に強いネットワークシステムを作りたいのであればErlangですとか。極力ランタイムでのバグの発生を抑えたい、そして早い言語が良い、という人は大体なんかOCamlを使っているような印象があります。
ちゃんと使ったことがない言語について無責任にアレコレ言うのはここら辺で辞めますけども、好き嫌いを越えて急所になるようなメリットを持った言語があるのであれば、それを使うのは良いことだと思います。というか、そういう向き、不向きを無視して自分の好きな or 知っている言語に固執して書かれたプロダクトというのはヤバい負債を抱えます。PHPブートローダを書いてはいけない(いましめ)

世の中で流行っている言語か

軟弱な意見でごめんなさい。でも知見の量が段違いですからね。

ただ、流行っているというのは単純なユーザの数が多いこととイコールではないです。間違ってもTIOBEのランキングだとか、アナクロな旧世代企業でよく使われている言語だとか、そういったノイズに騙されないようにしましょう。VB6やCOBOL
いわゆるサラリーマンプログラマーは頭数として数える必要はありません。情報を集めて、なんとなく空気を読むとどの言語が流行っているかわかるはずです(雑)。業界ごとの空気とか、StackOverflowの質問数とか、なんかそういう雰囲気を掴むといいんじゃないでしょうか。

言語マニアックなハッカーの間でしか流行っていない言語というのは、質はともかく、やはり情報量という点でちょっと厳しいものがあります。
また、ユーザ数が少ない言語というのは仕様に破壊的変更が加わりやすいという傾向があります。ただでさえ大変な製品作りをしながら日々変化する言語仕様についていくというのは、チームにその言語のコミッタがいるとかそういうレベルでない限りはかなり分の悪いバクチだと言えるでしょう。

どういうライブラリやフレームワークが揃っているのか

製品を作る上でコンセプトだったり、イノベーションを牽引するような部分はそもそも世の中に存在しなかったり、あるいは満足するようなものがなかったりするので自作するしかない、もしくは差別化のために自作するのが望ましいのですが、そうではない部分においてまで何から何まで自分で作ろうとするのは効率がよろしくないケースが殆どでしょう。

例えばサービスの内容をウリにするようなWebアプリケーションを作るのに、いちいちフレームワークやテンプレートエンジンの開発から始める人はあまりいないっぽい気がするので大体みんなPHPとかRubyとか使うとおもいます。
統計とか数理計算を通じて何か価値を届けたいというのであればRとかPythonを使う人が殆どだと思います。

優秀、あるいはその業界でのデファクトなサードーパーティのライブラリが存在するというのは、仕事で使う言語の選定においては超重要です。
効率も良いですし、メンテナンスコストも抑えることが出来ます。また、オープンソースであれば利用を通じた報告やプルリクエストなどのフィードバックは社会貢献にもなります。良い事ずくめですね、すごい!

ロマンに欠けますけども、本質的な部分以外にかけるリソースを極力削るというのは重要だとおもいますですはい。ロマンを追うのは家に帰ってからでもできますしね。

エコシステムが使いやすく、安定しているか

この項目について、言語談義をする上で軽視されすぎだと僕は密かに不満を抱いているわけです。

例えば、こういったエコシステムや文化がないことで「初心者向き」「楽」だとされている言語もあります。
長らくPHPJavaScriptが初心者向きの言語だとされていたのは、その言語仕様云々ではありません。
RailsでWebアプリを作ろうかなーと考えた初心者は、まずその情報量(まずはRubyのバージョンを最新にアップデートして、Railsのバージョンを確認して何を使うか選べ、次にgemでインストール、おいおいちゃんとGemfileを使えって。ちょっとまって! ちゃんとbundlerを使って仮想環境に分離しないとダメだと、なんでもかんでもグローバルにおいたらetcetc……)に圧倒されます。ファイルを全部アップロードしてしまえばそれでいい、みたいなものは、その場限りで考えれば確かに楽で、選択肢に入るでしょう*1

しかし、バージョン管理や依存性管理はまともに開発を仕様と思うのであれば必須です。rbenvもGemfileもbundlerも使わないカウボーイプログラマーがリーダーをやっているプロジェクトを見たことがありますが、まさに死屍累々といった惨状を呈していましたよ。

なので、中長期のスパンで開発することを考えるのであれば言語の文化やエコシステムは重要になってきます。
Webアプリであれば、頻繁にアップデートや破壊的変更が入り、古いバージョンのサポートが早々に打ち切られる言語も比較的許容出来ます。逆にアップデータを提供しないといけないアプリでは、あまりに頻繁なアップデートは嫌われます(特に企業向けのもの)ので、機能やセキュリティパッチに関わるもの以外でのアップデートは極力抑えたいところです。

そうでなくても、使いやすいデファクトのパッケージ管理にあたるシステムが存在しない言語や、アップデートのたびに依存性が問題を起こしてビルドがこけたり、コンパイルに何時間もかかるようなものを使ってしまうと、本質的ではないところで業務時間を浪費することになってしまい効率がよろしくないです。
ただでさえ色々やることがあるのに、開発環境を整えて、後から入ってきたようなメンバーも簡単にビルド and 実行が簡単に出来るようにするだけでいくつもの落とし穴を越えないといけない言語はツラ過ぎます。この点でGo言語はよく褒められていますね。でもGOPATHは難しかったです(小学生並みの感想)。

標準ライブラリが豊富で、安定していることも重要ですね。「この程度のことですら自作する or サードパーティを使わないと出来ないのかよ!?」みたいな言語を仕事で使うとイライラしか生まれません。趣味開発であれば逆に楽しくなったりすることもあるんですけどね。

致命的な欠点が存在しないか

流行っていると見せかけて、自分と同じような使い方をしている人間がほぼいない(参考: 普通のフロントエンドを書くのにHaxeをしばらく使っての所感 - タオルケット体操) だとか。そういうアレです。

他にもスクリプト言語のGILによる処理効率の問題だったりとか、あとClojureで直面したのが「まともなエラーメッセージが出てこない」でしょうか。
また、どの言語とは言いませんがあまりに書き方の自由度が高すぎる言語はメンバーやチームの運用次第で収集がつかなくなったりします。レビューとか出来ればいいんでしょうけど、現実は時に非情です。

何がどうデメリットとなるかは各人で事情が変わってくるでしょうが、業務を進める上で大きなボトルネックとなりそうな欠点を持つ言語は、他でどんなに良いメリットを持っていても避けた方が良いでしょう。
開発効率を向上させるようなメリットを持つ言語であっても、何か大きな欠点があったりすると今までの積み重ね全てが台無しになる可能性だって無きにしもあらずです。

利点の多さではなく、欠点の少なさで選ぶべきでしょう。

自分を含めて、チームに詳しい人間がいるか

いなければ勉強すればいいだけなんですけども、いるならそれに越したことはないです。
特に、勉強のし始めに書いたコードというのは往々にして動くだけのクソなので、必ず後々で技術的負債となります。

また短納期だったり、長く保守する予定のないプロジェクトであれば自分や中核メンバーが一番習熟している言語を選んでささっと完成させるのを優先させるべきだったりもするかもしれません。

ここに固執しすぎるのは危険かもしれません。使い慣れているからという理由でマグロの解体に果物ナイフを使ったり、万能だからという理由でリンゴの皮むきを牛刀で行うのはナンセンスです。そしてプログラミング言語というのは、料理道具と違って一度使い始めたらプロジェクトの終わりまで使い続ける(途中で変えるには大きなコストがかかります)覚悟が必要だということです。

好きな言語であるか

なんだかんだ言いつつも、お気に入りの言語があるのであれば多少の向き不向きがあってもそれを使うのが一番パフォーマンスを出せますよね!

それこそスーパーハッカーであれば全く流行っていない言語でも全てを自分で作って突き進みつつ一般人の数倍の速度で開発出来ますから、自由にやるのが最強なのでは感があります。

言語仕様

ンー…… まぁやっぱりラムダ式くらいはあったほうがストレスなくコーディングできますね。オブジェクト指向であれば、クラス指向であるほうが使える人間も多いので望ましいかもしれません。

個人的には言語仕様の理想だとか、シンタックスの好き嫌いだとかについては当然ありますけど、それなりにモダン, 進化が止まっていない言語であればどれも最低限の基準は満たしているとおもいます。
というか、ここに至るまでで大体選択肢は絞られてしまうので、純粋に言語仕様だけを比較する状況というのはあんまりないかもしれませんね。.NET系やJVM系の言語ならありえますが。

独りでやるなら好きなものを選べば良いですし、チームで開発するならば皆で話し合って決めるのがいいでしょう。

もしも貴方の同僚が「オブジェクト指向vs関数型プログラミングの壮絶な宗教戦争を終結させるぜ」とか言い始めていたら……頑張ってください。

Pythonのパラドックス (最近はHaskellのようですが)みたいなお話もあるので、採用戦略込みで使う言語を制限するのも有効なんだとおもいます。

まとめ

雑にまとめると

必須要件 > 向き不向き > 流行(サードパーティの質、量) > エコシステム > 欠点が少ない > その他もろもろ

という感じでしょうか。

「どの言語を使うべきか」みたいな議論になると必ず特定のパラダイムや言語に執着する人が出てきますけど、言語仕様の優劣以上の他に自分やメンバーの知識や力量感とかが色々あるわけで、そういうものを無視してなんやかんや言う人の意見に流されてしまうと後悔が残ったりしてしまいそうですね。戦略や先行きありきであれば別にPHP使おうが何使おうがいいじゃないですか。僕はPHP嫌なので反対しますけど、そういう各人の好き嫌いを含めた話し合いありきで決定していくべきです。
ただまぁ、汎用性の高さだったりとか、限られた環境に特化したヤバさみたいなそういう点での優劣は絶対的にあるので、そこを無視して「プログラミング言語なんて何を使っても同じ」とか言い出すのもアホな話です。

とにかく、「とりあえずJava」「ウチはVBしかやれないから」みたいな選定基準は論外ですが、「とにかくRustは超カッコいい言語仕様がヤバくてナウいので最強」みたいなドラゴンボール的最強議論も危ういよねっていうのを言いたさにこの記事を書いた感じがあります。言語仕様とかパラダイム以外にも大事なものってあるし、僕を含めてですが、技術者って現実的な落としどころで妥協出来ずに業務を破綻させたりさせがちですから。

初心者の方でありがちな質問として「どの言語をやるべきですか」みたいなものがあったりもしますが、とりあえず「目についた良さそうなものを全部やってみて好きなものを選べ」以上の解答ってなかなかないと思うんです。
そもそもプログラミングにしろビジネスにしろ、未知の領域に挑戦し続けるみたいな一面が少なからずあるものなので、そこでチャレンジに尻込みしたり既知の事柄に執着したりという人はどちらにも向いていないんじゃあないかなと思います。迷ってる暇があったらとりあえずやってみた方が早いというのは、界隈を限定しない初心者あるあるですね。

なお、良いと思った技術をバズらせるためにアジるような物言いをするっていうのは結構ありだと思う*2んですが、悪目立ちしている関数型なんちゃらとかの極一部はもうちょっとうまくやれないのかなーとか思っちゃいますね。

番外(自分のキャリアにとってプラスになるか)

例えば銀行でエスイーで業務知識が将来はピーエムとかだったりする場合は新しくて超イケてる言語を触るメリットはなさそうというか、そういうことをするとなんか難しいことをゴチャゴチャ言っててウザいみたいな理由で逆に干されたりする場所もあったりするわけなんですけども、逆にもっとナウナウな場所でウェイウェイしたい場合はVBとかジャバ(古いやつ)をやってると焦りで死んだりするわけです。

人生設計に応じて、ちょっとくらいエゴイスティックになったっていいんじゃないでしょうか。人間だもの。

おしまい。

*1:逆にそこらへんの管理をまともにやろうとすると、どちらも初心者に優しい感はなくなる(特にJavaScript

*2:僕の観測範囲で目立つところだとmizchiさんとかはうまくやってる例っぽさを感じる