Slide 1

Slide 1 text

C#の強み 或いは何故PHPから乗り換えるのか 2013/06/11 Yoshifumi Kawai - @neuecc

Slide 2

Slide 2 text

Self Introduction @仕事 株式会社グラニ 取締役CTO 現在PHPからC#に移行作業中、詳細は↓に .NET最先端技術によるハイパフォーマンスウェブアプリケーション http://www.slideshare.net/neuecc/net-22662425 @個人活動 Microsoft MVP for Visual C# Web http://neue.cc/ Twitter @neuecc JavaScriptにLINQ to Objectsを移植したライブラリ作ってます linq.js - http://linqjs.codeplex.com/

Slide 3

Slide 3 text

C# Everywhere Windowsアプリケーション WinForms, WPF Macアプリケーション Xamarin.Mac Windows 8アプリケーション Windows Store Application Webアプリケーション ASP.NET MVC, ASP.NET Web API クラウド Windows Azure, AWS ゲーム Unity, PlayStation Mobile SDK Mobile(iOS/Android/WP8) MonoTouch Mono for Android Windows Phone 8 App 組み込み/小型端末 .NET Framework Embedded netduino

Slide 4

Slide 4 text

広がる.NET互換環境 というセッションがこないだありました:) http://www.slideshare.net/ufcpp/net-22681062 知識の共有、コア部分のコード共有 ここまで実用レベルで様々な環境に対応している言語は稀有 揃えることで、会社では人が回しやすかったりとかも 言語自体が非常に良い これからお話します

Slide 5

Slide 5 text

Typing : Static vs Dynamic コンパイルでの検出ってやっぱ大事 ユニットテストがあるからなくても大丈夫?→NO コンパイルエラーはIDEが「リアルタイム」に検出する リアルタイムは速さであり軽さ 文法エラーを気にしながら書くな んて人間のやることじゃない。そ んなの機械に任せよう。

Slide 6

Slide 6 text

IntelliSense is Help 強力な入力補完(IntelliSense) IntelliSenseはドキュメントでもありヘルプでもある、 IntelliSenseに出てこなければ自分のコードのほうが100%間違っ ている、という信用関係 100%というのが大事で、言語仕様が それを前提として組まれてないと実 現できない。C#はVisual Studioの存 在を強く考慮していて、IDEに優しい

Slide 7

Slide 7 text

Refactoring Part1 完璧な設計など存在しない 完璧な名前付けなど最初からできない そもそも仕様常に変わるし 大事なのは、変えるべき時に、変えられること 名前が不適切になったらすぐ変える、引数が増えたら整理する コードは負債である 時が経てば経つほど、腐敗していく 不適切な名前、ひたすら増えていく一方の引数 対処しなければメンテナンス不能なスパゲティとして開発者を苦しめる

Slide 8

Slide 8 text

Type for Refactoring Ctrl + .を押してその場で確実な名前変更 コンパイルエラーを回って(エラー一覧ダブルクリックでその行に飛ぶ)書き換えたりも可 一括置換でリネーム?危なっかしい! 危なっかしいという感情は、手を止めてしまいませんか? その躊躇いが、負債を増やし続けます テストがあれば大丈夫だ、って?どのぐらいのカバレッジ? PHP用のIDEがあるって?実際、会社ではPHPStormを使っていて、手動置換よりは全然いい ですが安心感はそれほどない(そもそも生連想配列の箇所とかも……) 参照している別プロジェクトやユ ニットテストの名前なども、漏れ なく完全に一括で置換される

Slide 9

Slide 9 text

Type is Document メソッド名だけじゃ情報としては不十分 引数の型、戻り値の型が合わさることによって、何をやっているかが伝わる そもそもメソッド名がイミフな場合にも 適切でないメソッド名はなにをやっているのか読み取れない。スキル差のあ るメンバー同士であったり、動作が変わったもののリファクタリング放置さ れたりなどで、不適切な名前のメソッドは出てきてしまう。その時に、最低 限の信頼できる情報として、型があると助かる ソースはドキュメント? いちいち呼び元のソース見に行ってコード本体を読んで型が何なのかを確認 して、というのを延々とやらなければならない?馬鹿らしい!

Slide 10

Slide 10 text

Type Hinting/PHPDocs ドキュメントっていうんならPHPDocsあるよ! そうだね型を書かないのが楽なPHPでそれ書くんなら、更にコンパ イルしてエラーも検出してくれたほうがよりずっとイイね 引数の型ならType Hintingがあるよ! そうだね実行時検出だね しかもintやstringなどには使えない 更にデフォルト引数なし && null許可の場合は使えない 指定できるのはarrayまでで、配列の要素の型まで指定できないし Genericsがないからね…… あと、ただの配列と連想配列を区別したいよ……

Slide 11

Slide 11 text

Type is Speed Lightweight Languageと比較すると、重い、本当に? 何が重いって? ローカル変数を宣言するのにいちいち型指定するのがダルい ダルい。面倒。自明なことを、わざわざ意識させられるのは辛い そこで型推論! 軽い、むしろ軽い 自動生成と違って読みやすさにも寄与する(自動生成最強、ではない) 型推論 = 静的言語と動的言語のイイとこどり! C#, OCaml, Scala, Haskell, F#, TypeScript 型をダラダラ書くJ***と$地 獄なP**は辛ぽよ C#の推論能力はこの中では最弱! ですが、強すぎる能力はIDEの入力 補完との相性が悪くなる。そのト レードオフを忘れてはならない

Slide 12

Slide 12 text

Debugger is Power 21世紀にもなってprintfデバッグは絶対ない 弊社ではPHPはPHPStorm+Xdebugでデバッガ動かしてます Visual Studioのデバッガはそれよりも更にずっと超強力 マウスで現在のステップを 強制的に動かしてifの内部に 突っ込んで分岐した場合の 挙動確認が容易 変数表示見やすい (コレクションの展開な ど) ウォッチウィンドウでIntelliSense効 くのが超便利(変数を代入して挙動変 えるとかもウォッチで賄える)

Slide 13

Slide 13 text

C# is Lightweight リアルタイムエラー通知は速さ IntelliSenseは速さ 型情報は速さ 型推論は速さ 強力なデバッガは速さ C# + Visual Studioはロケットブースター どれだけダッシュが速かろうと、人間の脚力には限界がある 全力ダッシュの選手の横を軽々と追い抜いていく

Slide 14

Slide 14 text

The Evolution of C# Java/Delphi Generics LINQ Dynamic Async 2002 C# 1.0 2005 C# 2.0 2008 C# 3.0 2010 C# 4.0 2012 C# 5.0

Slide 15

Slide 15 text

Language should be evolve 言語は進化しなければならない C#はJavaのようなもの、の時代はとうに終わってます 言語の進化は複雑怪奇にしたいからではない、楽させるための進化 PHPも進化を止めていない、その点は偉い 弊社はPHP 5.4を採用、ラムダ式(クロージャ,無名関数)をフル活用 自社製LINQモドきライブラリで主に利用 でも、継ぎ接ぎ感が否めなくて正直アレだとは思う 進化はキメラ化とのバランス感覚が重要 Anders Hejlsberg(C#設計者)はその点が天才的

Slide 16

Slide 16 text

C# 3.0 - LINQ ウェブアプリケーション = コレクション処理 といっても過言ではない JOINをどこで行うか?DB上で全て整形されている? 負荷分散のため、DB上でまとまっていないケースも少なくない LINQ to Objectsによるインメモリ結合 普通にやると生産性落ちるしバグの元 LINQ to Objectsを使えばSQLより、むしろ書きやすい

Slide 17

Slide 17 text

