C#の強み、或いは何故PHPから乗り換えるのか

85,902 views

Published on

C#ユーザー会 #30

0 Comments
52 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
85,902
On SlideShare
0
From Embeds
0
Number of Embeds
70,351
Actions
Shares
0
Downloads
0
Comments
0
Likes
52
Embeds 0
No embeds

No notes for slide

C#の強み、或いは何故PHPから乗り換えるのか

  1. 1. C#の強み或いは何故PHPから乗り換えるのか2013/06/11Yoshifumi Kawai - @neuecc
  2. 2. Self Introduction@仕事株式会社グラニ 取締役CTO現在PHPからC#に移行作業中、詳細は↓に.NET最先端技術によるハイパフォーマンスウェブアプリケーションhttp://www.slideshare.net/neuecc/net-22662425@個人活動Microsoft MVP for Visual C#Web http://neue.cc/Twitter @neueccJavaScriptにLINQ to Objectsを移植したライブラリ作ってますlinq.js - http://linqjs.codeplex.com/
  3. 3. C# EverywhereWindowsアプリケーションWinForms, WPFMacアプリケーションXamarin.MacWindows 8アプリケーションWindows Store ApplicationWebアプリケーションASP.NET MVC, ASP.NET Web APIクラウドWindows Azure, AWSゲームUnity, PlayStation Mobile SDKMobile(iOS/Android/WP8)MonoTouchMono for AndroidWindows Phone 8 App組み込み/小型端末.NET Framework Embeddednetduino
  4. 4. 広がる.NET互換環境というセッションがこないだありました:)http://www.slideshare.net/ufcpp/net-22681062知識の共有、コア部分のコード共有ここまで実用レベルで様々な環境に対応している言語は稀有揃えることで、会社では人が回しやすかったりとかも言語自体が非常に良いこれからお話します
  5. 5. Typing : Static vs Dynamicコンパイルでの検出ってやっぱ大事ユニットテストがあるからなくても大丈夫?→NOコンパイルエラーはIDEが「リアルタイム」に検出するリアルタイムは速さであり軽さ文法エラーを気にしながら書くなんて人間のやることじゃない。そんなの機械に任せよう。
  6. 6. IntelliSense is Help強力な入力補完(IntelliSense)IntelliSenseはドキュメントでもありヘルプでもある、IntelliSenseに出てこなければ自分のコードのほうが100%間違っている、という信用関係100%というのが大事で、言語仕様がそれを前提として組まれてないと実現できない。C#はVisual Studioの存在を強く考慮していて、IDEに優しい
  7. 7. Refactoring Part1完璧な設計など存在しない完璧な名前付けなど最初からできないそもそも仕様常に変わるし大事なのは、変えるべき時に、変えられること名前が不適切になったらすぐ変える、引数が増えたら整理するコードは負債である時が経てば経つほど、腐敗していく不適切な名前、ひたすら増えていく一方の引数対処しなければメンテナンス不能なスパゲティとして開発者を苦しめる
  8. 8. Type for RefactoringCtrl + .を押してその場で確実な名前変更コンパイルエラーを回って(エラー一覧ダブルクリックでその行に飛ぶ)書き換えたりも可一括置換でリネーム?危なっかしい!危なっかしいという感情は、手を止めてしまいませんか?その躊躇いが、負債を増やし続けますテストがあれば大丈夫だ、って?どのぐらいのカバレッジ?PHP用のIDEがあるって?実際、会社ではPHPStormを使っていて、手動置換よりは全然いいですが安心感はそれほどない(そもそも生連想配列の箇所とかも……)参照している別プロジェクトやユニットテストの名前なども、漏れなく完全に一括で置換される
  9. 9. Type is Documentメソッド名だけじゃ情報としては不十分引数の型、戻り値の型が合わさることによって、何をやっているかが伝わるそもそもメソッド名がイミフな場合にも適切でないメソッド名はなにをやっているのか読み取れない。スキル差のあるメンバー同士であったり、動作が変わったもののリファクタリング放置されたりなどで、不適切な名前のメソッドは出てきてしまう。その時に、最低限の信頼できる情報として、型があると助かるソースはドキュメント?いちいち呼び元のソース見に行ってコード本体を読んで型が何なのかを確認して、というのを延々とやらなければならない?馬鹿らしい!
  10. 10. Type Hinting/PHPDocsドキュメントっていうんならPHPDocsあるよ!そうだね型を書かないのが楽なPHPでそれ書くんなら、更にコンパイルしてエラーも検出してくれたほうがよりずっとイイね引数の型ならType Hintingがあるよ!そうだね実行時検出だねしかもintやstringなどには使えない更にデフォルト引数なし && null許可の場合は使えない指定できるのはarrayまでで、配列の要素の型まで指定できないしGenericsがないからね……あと、ただの配列と連想配列を区別したいよ……
  11. 11. Type is SpeedLightweight Languageと比較すると、重い、本当に?何が重いって?ローカル変数を宣言するのにいちいち型指定するのがダルいダルい。面倒。自明なことを、わざわざ意識させられるのは辛いそこで型推論!軽い、むしろ軽い自動生成と違って読みやすさにも寄与する(自動生成最強、ではない)型推論 = 静的言語と動的言語のイイとこどり!C#, OCaml, Scala, Haskell, F#, TypeScript型をダラダラ書くJ***と$地獄なP**は辛ぽよC#の推論能力はこの中では最弱!ですが、強すぎる能力はIDEの入力補完との相性が悪くなる。そのトレードオフを忘れてはならない
  12. 12. Debugger is Power21世紀にもなってprintfデバッグは絶対ない弊社ではPHPはPHPStorm+Xdebugでデバッガ動かしてますVisual Studioのデバッガはそれよりも更にずっと超強力マウスで現在のステップを強制的に動かしてifの内部に突っ込んで分岐した場合の挙動確認が容易変数表示見やすい(コレクションの展開など)ウォッチウィンドウでIntelliSense効くのが超便利(変数を代入して挙動変えるとかもウォッチで賄える)
  13. 13. C# is Lightweightリアルタイムエラー通知は速さIntelliSenseは速さ型情報は速さ型推論は速さ強力なデバッガは速さC# + Visual Studioはロケットブースターどれだけダッシュが速かろうと、人間の脚力には限界がある全力ダッシュの選手の横を軽々と追い抜いていく
  14. 14. The Evolution of C#Java/DelphiGenericsLINQDynamicAsync2002 C# 1.02005 C# 2.02008 C# 3.02010 C# 4.02012 C# 5.0
  15. 15. Language should be evolve言語は進化しなければならないC#はJavaのようなもの、の時代はとうに終わってます言語の進化は複雑怪奇にしたいからではない、楽させるための進化PHPも進化を止めていない、その点は偉い弊社はPHP 5.4を採用、ラムダ式(クロージャ,無名関数)をフル活用自社製LINQモドきライブラリで主に利用でも、継ぎ接ぎ感が否めなくて正直アレだとは思う進化はキメラ化とのバランス感覚が重要Anders Hejlsberg(C#設計者)はその点が天才的
  16. 16. C# 3.0 - LINQウェブアプリケーション = コレクション処理といっても過言ではないJOINをどこで行うか?DB上で全て整形されている?負荷分散のため、DB上でまとまっていないケースも少なくないLINQ to Objectsによるインメモリ結合普通にやると生産性落ちるしバグの元LINQ to Objectsを使えばSQLより、むしろ書きやすい
  17. 17. LINQ vs array_xxxPHPにもarray_filterとかあるよ?それだけじゃLINQの本質に迫れないLINQは各メソッドが合成可能WhereとSelectを組み合わせてリスト内包表記とか更にOrderByを入れてSkipWhileを入れてTakeを入れて…無限大に手が広がるしかもIntelliSenseとの相性が抜群にいいので、書いてて楽ちんラムダ式の書きやすさや匿名型なども寄与C#はIntelliSense指向言語
  18. 18. C# 4.0 - Parallel並列処理などもお手の物かつ簡単に記述できるバッチなどの重たい処理を高速に行えるforeachをParallel.ForEachに変えるだけのお手軽さ弊社内では実際30分→2分などの実例ありスレッドプールに投げるのも簡単ジョブキュー使うまでもないけど、後に回したいみたいな粒度のものは、それだけで解決するかも?
  19. 19. Everything is asynchronous例えばNode.jsで脚光を浴びる非同期処理I/Oを待っている間のスレッド消費がなくなり効率的でも、普通に書くとコールバック地獄ネストする関数、例外処理は?リトライ処理は?ライブラリでカバーするのも限界があるし書きづらいC# 5.0は言語構文としてasync対応したWebSocketにもフル対応先端テクノロジを常にキャッチアップ
  20. 20. Async : PHP vs C#// 並列通信用マルチハンドルを用意$mh = curl_multi_init();// 通信先ごとにCurl Handleを作り、それを $mh にaddしていく$ch_news = curl_init("http://dailynews.yahoo.co.jp/fc/entertainment/rss.xml");curl_setopt($ch_news, CURLOPT_RETURNTRANSFER, TRUE);curl_multi_add_handle($mh, $ch_news);// 同様に$ch_music = curl_init("http://magazine.music.yahoo.co.jp/rss/ALL/rss.xml");curl_setopt($ch_music, CURLOPT_RETURNTRANSFER, TRUE);curl_multi_add_handle($mh, $ch_music);// 同様に$ch_trend = curl_init("http://searchranking.yahoo.co.jp/rss/trend-rss.xml");curl_setopt($ch_trend, CURLOPT_RETURNTRANSFER, TRUE);curl_multi_add_handle($mh, $ch_trend);// せーので複数の通信を同時実行。whileで全て返ってくるのを待ちますdo { curl_multi_exec($mh, $running); } while ( $running );// 個々のXMLは、それぞれのCurl Handleを指定することで取得できる$rss_news = curl_multi_getcontent($ch_news);$rss_music = curl_multi_getcontent($ch_music);$rss_trend = curl_multi_getcontent($ch_trend);// 後始末curl_multi_remove_handle($mh, $ch_news);curl_close($ch_news);curl_multi_remove_handle($mh, $ch_music);curl_close($ch_music);curl_multi_remove_handle($mh, $ch_trend);curl_close($ch_trend);curl_multi_close($mh);// リクエストするClientの用意var client = new HttpClient();// 非同期リクエストvar news = client.GetStringAsync("http://dailynews.yahoo.co.jp/fc/entevar music = client.GetStringAsync("http://magazine.music.yahoo.co.jp/rvar trend = client.GetStringAsync("http://searchranking.yahoo.co.jp/rs// 非同期待機await Task.WhenAll(new[] { news, music, trend });// 個々のXMLは変数のResultを指定するだけで取れるConsole.WriteLine(news.Result);Console.WriteLine(music.Result);Console.WriteLine(trend.Result);PHPの例は以下のYahooのTech Blogより引用http://techblog.yahoo.co.jp/architecture/api1_curl_multi/
  21. 21. Template Engine RevolutionRazorASP.NET MVC3から採用されている標準テンプレートエンジン特徴は3つ閉じカッコ不要、全て@だけ圧倒的な見やすさと書きやすさ制御構文はC#そのまま変なテンプレート構文を覚えなくていい型付けされててIntelliSenseが効く入力ミスがあればエラー通知もある
  22. 22. クリアなビューの価値Razorは間違いなくテンプレートエンジンとして最先端とにかく書きやすい!PlayのScalaTemplateも記法は同様で、影響は言及されていますdesign was inspired by ASP.NET Razorビューは複雑化する傾向にあるスマフォ用のリッチなUIだと、まあしょうがないかな、とはクリアな構文は、弄りやすく、それだけで圧倒的に価値があるデザイナにお願いしやすい、とも言えるそういう機会があるかはともかく、そういうフロー作れるといいな
  23. 23. Conclusion
  24. 24. Webで実績、あります。みんなお世話になっているStackoverflow世界最大のプログラミング系FAQサイトC# + ASP.NET MVCで作られていますmixi Xmas300万人が参加する期間限定の巨大ソーシャルアプリC# + ASP.NET MVC、ホスティングはWindows AzureECサイトDell、ピザーラ、ZOZOTOWN、JTBなど意外と色々あります!
  25. 25. そしてグラニ株式会社グラニhttp://grani.jp/去年9月設立→今年1月に「神獄のヴァルハラゲート」リリース現在PHPからC#に移行中!GREE FP版ランキング1位会員数60万人突破CM放送5000リクエスト/sec1億リクエスト/day
  26. 26. でもお高いんでしょう?AWSやAzureの登場でサーバー調達も楽にAWSにもWindows Serverインスタンスありますです思われているほどお高くはないVisual Studioが高い?エンジニアの月給に比べれば全然安いハードウェアには金を払えてソフトウェアには払えないの?BizSparkという無料でVSが使える支援プログラムもありhttp://www.microsoft.com/ja-jp/mic/bizspark/対象は設立5年未満の企業。非常にお得なので是非チェックを
  27. 27. C#いいよ所詮、言語は道具?大事なのはサービスだって?そうだねだからこそ、良いサービスを作るために道具にこだわりは必要私はこのスライドにある理由によりC#を選びますPHPを選ぶ理由があればPHPでいいし、RubyならRubyでいいただ、理由なくWebだからLAMPとか、そういうのはやめよC#が評価の俎上に載ってくれれば、何より

×