質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

使用言語の選択について

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,848

Hiroooo

score 54

現在キュレーションメディアのようなものを作ろうとしていて、サーバーサイドの言語選択で悩んでいます。
具体的にはPythonかNode.jsかです。

プログラミング初心者なので、自分でいろいろ調べてみてわかったことは以下のようなことです。
古い情報なども含まれていて、現在とは異なるものもあるかもしれませんが。

Pythonのメリット
より少ないコードで書くことができる
エラーなどを発見しやすい
誰が読んでもわかりやすく、メンテナンスしやすい

Pythonのデメリット
Node.jsと比較すると遅い

Node.jsのメリット
処理速度が速い
大量の同時アクセスにも対応できる
よりスケーラブル

Node.jsのデメリット
ネストがすごい深くなる可能性があり、可読性が低くメンテナンスしにくい
(追記、最新版ではネストが深くなるのは克服できるているらしい)

上記が自分が調べた内容ですが、これ以外にメリットデメリットはありますか?
また、東南アジアでリリースする(ネットが極めて遅い)サイトで、月間PVが1000万を超えるようなことを想定する場合、どちらがおすすめでしょうか?
個人的にはスピードは非常に大事なので、Node.jsがいいのかなと思いつつ、RubyやPythonに比べて流行っていない気がするので、質問させていただきました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+3

どちらがおすすめでしょうか?

Nodeでキュレーションアプリを運用してみて - SSSSLIDE

上記事例を見ますと、どちらか一方ではなく、使い分けていますね。

クローラーや、言語処理とリコメンドのエンジンは、
(おそらく機械学習のライブラリが充実してるから)Python、
アプリ向けAPIは(おそらく早いから)Node.js、と併用されています。

これは「マイクロサービス」の考え方で、各言語で得意なことをやらせて、
小さなサービスを組み合わせて、システム全体を構築する手法ですね。
ただ一方で、両言語を習得して、別々にメンテナンスする負荷もあります。

ご質問からどちらか一方、という考えが強くうかがえましたが、
採用するかどうかは別に、選択肢を多く持つのは有益だと思い、ご参考までに。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/09 22:16

    ご回答ありがとうございます。
    言語を使い分けているところも結構ありますよね。
    使い分けも大切だろうとは思っているものの、自分でやるにしても、外注するにしても、現状2つ以上の言語を使うのは難しそうだなと思っていて、一旦1つにしたいという考えが強いです。

    一旦Node.jsでやって途中からPythonなどを付け加えていくというのもありそうなので、参考にさせていただきます。

    キャンセル

+3

LLman さんの回答で充分だと思いますが、

Node.jsのデメリット 
ネストがすごい深くなる可能性があり、可読性が低くメンテナンスしにくい 

Javascript のメリット・デメリットについては、このように単純なものではありません。他の言語と異なる点がたくさんあるの(ex. オブジェクト指向なのかどうなのかもあやしい→オブジェクト指向って本当に良いことだったのかを考えさせられる)ですが、その一つ一つにメリットとデメリットがあります。
そして、「ネストが深くなる」→「可読性が低くなる」という因果関係も単なるプログラマの慣れの問題だと思います。システムコールを呼ぶ毎に性能問題を気にするくらいのシニアプログラマからみると、Javascript ほど気持ちよく書ける言語はありません。新しく導入されたネストを少なくする仕組みは単に経験の少ないプログラマに対して敷居を低くするためだけの子供だましにしか思えません。
もともと、「シングルスレッド非同期プログラミング→ネストが深くなるけど、並列処理に対して問題が簡単になる」というメリットがあったのですが、うわさの「ネストを少なくする仕組み」を使うと、そのたびに「これは元の形に翻訳するとどうなるんだっけ?」というのを考えて使うことになり、実はあまりうれしくありません。そのプログラムを初めて見た人に対してちょっととっつきやすくなるくらいの効果しかありません。スレッドがシステムコールに対して同期的に動くことの性能問題が気にならない人には Javascript のメリットはわからないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/10 04:19

    国内外のページを読んでなんとなくわかったような感じの質問失礼しました。
    いろいろ奥が深いことはよくわかり、その辺もしっかりわかるように勉強していきたいと思います。

    ありがとうございました。

    キャンセル

+2

失礼ですが、こんな意見と同じだと感じました。

「これから総合格闘技をしようと思います。
柔道と空手とどちらがおすすめですか?」

自分がどちらが向いているかが大事だと思いますし、学ぶのを片方のみと限定するのはあまり得策ではありません。

後々双方を学ぶことを覚悟した上で、軽い入門書を書店でめくってみてどちらから先にやるか決めるのが良いかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/09 22:32

    はい、おっしゃる通り、そのような質問に近いことは承知しています。
    ただ、柔道にはどんな人が向いている、空手にはどんな人が向いている(適当ですが、例えば柔道は体幹がしっかりしていて握力が強い人、空手は俊敏性がある人)などあると思っていて、そのようなことが少しでも聞ければなと思っていました。

    もちろん自分の好みや向いている方を自分で判断することは大事だと思いますが、現状知識がなく周りの方の意見を聞いてみたかったです。

    おそらく、こんな質問するんじゃねーよと多少不快に思われたのかと思います。
    失礼いたしました。

    キャンセル

  • 2016/10/09 22:41

    不快ではありません。

    Hiro14さんがどのような能力の人かわからないし、実際に才能のようなものは本人でもわからないだろうとおもいます。ただし、それぞれのどちらかの世界で上位を目指していくわけではないので、選んでしまうこと自体が無意味なのです。

    それより大事なのは時間をかけて、プログラムを始めることです。そこに迷うことはすごくもったいないという思いがあります。

    キャンセル

  • 2016/10/10 04:15

    現状私に何も能力はありませんので、リリースする国のネット環境や想定PV数などを大まかに記載させていただいていました。
    迷う時間はもったいなく時間をかけてプログラムを始めることの方が大事というのは、おっしゃる通りだと思います。
    これからどんどん進めていきます。

    キャンセル

