SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
すばやく実装するための戦略と
テクニック
2018.07.14 PHPカンファレンス関西
@77web
・@77web
・フリーランス(9年ぐらい)→カルテットコミュニケーションズ(4年)
・名古屋
・2児の母
・日本Symfonyユーザー会
・CoderDojo名古屋 初代チャンピオン(諸事情あって引退…)
・I♥PHP
・運用型広告業界をホワイトにする仕組みを作ってます
・仲間募集中!(フルリモート、パートタイム、もちろんフ
ルタイム正社員も歓迎)
速さは力
速いと何が嬉しい?
速いと何が嬉しい?
• 間違っても修正する時間がある
速いと何が嬉しい?
• 間違っても修正する時間がある
• 心と身体の余裕
速いと何が嬉しい?
• 間違っても修正する時間がある
• 心と身体の余裕
• 次のことを勉強する時間ができる
速いと何が嬉しい?
• 間違っても修正する時間がある
• 心と身体の余裕
• 次のことを勉強する時間ができる
• (おまけ)新機能にアサインされやすい
速さを妨げるものはなにか?
速さを妨げるものはなにか?
速さを妨げるもの=わからなさ
• フレームワークやライブラリの使い方がわからない
• どういう処理を書いたら仕様を実現できるかわからない
• 実装にどれぐらい時間がかかるかわからない
• 処理のボトルネックがどこになるかわからない
• 求められる仕様がわからない・決まってない
わからなさを減らせば倒しやすい=速くできる
戦略:分割統治法
分割統治法とは?
• divide-and-conquer method
• そのままでは実装が難しい大きな問題を小さな問題に分割することで実装しやすくする方法(プ
ログラム用語)
• わからなさを削りながら実装していく
分割統治法実践テクニック
• 表をイメージして裏から作る
• 争いのないものから作る
表をイメージして裏から作る
表をイメージして裏から作る
• interfaceを活用
• 表から裏に対してやってほしいこと(何を受け取って何を返してほしいか)だけを定義する
UI
app
domain
infra(DB/External API)
争いのない部分から作る
争いのない部分から作る
• プロジェクト全体としてわからない部分を少しでも減らしていくために、わかっている部分か
らコードにしていく
• 実装開始時点で仕様が決まっていない部分は、後でガラッと変わるかもしれない
• 外的要因
• 内的要因
• あとで変わるかもしれないものをベースにしない
実際にやってみましょう
要件
• 顧客電話帳アプリ
• 項目は電話番号、会社名、担当者名、自社の担当者名、案件名、メモ
• 電話番号とキーワードで検索
• 電話番号は前方一致
• キーワードは部分一致
• メモ以外のテキスト項目を検索
• データ保存形態は未定(どれでも対応できるように)
要件
• 顧客電話帳アプリ
• 項目は電話番号、会社名、担当者名、自社の担当者名、案件名、メモ
• 電話番号とキーワードで検索
• 電話番号は前方一致
• キーワードは部分一致
• メモ以外のテキスト項目を検索
• データ保存形態は未定(どれでも対応できるように)
step1. 表のイメージ
表をイメージして裏から作る
step2.分け方を考える
検索条件ビルダ
顧客検索
表をイメージして裏から作る
step3. 表イメージをあるべき姿へ修正
顧客検索アプリ 表をイメージして裏から作る
step3. 外側のイメージをあるべき姿へ修正
1つのファイルの責務を1つにしたらだいたいOK
表をイメージして裏から作る
step4. interfaceで表からの利用イメージをそのまま書いてみる
良さそうですね
表をイメージして裏から作る
今回の場合は揺れ動きそうなのは検索の仕様。
なら、$_GETから$customerCriteriaを作るCriteriaBuilderから作る。
争いのないものから作る
step5. 争いのない部品を作る
step6.争いのある部品を作る
CustomerSearch::search()のイメージを考える。
RDBだとSQL1個書いてPDOにつっこむだけだから楽ですね。
でも対象が配列やCSVだと…?
顧客データソース
表をイメージして裏から作る
step7. 争いのある部品のイメージをinterfaceで書いてみる
検索の仕様が変わったらここだけ変えれば良い
※本当はこの辺もうちょっと分割したい
表をイメージして裏から作る
step8. 争いのある部品で使うための部品を作る
とりあえずArrayのDataSourceを書いた
step9. 部品が ったので組み立てて動かしてみる
search.php
CustomerSearchApp
CustomerSearch
infra(DB/External API)
CustomerDataSource
CustomerCriteriaBuilder
CustomerCriteria
表
裏
demo
step10. 応用編: データ保存先がRDBに変わったとき
あれだけ一生懸命書いたCustomerSearchの絞り込み処理は捨てました
その他速度を上げるテクニック
1. 良い道具を使う
 1-1. こわれにくい
 1-2. 間違えにくい
 1-3. 手数が少ない
 1-4. 動作が速い
