Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C#の強み、或いは何故PHPから乗り換えるのか
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yoshifumi Kawai
June 11, 2013
Technology
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C#の強み、或いは何故PHPから乗り換えるのか
C#ユーザー会 #30
Yoshifumi Kawai
June 11, 2013
More Decks by Yoshifumi Kawai
See All by Yoshifumi Kawai
.NET for Android with Native AOT Built with Cursor
neuecc
0
570
CysharpのOSS群から見るModern C#の現在地
neuecc
2
41k
R3のコードから見る実践LINQ実装最適化・コンカレントプログラミング実例
neuecc
5
56k
.NETの非同期戦略とUnityとの相互運用
neuecc
3
55k
他言語がメインの場合のRustの活用法 - csbindgenによるC# x Rust FFI実践事例
neuecc
7
41k
Modern High Performance C# 2023 Edition
neuecc
4
16k
CEDEC 2023 モダンハイパフォーマンスC# 2023 Edition
neuecc
9
120k
C#11 による世界最速バイナリシリアライザー「MemoryPack」の作り方
neuecc
1
42k
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
neuecc
1
500
Other Decks in Technology
See All in Technology
そのPoC、何を検証したつもりでしたか? AIプロダクトの価値検証で陥った落とし穴
techtekt
PRO
0
150
「気づいたら仕事が終わっている」バクラクAIエージェント本番運用の裏側 / layerx-bakuraku-aie2026
yuya4
19
11k
OCI Oracle AI Database Services新機能アップデート(2026/03-2026/05)
oracle4engineer
PRO
0
250
Claude code Orchestra
ozakiomumkj
3
990
AIにフローを作らせようとして挫折した話
hamatsutaichi
0
210
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
PHP と TypeScript の型システム比較:AI 時代の「型」は誰のためにあるのか? #frontend_phpcon_do / frontend_phpcon_do_2026
shogogg
1
260
Amazon Bedrock AgentCore ワークショップ JAWS UG TOHOKU / amazon-bedrock-agentcore-workshop-jawsug-tohoku-2026
gawa
8
370
Cloud Run のアップデート 触ってみる&紹介
gre212
0
320
速さだけじゃない! VoidZero ツールが移行先に選ばれる理由
mizdra
PRO
6
760
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
820
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
270
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
190
Unsuck your backbone
ammeep
672
58k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Limits of Empathy - UXLibs8
cassininazir
1
350
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
380
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Transcript
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#が評価の俎上に載ってくれれば、何より