+2

結論はLLmanさんと同じです。
どっちも良いからどっちも使おう! もしくはなんとなくで決めて良いです。

Node.jsで実装のパフォーマンスを出すためにはAltJSを覚える事が必要不可欠なので若干敷居が高いです。
汎用的なライブラリが優れているので極まったNode.jsは万能です。

Pythonは書きやすいですし、速度が足りない困ったという場面では奥の手が使えるので先にこちらを勉強するとやりやすいかと思います。
機械学習回りのライブラリが優れているので、そちらに少しでも興味があるならPythonは扱えるべきです。

Node.js: 大量の同時アクセスにも対応できる

https://www.techempower.com/benchmarks/
古今東西のフレームワークの捌けるアクセス数ランキングです。

上位層にPythonは十分食い込めるポテンシャルを持っています。
同じNode.jsでもsails.jsでは秒間500アクセス数しか捌けません。

遅い遅いと叩かれるRubyもJavaのバイトコードに変換して速度を稼ぐJRubyのような必殺技がありますし、
同様にPythonにもPyPyを使ってC言語やJavaのバイトコードを経由して爆速に動かす切り札があるのです。
Lisp使いも普段の業務をLispで書いてJavaのソースコードに変換して納品している…と言語間の速度を覆す工夫は至る所にあります。

さて、あなたの考えるキュレーションメディアは秒間何アクセスを叩き出す事を想定していますか?
上記ベンチマークでほぼ最下位として紹介されているsails.jsですが、一般的な感覚では頭おかしい程捌けます。
秒間500アクセスをピーク時に求められるサイトを、ピーク時3時間(毎秒500アクセス)、平時毎秒250アクセスと仮定して1日2,430万PV、月間で計算すると7億PVとなりますからね…!

アドセンスを入れると1PVあたり0.2円程度なので、7億PVもあれば月収1000万円超ですね!
浮いたお金でサーバーをアップグレードして強引に動かすのと、全部高速な言語で置き換えるのではどちらがコストが掛かるのでしょうね…?

…というわけで、言語の導入時に速度を気にする場合、
そのくらいPV数が見込めるくらいのサイトになってから悩んでも遅くはありません。

Python: 簡潔に書ける

スタートアップではでかいメリットです。

ただし素のJavaScriptは単なるゴミですが、こちらにもAltJSという奥の手があります。
本番環境へデプロイを行う直前にコンパイルしてJSファイルにすれば速度面でも問題は出ません。

例えばCoffeeScriptならPythonとほぼ同レベルの書き心地ですし、
それを更に改良したLiveScriptはPythonを完全に突き放しています(と勝手に思ってます)
型チェックを取り入れるならばTypeScriptやPureScript等があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/12 17:35

    自分で調べて表面的なことしかしらなかったので、それぞれに処理速度を速くする方法やコードを書きやすくする方法があるなど知らなかったので勉強になりました。
    また、具体的に秒間アクセス数の試算もしたことがなかったので、しっかり考えてみたいと思います。
    今は東南アジアで活動しているので、ネット環境が非常に悪く、少しでも速くすることがユーザーの利便性に大きく影響するなという感覚だけだったので。

    いろいろと教えていただきありがとうございました。

    キャンセル

  • 2016/10/13 16:59

    > 今は東南アジアで活動しているので、ネット環境が非常に悪く
    サーバーを立ち上げる時はVPSやクラウドを利用したほうが良いんじゃないかと思います。
    想定するクライアントの近く(想定顧客が日本なら日本やシンガポール等)に設置しましょう。

    どんなに優れたサーバーを用意しても、サーバーがニューヨークにあれば日本から通信すると0.2秒以上のロスになります。
    光は1秒間に地球を7週しかできないので、光は遅いのです。

    例えばConoHaのようなVPSサーバー、AWSやGoogleCloudPlatformのようなクラウドのサーバーを借りる事が出来ますが、
    物理サーバーの設置場所(リージョン)が選択出来るようになっています。
    ConoHaならば月額900円で1台借りられるので私もポコポコ借りてます。
    小さいシステムならキビキビ動作しますよ。

    キャンセル

  • 2016/10/14 16:24

    ありがとうございます!
    サーバーに関することなど本当に知識がないので、このようなアドバイス非常に助かります。
    参考にさせていただきます!

    キャンセル

+1

私ならメンテナンス性がデメリットにあがっているならばそれは完全に除外します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/09 22:07

    ご回答ありがとうございます。
    さらに調べていたところ、ネストが深くなってしまう点については最新版で解消されているようでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる