SlideShare a Scribd company logo
C#の強み
或いは何故PHPから乗り換えるのか
2013/06/11
Yoshifumi Kawai - @neuecc
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/
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
広がる.NET互換環境
というセッションがこないだありました:)
http://www.slideshare.net/ufcpp/net-22681062
知識の共有、コア部分のコード共有
ここまで実用レベルで様々な環境に対応している言語は稀有
揃えることで、会社では人が回しやすかったりとかも
言語自体が非常に良い
これからお話します
Typing : Static vs Dynamic
コンパイルでの検出ってやっぱ大事
ユニットテストがあるからなくても大丈夫?→NO
コンパイルエラーはIDEが「リアルタイム」に検出する
リアルタイムは速さであり軽さ
文法エラーを気にしながら書くな
んて人間のやることじゃない。そ
んなの機械に任せよう。
IntelliSense is Help
強力な入力補完(IntelliSense)
IntelliSenseはドキュメントでもありヘルプでもある、
IntelliSenseに出てこなければ自分のコードのほうが100%間違っ
ている、という信用関係
100%というのが大事で、言語仕様が
それを前提として組まれてないと実
現できない。C#はVisual Studioの存
在を強く考慮していて、IDEに優しい
Refactoring Part1
完璧な設計など存在しない
完璧な名前付けなど最初からできない
そもそも仕様常に変わるし
大事なのは、変えるべき時に、変えられること
名前が不適切になったらすぐ変える、引数が増えたら整理する
コードは負債である
時が経てば経つほど、腐敗していく
不適切な名前、ひたすら増えていく一方の引数
対処しなければメンテナンス不能なスパゲティとして開発者を苦しめる
Type for Refactoring
Ctrl + .を押してその場で確実な名前変更
コンパイルエラーを回って(エラー一覧ダブルクリックでその行に飛ぶ)書き換えたりも可
一括置換でリネーム?危なっかしい!
危なっかしいという感情は、手を止めてしまいませんか?
その躊躇いが、負債を増やし続けます
テストがあれば大丈夫だ、って?どのぐらいのカバレッジ?
PHP用のIDEがあるって?実際、会社ではPHPStormを使っていて、手動置換よりは全然いい
ですが安心感はそれほどない(そもそも生連想配列の箇所とかも……)
参照している別プロジェクトやユ
ニットテストの名前なども、漏れ
なく完全に一括で置換される
Type is Document
メソッド名だけじゃ情報としては不十分
引数の型、戻り値の型が合わさることによって、何をやっているかが伝わる
そもそもメソッド名がイミフな場合にも
適切でないメソッド名はなにをやっているのか読み取れない。スキル差のあ
るメンバー同士であったり、動作が変わったもののリファクタリング放置さ
れたりなどで、不適切な名前のメソッドは出てきてしまう。その時に、最低
限の信頼できる情報として、型があると助かる
ソースはドキュメント?
いちいち呼び元のソース見に行ってコード本体を読んで型が何なのかを確認
して、というのを延々とやらなければならない?馬鹿らしい!
Type Hinting/PHPDocs
ドキュメントっていうんならPHPDocsあるよ!
そうだね型を書かないのが楽なPHPでそれ書くんなら、更にコンパ
イルしてエラーも検出してくれたほうがよりずっとイイね
引数の型ならType Hintingがあるよ!
そうだね実行時検出だね
しかもintやstringなどには使えない
更にデフォルト引数なし && null許可の場合は使えない
指定できるのはarrayまでで、配列の要素の型まで指定できないし
Genericsがないからね……
あと、ただの配列と連想配列を区別したいよ……
Type is Speed
Lightweight Languageと比較すると、重い、本当に?
何が重いって?
ローカル変数を宣言するのにいちいち型指定するのがダルい
ダルい。面倒。自明なことを、わざわざ意識させられるのは辛い
そこで型推論!
軽い、むしろ軽い
自動生成と違って読みやすさにも寄与する(自動生成最強、ではない)
型推論 = 静的言語と動的言語のイイとこどり!
C#, OCaml, Scala, Haskell, F#, TypeScript
型をダラダラ書くJ***と$地
獄なP**は辛ぽよ
C#の推論能力はこの中では最弱!
ですが、強すぎる能力はIDEの入力
補完との相性が悪くなる。そのト
レードオフを忘れてはならない
Debugger is Power
21世紀にもなってprintfデバッグは絶対ない
弊社ではPHPはPHPStorm+Xdebugでデバッガ動かしてます
Visual Studioのデバッガはそれよりも更にずっと超強力
マウスで現在のステップを
強制的に動かしてifの内部に
突っ込んで分岐した場合の
挙動確認が容易
変数表示見やすい
(コレクションの展開な
ど)
ウォッチウィンドウでIntelliSense効
くのが超便利(変数を代入して挙動変
えるとかもウォッチで賄える)
C# is Lightweight
リアルタイムエラー通知は速さ
IntelliSenseは速さ
型情報は速さ
型推論は速さ
強力なデバッガは速さ
C# + Visual Studioはロケットブースター
どれだけダッシュが速かろうと、人間の脚力には限界がある
全力ダッシュの選手の横を軽々と追い抜いていく
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
Language should be evolve
言語は進化しなければならない
C#はJavaのようなもの、の時代はとうに終わってます
言語の進化は複雑怪奇にしたいからではない、楽させるための進化
PHPも進化を止めていない、その点は偉い
弊社はPHP 5.4を採用、ラムダ式(クロージャ,無名関数)をフル活用
自社製LINQモドきライブラリで主に利用
でも、継ぎ接ぎ感が否めなくて正直アレだとは思う
進化はキメラ化とのバランス感覚が重要
Anders Hejlsberg(C#設計者)はその点が天才的
C# 3.0 - LINQ
ウェブアプリケーション = コレクション処理
といっても過言ではない
JOINをどこで行うか?DB上で全て整形されている?
負荷分散のため、DB上でまとまっていないケースも少なくない
LINQ to Objectsによるインメモリ結合
普通にやると生産性落ちるしバグの元
LINQ to Objectsを使えばSQLより、むしろ書きやすい
LINQ vs array_xxx
PHPにもarray_filterとかあるよ?
それだけじゃLINQの本質に迫れない
LINQは各メソッドが合成可能
WhereとSelectを組み合わせてリスト内包表記とか
更にOrderByを入れてSkipWhileを入れてTakeを入れて…
無限大に手が広がる
しかもIntelliSenseとの相性が抜群にいいので、書いてて楽ちん
ラムダ式の書きやすさや匿名型なども寄与
C#はIntelliSense指向言語
C# 4.0 - Parallel
並列処理などもお手の物かつ簡単に記述できる
バッチなどの重たい処理を高速に行える
foreachをParallel.ForEachに変えるだけのお手軽さ
弊社内では実際30分→2分などの実例あり
スレッドプールに投げるのも簡単
ジョブキュー使うまでもないけど、後に回したい
みたいな粒度のものは、それだけで解決するかも?
Everything is asynchronous
例えばNode.jsで脚光を浴びる非同期処理
I/Oを待っている間のスレッド消費がなくなり効率的
でも、普通に書くとコールバック地獄
ネストする関数、例外処理は?リトライ処理は?
ライブラリでカバーするのも限界があるし書きづらい
C# 5.0は言語構文としてasync対応した
WebSocketにもフル対応
先端テクノロジを常にキャッチアップ
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/
Template Engine Revolution
Razor
ASP.NET MVC3から採用されている標準テンプレートエンジン
特徴は3つ
閉じカッコ不要、全て@だけ
圧倒的な見やすさと書きやすさ
制御構文はC#そのまま
変なテンプレート構文を覚えなくていい
型付けされててIntelliSenseが効く
入力ミスがあればエラー通知もある
クリアなビューの価値
Razorは間違いなくテンプレートエンジンとして最先端
とにかく書きやすい!
PlayのScalaTemplateも記法は同様で、影響は言及されています
design was inspired by ASP.NET Razor
ビューは複雑化する傾向にある
スマフォ用のリッチなUIだと、まあしょうがないかな、とは
クリアな構文は、弄りやすく、それだけで圧倒的に価値がある
デザイナにお願いしやすい、とも言える
そういう機会があるかはともかく、そういうフロー作れるといいな
Conclusion
Webで実績、あります。
みんなお世話になっているStackoverflow
世界最大のプログラミング系FAQサイト
C# + ASP.NET MVCで作られています
mixi Xmas
300万人が参加する期間限定の巨大ソーシャルアプリ
C# + ASP.NET MVC、ホスティングはWindows Azure
ECサイト
Dell、ピザーラ、ZOZOTOWN、JTBなど意外と色々あります!
そしてグラニ
株式会社グラニ
http://grani.jp/
去年9月設立→今年1月に「神獄のヴァルハラゲート」リリース
現在PHPからC#に移行中!
GREE FP版ランキング1位
会員数60万人突破
CM放送
5000リクエスト/sec
1億リクエスト/day
でもお高いんでしょう?
AWSやAzureの登場でサーバー調達も楽に
AWSにもWindows Serverインスタンスありますです
思われているほどお高くはない
Visual Studioが高い?エンジニアの月給に比べれば全然安い
ハードウェアには金を払えてソフトウェアには払えないの?
BizSparkという無料でVSが使える支援プログラムもあり
http://www.microsoft.com/ja-jp/mic/bizspark/
対象は設立5年未満の企業。非常にお得なので是非チェックを
C#いいよ
所詮、言語は道具?
大事なのはサービスだって?
そうだね
だからこそ、良いサービスを作るために道具にこだわりは必要
私はこのスライドにある理由によりC#を選びます
PHPを選ぶ理由があればPHPでいいし、RubyならRubyでいい
ただ、理由なくWebだからLAMPとか、そういうのはやめよ
C#が評価の俎上に載ってくれれば、何より

More Related Content

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