2. 自分の速度を上げる
2-1. 決断を速く
2-2. 思考を速く
2-3. ベンチタイムの有
効活用
1.良い道具を使う
• 良い=開発速度が上がる
1-1. こわれにくい道具
1-1. こわれにくい道具
• 急いで、雑に扱っても大丈夫
• キーボード
• 芯の折れやすいシャーペンより鉛筆
• オプションを1つ間違っても壊れないコマンド
• ボタンを1つ押し間違ってももとに戻せる
1-2. 間違えにくい道具
2-2. 間違えにくい道具
• 操作を間違いにくい
• ショートカットキーより直感的なボタン操作が優れていることがある
• コーディング自体を間違いにくい
• エディタのコード補完をちゃんと使う
• typo指摘してくれて専門用語の辞書を設定できるエディタを使う
1-3. 手数が少ない道具
・たくさんあれこれ調整する
・途中で洗い→脱水→すすぎ→脱水と手で移動させる
・「スタート」ボタン1個押せば洗濯できる
・ボタン1つで乾燥までできる
1-3. 手数が少ない道具
• 人間がやらないといけないことを減らして、自動化できるものを選ぶ
• 手数が減るとミスも減る
• CI
• cs-fixer
1-4. 動きが速い道具
1-4. 動きが速い道具
• 良いCI(札束で殴る)
• 良いスペックのPC
• キーボード
• 無線より有線
• マウス
• ゲーミングマウスは反応が良いのでオススメ
2. 自分の速度を上げる
2-1. 決断を速く
2-1. 決断を速く
• 悩んだり調査したりする(コーディング以外の)時間の限度を決める
• Googleは10分間ルール(※要出典)
• 私は1時間ルール
• 死なないものならまずやってみる
• 案ずるより産むが易し
2-2. 思考を速く
3-2. 思考を速く
• トレーニングする。手っ取り早いのは速聴
• 高価な機器はいらない、カセットテープ再生機やyoutubeの倍速再生とかで十分効果がある
• やりすぎると話し言葉も早口になっちゃうので人間関係に注意…
2-3. ベンチタイムの有効活用
あと30分
2-3. ベンチタイムの有効活用
• テスト実行中、CI実行中、レビュー待ち
• 2タスク(以上)並列せよ
• まったく別のプロジェクトを並列するのが理想
• プロジェクトが1つしかない場合はgitのブランチを使ってタスクごとに完全に分ける
• 次に何をするかはコミットログに覚えさせる(脳内に覚えることはできるだけ少なく)
• プルリクも分割統治しておく
• 後工程があるものを先に作業
A実装
B実装
直
し
テスト
テスト CI レビュー
テスト
レビュー
CI レビュー仕様確認
レビューXさん作業
仕様確認
まとめ
• 戦略:分割統治法=わからなさを削りながら実装する
• 表をイメージして裏から作る
• 争いのないものから作る
• 良い道具を使う
• 自分自身の速度を上げる
Happy coding! ありがとうございました!
サンプルコード:https://github.com/77web/phpkansai2018-hellopage

Mais conteúdo relacionado

Semelhante a すばやく実装するための戦略とテクニック

爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話Shohei Tai
 
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LTまだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT77web
 
お申し込みを1割増やしたフォーム改善の話
お申し込みを1割増やしたフォーム改善の話お申し込みを1割増やしたフォーム改善の話
お申し込みを1割増やしたフォーム改善の話lolipopjp
 
デンキヤギの採用の考え方
デンキヤギの採用の考え方デンキヤギの採用の考え方
デンキヤギの採用の考え方terurou
 
PHP conference kansai2018_ishihara
PHP conference kansai2018_ishiharaPHP conference kansai2018_ishihara
PHP conference kansai2018_ishiharaishihara_yuki
 
365 に Video がやって来る ヤァ!ヤァ!ヤァ!
365 に Video がやって来る ヤァ!ヤァ!ヤァ!365 に Video がやって来る ヤァ!ヤァ!ヤァ!
365 に Video がやって来る ヤァ!ヤァ!ヤァ!Hirofumi Ota
 
Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~
Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~
Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~Akiko Kosaka
 
