PythonでWebサービスを作るために色々な事に遭遇したり、調べたりしたので、それをシェアするためのポストです。色々とやってみないとわからない事があり、知ってれば無駄な時間を大量に使う必要のなかった落とし穴があるので、それをシェアしようという趣旨です。
貴重な時間を浪費するのを避けるためにも、次にやる人のかたの参考になれば幸いです。
どの言語を使うか
まず言語選びです。ウェブサービスを作る場合には、言語を選ぶ必要があります。可能性としては、C#、Java、Ruby、PHP、Pythonなどがあると思います。最近はサーバーサイドのJavaScriptやLinuxで走るSwiftなどもあります。色々ありますし、どれを使っても一緒と思いそうですが、ライセンスや言語の性質でその後に大きく影響するので、実はとても重要です。
まず、C#はLINQもあり非常に使いやすいのですが、WEBサービスとして公開する際にはライセンスの問題が発生するので注意が必要です。最初からユーザーにライセンスのコストを転嫁できる立場の強いWEBサービスなら別ですが、最初は無料でユーザー数の獲得に力点を置いているような場合には(特に最初は)コスト割れになると思われるので、使わない方が無難です。ちなみに私は簡単便利なLINQは大好きです。社内システムなどで使うようでしたら問題なさそうです。
Javaは開発が重たすぎるので、やめた方がいいという意見も多いです。また、世の中で活躍している有名なWEBサービスはスクリプト言語またはライトウェイト言語と呼ばれているRubyやPHPを使っているところが多いようです。Moneyforwardとかfreeeとか。実際に調べてみると、良いフレームワークやデータベースとの接続を楽にするOR Mappingは随分改良されているようで、Javaも選択肢の一つなのではないかと思いました。
C#やJavaなどは静的型付け言語と呼ばれていますが、静的型付け言語の良いところは、コンパイルする時に型に関するエラーを見つけてくれるので、バグが入りにくいというのがあると思います。実際にiPhoneなどの開発に使われる言語はSwiftですが、これは静的型付け言語です。AppleがSwiftを静的型付け言語にしたのは(統計的にバグが少なくなるなどの)理由があるはずです。
ライトウェイト言語(LL)では、RubyやPython、PHPなどがあります。私は一応全部試してみて、今回はPythonで行こうと決めました。Rubyは日本では大手のWebサービスにも使われておりメジャーなのですが、Googleの検索件数などから逆算した割合だと、世界ではPythonの方が圧倒的に使われています。私の調べた範囲なだけですが、使っているプログラマーの数が多いからかライブラリーの数も豊富です。画像を使ったWebサービスでは必ず必要なPILLOWや、CSVの読み込みや書き出しの処理をするcsv、エクセルやPDFの処理など多数のライブラリーが存在します。きっとRubyやPHPにもあるのでしょうが、海外でのシェアはPythonの方が圧倒的です。
PHPも多くのサイトで使われているし候補ではあったのですが、他の言語では関数やプロパティをA.Bというふうに書きますが、PHPではA->Bという風に書きます。2文字で打ちづらいキーで書かなくてはいけないのと、見た目が何となく好きになれなかったのでやめました。ちょっと本質的な理由ではないですね。
動的型付け言語はバグが多くなり、メンテが大変か?
静的型付け言語の方がバグが発生しにくいと思われるので、システムが大きくなる予定だったら、メンテナンスのことを考えてJavaを使った方が結局効率がいいのではとは思いました。RubyやPythonなどの動的型付け言語は最初は楽ですが、あとでバグ取り地獄に入ってしまうのだったら、開発の後半でシステムが大きくなっていくほど長い時間がかかりそうに思えました。最初が急坂でだんだん傾斜が緩くなっていくか、最初がゆるいけど、あとで段々きつくなっていくかのどちらにするかのイメージです。
ただ、現状を見回すと急成長しているWebサービスは動的型付け言語でやっているっぽいです。私の見えていない何かがあるのかもしれないと思い、とりあえずその流れに合わせてみることにしました。
エディタ、IDE、開発ツール
最初はATOMを使っていたのですが、開発が本格的になってからPycharmに変えました。
ATOMは無料ですし、入力補助のモジュールもあるのでテキストエディタとしては大変優秀です。ですが、変数のスペルミスなどは事前に見つけてくれないので、実際に走らせてみるまでわかりません。
ATOMに限りませんが、テキストエディタで開発すると、なんでもテキストエディタとターミナルからコマンドを使ってやらなくてはいけないので、プログラムが走るまでの環境をどうやって作るかとか、ツールのインストールの仕方とかとてもよくわかるようになります。私も、ATOMで開発を始めたおかげで、Linux(やMaxOS)がどうなっているかだいぶ勉強になりました。
最初は無料でいいのですが、本格的にやることがわかったら無料でも有料でもIDEを使った方がいいと思います。私の場合はPycharmを個人ライセンスで買ったので89ドルでしたが、スペルチェックのミスを見つけるのやリファクタリングはエディタではできないので、それだけでも十分に元が取れます。
まだ試していない機能がたくさんあるのですが、デバッグでブレークポイントも設定できるようですし、IDEにお金を出す価値は十分すぎるほどあります。
フレームワーク
フレームワークはPythonでは一番機能が充実していると言われるDjangoにしました。PythonではそのほかにもFlaskやPyramidなど色々なフレームワークがあるようですが、Djangoが一番機能が充実しているようです。実際、ORMや画面遷移など、とても便利です。
ORMは何を使ったらよいか。
ただ、DjangoのデフォルトのORMは書き方も直感的で便利ではあるのですが、データベースを動的に複数作りたい場合に、構造的にうまくできなさそうなのでやめました。DjangoではDBへの接続を設定ファイルに書いておかなくてはいけないのですが、私が作ろうとしているのは、新しいユーザーがウェブサイトから登録した場合に、個別に新しいDBを作る設計にしたかったので、接続文字列をログインのたびに動的に変更できない(ように少なくともOfficialのTutorialではそう見えた)Django ORMはやめて、sqlalchemyというものを使いました。
sqlalchemyはFlaskやPyramidなどのPyrhonの他のフレームワークで使われているORMなのですが、Djangoでもインポートして使えます。
データベースは何を使うか。
Djangoのデフォルトはsqlite3なのですが、使おうと思ったプラットホームのサービスのHerokuでは、sqlite3は使えなくて、Postgresqlです。その他にMySQLという選択肢もありますが、私にはMySQLでもPostgresqlでもどちらを使っても得られる機能は同じに見えました。sqlite3はデータがファイルなので管理するにしてもわかりやすいのですが、パスワードをつけることができないのでユーザー認証ができず、やめました。
プラットフォームは何を使うか
Windowsサーバーはライセンス料が発生するので論外でしょう。
次に、Linuxを使うかMacを使うかですが、普通はLinuxのどれかのバージョンを使うのでしょうが、私は開発をMacでやっているので、WebサーバーもMacにしました。やっぱり環境の構築とか色々覚えるより、使い慣れている環境を使った方が一々調べる手間も減ると思ったので、ハード代くらいは浮くと思ったのです。ハード代といってもmac miniなら5万円くらいで買えるので、Linuxのハードを買ってもそれくらは普通にかかりそうです。
サーバーをローカルで立てるか、クラウドにするかも考えたのですが、今の所は、事務所に実際のサーバーを置いて運用する予定です。最初はHerokuを使おうと思っていたのですが、色々試したところで、動的にアップロードした画像ファイルをHerokuには保存できないということがわかったのでやめました。画像ファイルが保存できないなんて、領収書の保管が必要な私のサービスでは致命的でした。
ちなみにアップロードした画像ファイルはAWSに保存するようにするのが一般的なようなのですが、それだったら最初からAWSを使った方がよくないですか?
以上、色々と言語の選定から、フレームワーク、データベース、環境構築などに渡りつらつらと書きました。新しくWebサービスを立ち上げる際に沢山の選択肢がありますが、その中からどれを選ぶかなどの参考になれば幸いです。