f#事例発表
DESCRIPTION
F# Meetup in TokyoでのF#の事例発表についての発表資料です。TRANSCRIPT
![Page 1: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/1.jpg)
F#事例発表
bleis-tift
August 3, 2014
![Page 2: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/2.jpg)
自己紹介
id:bleis-tift / @bleis
なごやではたらくゆるふわ F#er
仕事で F#使ってます!
![Page 3: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/3.jpg)
これまでの主な活動
C#(VB)プログラマのための F#入門http://www.slideshare.net/bleistift/cvbf
そうだ、bf処理系をつくろう!もちろんSQLで!http://www.slideshare.net/bleistift/bfsql-7401985
仕事で使う F#http://www.slideshare.net/bleistift/f-9062112
Better C#の脱却を目指してhttp://www.slideshare.net/bleistift/better-c
F#による Functional Programming入門http://www.slideshare.net/bleistift/�unctional-
programming
![Page 4: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/4.jpg)
これまでの主な活動
モナドハンズオン前座http://www.slideshare.net/bleistift/ss-15215415
yieldと returnの話http://www.slideshare.net/bleistift/yieldreturn
![Page 5: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/5.jpg)
これまでの主な活動
再帰で考えるhttp://bleis-tift.hatenablog.com/entry/20120119/1326944722
F#で初めての関数型プログラミングhttp://www.atmarkit.co.jp/fdotnet/special/introfs_01/introfs_01_01.html
http://www.atmarkit.co.jp/fdotnet/special/introfs_02/introfs_02_01.html
C#から使いやすい F#コードの書き方http://bleis-tift.hatenablog.com/entry/20121201/1354362376
.NETの標準ライブラリと仲良くする話http://bleis-tift.hatenablog.com/entry/fsadvent2013
詳説コンピュテーション式http://bleis-tift.hatenablog.com/entry/computation-expression
コンピュテーション式における returnと yieldhttp://bleis-tift.hatenablog.com/entry/return-and-yield
![Page 6: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/6.jpg)
これまでの主な活動
LangExthttps://github.com/LangExt/LangExt
http://langext.github.io/LangExt/
Basis.Corehttps://github.com/BasisLib/Basis.Core
![Page 7: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/7.jpg)
今日話すこと
弊社と F#
事例紹介
仕事で F#を使うために
![Page 8: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/8.jpg)
弊社とF#
![Page 9: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/9.jpg)
弊社について
社員数は 20人程度
プログラマは半分くらい
いわゆる一つの SIer
開発では主に、「ちょっと特殊なクライアント」向けにWeb APIを作ってます
.NET系なので、C#や F#を使ってます
![Page 10: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/10.jpg)
弊社とF#
入社後から、ちょっとしたツールとかに個人的に使用
社内では、「条件さえあえば使ってみたいねー」って雰囲気
3年か 4年前に条件のあう案件が!
本格的に業務で F#を使い始めた
![Page 11: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/11.jpg)
F#使った主な案件
人力でやっていた作業を自動化するWebアプリ(1ヶ月)
プロキシサーバとして振る舞うシステムのコア機能のAzure化(3週間)
WebAPI用のフレームワーク
クラウド移行に伴うシステムの完全移行
![Page 12: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/12.jpg)
F#を使った社内ツール・ライブラリ
案件以外でも、社内ツールに F#を使っている
XML用DSLライブラリ
Webアプリ画面テスト支援ツール
Web API用テスティングフレームワーク 1
Web API用テスティングフレームワーク 2
![Page 13: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/13.jpg)
事例紹介
![Page 14: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/14.jpg)
背景
某クラウドから某クラウドへの移行案件
権利的な問題から、元のシステム(C#で構築)をそのまま持っていけない
「仕様書も自動化された結合テストもあるのでタイにオフショアします」(想像)
社員O「是非 F#でやらせてください!」役員K「いいよ!」
社内としては、社員Oを含む 2名が開発者として開発スタートタイ側は開発者 2名+ 1
![Page 15: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/15.jpg)
問題発生
社員Oが都合により案件から離れる
社員K「タイ側のコード、レビューしてもらっていいですか?」
type Function = obj[] -> obj[]
!?
→タイに渡航し、F#やGitについて教育
![Page 16: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/16.jpg)
全体の設計
トランザクションスクリプト風個人の能力のばらつきを考えて APIごとに分離
全体をResultを返すブロックで構築Railway oriented programming(鉄道指向プログラミング)
これのためにライブラリを作成(Basis.Core)自称ちゃんと returnする唯一のコンピュテーション式ライブラリ
![Page 17: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/17.jpg)
ここには当日何かあったらしい
![Page 18: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/18.jpg)
全体的な結果
機能が増えたにもかかわらず、総行数は約 2割減った
些細なバグがほとんどなくなった
ドタバタはあったが、納期には間に合った
C#だったらたぶん間に合わなかったし、バグも出たはず
![Page 19: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/19.jpg)
仕事でF#を使うために
![Page 20: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/20.jpg)
教育(その1)
全く F#も関数プログラミングも知らない人にいきなりつかわせるのは無理
当然教育が必要
とりあえず、実践F#もしくはプログラミングF#を読んでもらう後は、実際に使ってもらいつつ、頻繁にレビュー
より F#らしい書き方を伝えるペアプロは有効ループを書かない方法や、nullとNoneの違いなどを重点的に
![Page 21: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/21.jpg)
教育の成果(サンプル数1)
範囲外アクセスがほとんど出なかった
null例外も F#に閉じた範囲では出なかった
C#に戻っても問題のあるコードを書くことが減った
関数型初心者がいても、サポートできればいけるさらに、能力も向上
![Page 22: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/22.jpg)
教育(その2)
とにかく型(レコードや判別共用体)を作らせる
objを許さない
リフレクションも許さない
F#コード養成ギプス
![Page 23: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/23.jpg)
教育の効果(サンプル数2)
F#っぽいコードがある程度書けるようになった
つまらないバグも減ったただ、それ以前の問題は結局解決できなかった
省略語はいくら言っても直らなかった・・・
よくいる普通のサラリーマンプログラマよりは使える人材に
![Page 24: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/24.jpg)
業務でF#を使ってみて
教育はとても大事
ある種のバグは減る
生産性については、環境次第
今後も F#を業務で使っていきます
事例もできる限り出していきたい
![Page 25: F#事例発表](https://reader035.vdocuments.pub/reader035/viewer/2022081401/557a91b0d8b42acf638b528a/html5/thumbnails/25.jpg)
おわり