ウェブエンジニアとしての1年目を振り返って
ウェブエンジニアとしての1年目を振り返ってウェブエンジニアとしての1年目を振り返って
ウェブエンジニアとしての1年目を振り返ってKohki Yamagiwa
 
10分でわかるPythonの開発環境
10分でわかるPythonの開発環境10分でわかるPythonの開発環境
10分でわかるPythonの開発環境Hisao Soyama
 
Hack+FuelPHPによるWebサービス開発
Hack+FuelPHPによるWebサービス開発Hack+FuelPHPによるWebサービス開発
Hack+FuelPHPによるWebサービス開発Yuji Otani
 
もっと早くに取り組んでおけばよかった開発プロセス
もっと早くに取り組んでおけばよかった開発プロセスもっと早くに取り組んでおけばよかった開発プロセス
もっと早くに取り組んでおけばよかった開発プロセスKazuki Takahashi
 
リモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワークリモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワークMaehana Tsuyoshi
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験paiza
 
LLoT ランゲージアップデート Python
LLoT ランゲージアップデート PythonLLoT ランゲージアップデート Python
LLoT ランゲージアップデート Pythonhirokiky
 
Hour of-code-2016冬-シンポジウム
Hour of-code-2016冬-シンポジウムHour of-code-2016冬-シンポジウム
Hour of-code-2016冬-シンポジウムYuta Tonegawa
 
「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)
「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)
「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)Kentaro Suzuki
 
Python charity talk in japan fastAPI introduction
Python charity talk in japan fastAPI introductionPython charity talk in japan fastAPI introduction
Python charity talk in japan fastAPI introductionssuserc75dc7
 
歴史あるWebサービスに携わって2年半の間に起きた事やった事
歴史あるWebサービスに携わって2年半の間に起きた事やった事歴史あるWebサービスに携わって2年半の間に起きた事やった事
歴史あるWebサービスに携わって2年半の間に起きた事やった事Masataka Kono
 
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライドJJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライドToshiakiArai
 
PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由Yuji Otani
 

Semelhante a すばやく実装するための戦略とテクニック (20)

爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話
 
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LTまだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
まだ技術ブログを始めてないPHPerのあなたへ。PHPカンファレンス関西2013 LT
 
お申し込みを1割増やしたフォーム改善の話
お申し込みを1割増やしたフォーム改善の話お申し込みを1割増やしたフォーム改善の話
お申し込みを1割増やしたフォーム改善の話
 
デンキヤギの採用の考え方
デンキヤギの採用の考え方デンキヤギの採用の考え方
デンキヤギの採用の考え方
 
PHP conference kansai2018_ishihara
PHP conference kansai2018_ishiharaPHP conference kansai2018_ishihara
PHP conference kansai2018_ishihara
 
365 に Video がやって来る ヤァ!ヤァ!ヤァ!
365 に Video がやって来る ヤァ!ヤァ!ヤァ!365 に Video がやって来る ヤァ!ヤァ!ヤァ!
365 に Video がやって来る ヤァ!ヤァ!ヤァ!
 
Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~
Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~
Agile japan2011 アジャイル体験記~ふりかえりで開発を後押し~
 
ウェブエンジニアとしての1年目を振り返って
ウェブエンジニアとしての1年目を振り返ってウェブエンジニアとしての1年目を振り返って
ウェブエンジニアとしての1年目を振り返って
 
10分でわかるPythonの開発環境
10分でわかるPythonの開発環境10分でわかるPythonの開発環境
10分でわかるPythonの開発環境
 
Hack+FuelPHPによるWebサービス開発
Hack+FuelPHPによるWebサービス開発Hack+FuelPHPによるWebサービス開発
Hack+FuelPHPによるWebサービス開発
 
もっと早くに取り組んでおけばよかった開発プロセス
もっと早くに取り組んでおけばよかった開発プロセスもっと早くに取り組んでおけばよかった開発プロセス
もっと早くに取り組んでおけばよかった開発プロセス
 
リモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワークリモートチームとふりかえり改善フレームワーク
リモートチームとふりかえり改善フレームワーク
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験
 
LLoT ランゲージアップデート Python
LLoT ランゲージアップデート PythonLLoT ランゲージアップデート Python
LLoT ランゲージアップデート Python
 