LINQ vs array_xxx PHPにもarray_filterとかあるよ? それだけじゃLINQの本質に迫れない LINQは各メソッドが合成可能 WhereとSelectを組み合わせてリスト内包表記とか 更にOrderByを入れてSkipWhileを入れてTakeを入れて… 無限大に手が広がる しかもIntelliSenseとの相性が抜群にいいので、書いてて楽ちん ラムダ式の書きやすさや匿名型なども寄与 C#はIntelliSense指向言語

Slide 18

Slide 18 text

C# 4.0 - Parallel 並列処理などもお手の物かつ簡単に記述できる バッチなどの重たい処理を高速に行える foreachをParallel.ForEachに変えるだけのお手軽さ 弊社内では実際30分→2分などの実例あり スレッドプールに投げるのも簡単 ジョブキュー使うまでもないけど、後に回したい みたいな粒度のものは、それだけで解決するかも?

Slide 19

Slide 19 text

Everything is asynchronous 例えばNode.jsで脚光を浴びる非同期処理 I/Oを待っている間のスレッド消費がなくなり効率的 でも、普通に書くとコールバック地獄 ネストする関数、例外処理は?リトライ処理は? ライブラリでカバーするのも限界があるし書きづらい C# 5.0は言語構文としてasync対応した WebSocketにもフル対応 先端テクノロジを常にキャッチアップ

Slide 20

Slide 20 text

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/ente var music = client.GetStringAsync("http://magazine.music.yahoo.co.jp/r var 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_c url_multi/

Slide 21

Slide 21 text

Template Engine Revolution Razor ASP.NET MVC3から採用されている標準テンプレートエンジン 特徴は3つ 閉じカッコ不要、全て@だけ 圧倒的な見やすさと書きやすさ 制御構文はC#そのまま 変なテンプレート構文を覚えなくていい 型付けされててIntelliSenseが効く 入力ミスがあればエラー通知もある

Slide 22

Slide 22 text

クリアなビューの価値 Razorは間違いなくテンプレートエンジンとして最先端 とにかく書きやすい! PlayのScalaTemplateも記法は同様で、影響は言及されています design was inspired by ASP.NET Razor ビューは複雑化する傾向にある スマフォ用のリッチなUIだと、まあしょうがないかな、とは クリアな構文は、弄りやすく、それだけで圧倒的に価値がある デザイナにお願いしやすい、とも言える そういう機会があるかはともかく、そういうフロー作れるといいな

Slide 23

Slide 23 text

Conclusion

Slide 24

Slide 24 text

Webで実績、あります。 みんなお世話になっているStackoverflow 世界最大のプログラミング系FAQサイト C# + ASP.NET MVCで作られています mixi Xmas 300万人が参加する期間限定の巨大ソーシャルアプリ C# + ASP.NET MVC、ホスティングはWindows Azure ECサイト Dell、ピザーラ、ZOZOTOWN、JTBなど意外と色々あります!

Slide 25

Slide 25 text

そしてグラニ 株式会社グラニ http://grani.jp/ 去年9月設立→今年1月に「神獄のヴァルハラゲート」リリース 現在PHPからC#に移行中! GREE FP版ランキング1位 会員数60万人突破 CM放送 5000リクエスト/sec 1億リクエスト/day

Slide 26

Slide 26 text

でもお高いんでしょう? AWSやAzureの登場でサーバー調達も楽に AWSにもWindows Serverインスタンスありますです 思われているほどお高くはない Visual Studioが高い?エンジニアの月給に比べれば全然安い ハードウェアには金を払えてソフトウェアには払えないの? BizSparkという無料でVSが使える支援プログラムもあり http://www.microsoft.com/ja-jp/mic/bizspark/ 対象は設立5年未満の企業。非常にお得なので是非チェックを

Slide 27

Slide 27 text

C#いいよ 所詮、言語は道具? 大事なのはサービスだって? そうだね だからこそ、良いサービスを作るために道具にこだわりは必要 私はこのスライドにある理由によりC#を選びます PHPを選ぶ理由があればPHPでいいし、RubyならRubyでいい ただ、理由なくWebだからLAMPとか、そういうのはやめよ C#が評価の俎上に載ってくれれば、何より