この記事を書いた人
インターノウス株式会社 技術顧問 伊澤 伸
楽天「ぴたっとアド」「ぐるなび」「びあ」などのwebを担当。元株式会社ノボットCTO。
1996年日本オラクル株式会社。2004年ネクストコム株式会社(現三井情報株式会社)に参加後、米国において会社を設立。オフショア開発部隊を率いて「ぐるなび」「びあ」などのWEBリニューアルを担当。
2007年マイクロアドのアドネットーク向けに行動ターゲティング広告システム、不正クリック排除システムを構築。2008年楽天株式会社において、 「ぴたっとアド」の立ち上げを完了させた。2009年株式会社ノボットに参画。CTOとしてシステム基盤を構築し、ノボットバイアウトに貢献。
世の中にはプログラミング言語の解説記事が溢れかえっていますが、実務的にはその言語はどのように使われているのかということを紹介している記事は少ないと思います。
そこで開発現場から見た言語トレンドや特徴、案件の傾向などについてご紹介してく記事を書いていきたいと思います。最初はPythonからはじめましょうか。
Pythonは1991年のリリースですから、最新の言語というわけではありません。私の記憶ではPythonという言語があるということは知られていたものの、案件で使われることはほとんどなかったと思います。Perlの後継としてシステム周りで使っている人がいるかなぁくらいだったPythonが案件の内容として再浮上してきたのはビッグデータブームとそれに続くディープ・ラーニングブームの頃からだったと記憶しています。
1. Pythonのプログラミングパラダイム
Pythonはパラダイム的にはよく言えば「マルチパラダイム」というか、割と無難な感じの悪く言えばこれと言って特徴のない言語です。Haskellの「純粋関数型プログラミング言語」みたいな強い個性はないんですね。「よく使う言語はなんですか?」と聞かれて「Haskellです」と答えれば「ほう!」という感じですが、「Pythonです」だと「ふーん」で終わりですね。できるからと言ってドヤ顔できないみたいな。純粋関数型プログラミング言語!なら特に「純粋」の辺りが厨二病的にシビレますよね。プログラミング言語はかくあるべしみたいな議論を吹っかけてきそうで。Pythonにはそういう尖ったこだわりは感じないですね。「パラダイムなんてなんぼあってもいいですからね」と言ってそう。
2. Pythonの言語仕様
特徴のない言語と書いてきましたが、構文に関してはひとつ特徴があります。それはインデントが構文として意味を持つということです。Wikipediaで紹介されているコードを引用して説明します。例えばCで書いたら以下のような関数があるとします。
int factorial(int x) { if (x == 0) { return 1; } else { return x * factorial(x - 1); } }
出典:Wikipedia
Pythonで書いたらこうなります。
def factorial(x): if x == 0: return 1 else: return x * factorial(x - 1)
出典:Wikipedia
中括弧{}がなくなってインデントがその代わりにスコープを示します。defの次行のifはひとつインデントされてますから、defの中にあるという意味です。YAML的?いやYAMLの方がPythonの影響を受けているのかも知れませんね。
うーん、これはどうでしょうかね。中括弧の位置とかはC++とかJavaのプロジェクトでコーディング規約を作るときは宗教戦争が勃発しますよね。
例えばさっきの関数であれば
int factorial(int x)
{
if (x == 0)
{
return 1;
}
else
{
return x * factorial(x - 1);
}
}
こういう風に書いたらオールドスクールっぽいですよね。この例だと間延びした感じですけど、if節の中に長々と書く人はこっちのほうがいいかも知れません。{の後ろにコメント書いたりとか。僕みたいなおじさんはこういうスタイルで書きがち。Pythonってこういう自分が思う「美しい」コーディングができないのでフラストレーションが貯まるというか「カッコ悪い」んじゃないかと思ってしまうんですよね。
Pythonの場合はスタイルも何もインデントが構文なんだから誰が書いても同じになります。だから他の人が書いたプログラムも読みやすい、すっきりしているというコンセプトなんでしょう。
3. Pythonのライブラリ
Pythonをdisった感じになってしまいましたが、それではなぜPythonが最近注目を浴びているかというと豊富で強力なライブラリを簡単に使うことができるからだと思います。
以下のようなライブラリがあります。
NumPy | 行列演算ライブラリ |
matplotlib | グラフ描画ライブラリ |
pandas | データ解析 |
Scikit-learn | 機械学習 |
Pillow | 画像処理 |
pickle | データシリアライズ |
scrapelib | スクレイピング |
参照:ウィキペディア
俄然コーディングスタイルなんてどうでもいいから使ってみたい!という気持ちになってきますね。Pythonという言語に魅力があってその言語で記述してみたいというよりも、まず使いたいライブラリがあるからPythonを使う、というシチュエーションが多いように思います。ビッグデータ解析とかディープ・ラーニングの解説本だとまずPythonのインスールから始まることが多いです。
4. Pythonの開発環境
人気のライブラリを挙げましたが、これを見ているとやはりデータ解析系が多いですよね。データ解析なんて僕とは関係ないやと思われるかも知れませんが、最近ではどんな分野でもログを多くとって、ユーザの行動解析とか販売データの傾向とか調べたり、機械学習に学習させて新しい機能を作るとかデータ解析のニーズはかなり多くなってきています。
データ解析のワークフローだと、生データをゴニョゴニョ加工して解析して結果をグラフにしてみたり、学習させてみて結果を試したり、またパラメータを変えて解析するみたいなことを繰り返していくことになります。そうした場合に便利なのはREPL(Read-Eval-Print-Loop)ですよね。「対話的実行環境」とも呼ばれますけど、入力したものをすぐに実行して試せる環境です。JavaやC++みたいにIDEでガッツリ書いてビルドしてデプロイするのはすぐに試してまたちょっとだけ直すみたいな作業に向いてないですからね。
PythonのREPLは標準でもついてきますけど、さらに高度に便利にしたのがJupyter Notebookです。
出典:Jupyter
Pythonの実行と結果をノートのようにまとめていけるので、すごく使いやすくなっています。一昔前なら数百万円する解析ツールでしかできなったようなことが、無料でできちゃうんですから便利な時代になったものです。
5. Python案件の現状
Pythonの案件についてはコロナの影響を特に受けていないと個人的に認識しています。自身のクライアントからはコロナ前と変わらず案件も出てきていますし、金額も落ちていないです。ただ、フリーランスで契約されたい方のうちスキルに自信がない方は、コロナで案件が減っているかもと想定されているようで、自身の受注金額を下げている方がいらっしゃいますね。フリーランスではない求人への応募も少なくなっています。いまは転職時期ではないと判断されている方が多いのかも知れません。Python案件に関しては特に市場が悪くなっていないので、積極的にフリーランスの案件にチャレンジしたり、転職活動をした方が良いと思います。逆に今がチャンスです。
6. まとめ
トヨタのプリウスという車がありますよね。この車はクルマ好きの方々からはあまり評判が良くないと思います。バッテリーを積む関係でちょっと腰高な印象ですし、ブレーキも回生ブレーキなのでちょっとだけ違和感があります。でもプリウスのパワートレーンは他の車とは別格の複雑な制御を行ってモーターとエンジンの出力を駆動力に効率良く変換していきます。複雑さだけではなくてプリウスのタクシーもあるくらい耐久性も優れています。
唐突にプリウスの話をしましたが、Pythonってなんだかプリウスに似てるなーと思います。ゴリゴリの開発者みたいな人たちからはちょっとカッコ悪い感じで思われてますけど、コーディングスタイルとかそんな些末なことに拘らないデータアナリストとかのイケてる人たちは強力なライブラリを使いこなしてサクサク実績をあげてるみたいな。まさにこう実用的な道具として使われる感じですね。
案件的にもPythonを道具として使うものがほとんだと思います。つまりPythonが使えるだけではダメで統計学の知識があったり、機械学習の経験を必要とするものが多いということですね。PythonにもWebサービスを構築するフレームワークがありますから、Pythonで構築されたサイトのメンテナンスみたいな案件もあることはありますが少ないです。もしあなたがプログラマを目指しているひとで、どのような言語を学ぶべきか決めようとしているならPythonではなくPHPやRubyにしましょう。最初に書いたようにPythonは言語仕様的にはあまり特徴がないので、後にPythonが必要になってからでもPHP、Rubyからは簡単に移行できます。