Hour of-code-2016冬-シンポジウム
Hour of-code-2016冬-シンポジウムHour of-code-2016冬-シンポジウム
Hour of-code-2016冬-シンポジウム
 
「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)
「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)
「Movable Typeの可能性を広げるアドオン「DynamicMTML」について」 v2 (MTDDC Meetup HOKKAIDO 2013版)
 
Python charity talk in japan fastAPI introduction
Python charity talk in japan fastAPI introductionPython charity talk in japan fastAPI introduction
Python charity talk in japan fastAPI introduction
 
歴史あるWebサービスに携わって2年半の間に起きた事やった事
歴史あるWebサービスに携わって2年半の間に起きた事やった事歴史あるWebサービスに携わって2年半の間に起きた事やった事
歴史あるWebサービスに携わって2年半の間に起きた事やった事
 
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライドJJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
JJUG CCC 2015 Spring 「新人エンジニア奮闘記 - Javaって何?からwebサービスを公開するまで -」発表スライド
 
PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由PHP7ではなくHack/HHVMを選ぶ理由
PHP7ではなくHack/HHVMを選ぶ理由
 

Mais de 77web

最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b77web
 
テスト実行速度を改善してお金をかけずに開発スピードを爆速にする
テスト実行速度を改善してお金をかけずに開発スピードを爆速にするテスト実行速度を改善してお金をかけずに開発スピードを爆速にする
テスト実行速度を改善してお金をかけずに開発スピードを爆速にする77web
 
ズンドコキヨシon Workflower
ズンドコキヨシon Workflowerズンドコキヨシon Workflower
ズンドコキヨシon Workflower77web
 
Formとは何か?〜例えば、Symfony\Component\Formを避ける〜
Formとは何か?〜例えば、Symfony\Component\Formを避ける〜Formとは何か?〜例えば、Symfony\Component\Formを避ける〜
Formとは何か?〜例えば、Symfony\Component\Formを避ける〜77web
 
CoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トーク
CoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トークCoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トーク
CoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トーク77web
 
Scratch day 2015 Aichi プログラミングバトル by CoderDojo Nagoya
Scratch day 2015 Aichi プログラミングバトル by CoderDojo NagoyaScratch day 2015 Aichi プログラミングバトル by CoderDojo Nagoya
Scratch day 2015 Aichi プログラミングバトル by CoderDojo Nagoya77web
 
こういうデータ、どこに保存してますか? #nagoyaphp
こういうデータ、どこに保存してますか? #nagoyaphpこういうデータ、どこに保存してますか? #nagoyaphp
こういうデータ、どこに保存してますか? #nagoyaphp77web
 
第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja
第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja
第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja77web
 

Mais de 77web (8)

最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
最近のPHP事情とNagoya.phpへのお誘い #ngk2018b
 
テスト実行速度を改善してお金をかけずに開発スピードを爆速にする
テスト実行速度を改善してお金をかけずに開発スピードを爆速にするテスト実行速度を改善してお金をかけずに開発スピードを爆速にする
テスト実行速度を改善してお金をかけずに開発スピードを爆速にする
 
ズンドコキヨシon Workflower
ズンドコキヨシon Workflowerズンドコキヨシon Workflower
ズンドコキヨシon Workflower
 
Formとは何か?〜例えば、Symfony\Component\Formを避ける〜
Formとは何か?〜例えば、Symfony\Component\Formを避ける〜Formとは何か?〜例えば、Symfony\Component\Formを避ける〜
Formとは何か?〜例えば、Symfony\Component\Formを避ける〜
 
CoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トーク
CoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トークCoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トーク
CoderDojo Nagoyaの取り組みについて at Scratch day 2015 Aichi 3分間トーク
 
Scratch day 2015 Aichi プログラミングバトル by CoderDojo Nagoya
Scratch day 2015 Aichi プログラミングバトル by CoderDojo NagoyaScratch day 2015 Aichi プログラミングバトル by CoderDojo Nagoya
Scratch day 2015 Aichi プログラミングバトル by CoderDojo Nagoya
 
こういうデータ、どこに保存してますか? #nagoyaphp
こういうデータ、どこに保存してますか? #nagoyaphpこういうデータ、どこに保存してますか? #nagoyaphp
こういうデータ、どこに保存してますか? #nagoyaphp
 
第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja
第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja
第9回Symfony勉強会LT Symfony2 meets AngularJS #symfony_ja
 

すばやく実装するための戦略とテクニック