プログラミング方法論
第12回
ソーシャルプログラミング(2)
橋本 翔(教育実習)
今日のお話:複数人での開発
• 設計や問題意識を共有したい
• 手分けして作業したい
• 複数バージョン作りたい
• プログラムのテスト
橋本翔(28)
• 教育実習生
• SFC博士課程 (増井研究室)
• 実世界インタフェース
• 分散並列/Webプログラミング
• 趣味:プログラミング、料理
@shokai
教育実習
• 博士号を取るのに必要
• 何言ってるかわからない時は止めてく
ださい
• チャットを使おうと思う
• http://chat.shokai.org/
(前回の復習)
ソーシャル
プログラミング
social programming
• たくさんの部品をたくさんの人が作って
• 合体させて、どうにかシステムが動いてい
る
• どういう工夫があるか?
social programming
• 部品同士はバラバラの人が作ってい
て、相談してない
• なぜか統合されて動いている
fastladder(Railsアプリケーション)
で使われているgem
addressable
annotate
capybara
coffee-rails (~> 3.2.1)
coveralls
factory_girl_rails
fe...
fastladder(Railsアプリケーション)
で使われているgemで使われているgem
actionmailer (3.2.13)
actionpack (= 3.2.13)
mail (~> 2.5.3)
actionpack (3.2...
最近のwebアプリケーション
• モバゲーはwebアプリをloadするだけで
1GBメモリを使う
• cookpadのModel(DB)数は1000以上、テ
スト走り切るのに10分以上
• 数十人が1つのアプリを同時に開発
• 自分が必要だと各自判断してみんな相談せず
に作った部品が、組み合わさってアプリケー
ションになっている
• どうして数十∼数千の部品が組み合わさって
動くの?
• どうやって作っているの?
複数人での開発
• 設計や問題意識を共有したい
• 手分けして作業したい
• 複数バージョン作りたい
• プログラムのテスト
設計や問題意識の共有
設計や問題意識の共有は難しい
• 曖昧な説明していませんか
• 「順番に処理」
• 「フワッとフェードインしてきて」
• 人によって意味が違う・・
• 視覚的・感覚的・並列的 → 言葉で表せない
• ミーティングの時にわかったつもりでも実
はよ...
フローチャート
• 1921年 フランク・ギルブ
レスが発明
UML
• オブジェクト指向プログラミング用の統一モデリング言語
• 90年代半ばにスリーアミーゴスが考案
プロトタイプ / モックアップ
• 実物大サイズ模型(動かなく
ても良い)
• ビデオ
• 静止画
• 小芝居
• で設計や問題意識を共有する
シナリオ
デザインドキュメントを書く
• 設計や問題意識を共有
• 目的
• 機能要件
• 実装上難しい点
• 設計・実装
• wikiやblogやMLなどを使う
手分けして作業したい
複数バージョン作りたい
バージョン管理ツールのbranch機能
• % git branch など
• バージョン管理ツールは「ある時点とあ
る時点の差分」を保存している
• 複数人で同じファイルを編集できる
• 作業が済んだらmergeする
• 複数バージョン同時開...
issueリスト / bugトラッカー
• 問題意識を共有
• メモ+TODOリスト+議論BBS+バグ報告+ソースコード管理
の融合
• 何か思いついたら書く、誰かが何とかしてくれるかも
• 問題を分割統治
プログラムのテスト
テスト
• プログラムをテストするプログラム
• 動かしてみなければ正常かどうかわからない
• バージョン管理システム上のある時点のプロ
グラムが、正しく動くかどうか常に確認した
い
• テストの方が本体より大きくなる事もある
自動テスト
• 何かする毎にテストが走る
• ファイルを保存する
• バージョン管理ツールに
commitする
• 本番サーバーにリリース前
テスト
• 正常時テスト・異常時テスト
• 境界値テスト
• GUIのテスト
• 負荷テスト
• 単体テスト・結合テスト
• テスト駆動開発
• 継続的インテグレーション
単体テスト・結合テスト
• 部品でテストして、全部okなら
• 合体させてさらにテスト
テストツール
• 大抵のプログラム言語にはテスト用のライブラリがある
• Ruby
• Test::Unit, RSpec, minitest
• Java
• JUnit, Selenium
• JavaScript
• Capybara, ...
正常時テスト
• Rubyのminitestの例
class TestSkypeChat < MiniTest::Test
def test_message
body = "hello hello"
msg = Skype.message SK...
境界値テスト
• 例えば
• 北緯91度、東経181度など異常な値が入
った時、適切なエラーを返すか?
class TestGPS < MiniTest::Test
def test_location
result = Location.new...
テスト駆動開発
• 本体実装より先にテストを書く
• テストが詳細仕様書の代わり
• spec = 動く詳細仕様書
• (個人的に好きではない)
• さすがに本体実装が完全にゼロの時はテスト駆
動開発しない
spec
require 'bowling'
describe Bowling, "#score" do
it "returns 0 for all gutter game" do
bowling = Bowling.new
20.times ...
継続的インテグレーション
• バージョン管理ツールと
連動
• commit毎に自動ビルド、
自動テスト
テストが難しいor不可能な問題
• 結果が正しいか判定しづらい
• 画像処理、音声処理、システム内に人間が含まれる、等
• 特別なハードウェアが必要な場合
• ユーザーインタフェース
• 人間の入力が必要
• Web系・エンタープライズ系以外の...
異常時テスト・負荷テスト
• 異常な事が起こった時に自動対応機能が正しく動作するか
試す
• 突然ブレーカー落としてみる、ノイズを入れる
• 通話中にさらに通話しようとする、等
• web系はツールが多い
• Apache JMeter
• c...
GUIのテスト
• Capybara
• JavaScript
• Webブラウザを内蔵、クリックやキーボードイベ
ント発生
• Selenium
• Java
• マウスが動く
• Sikuli
• 例示プログラミング
Safx: シミュレー...
電子回路・ハードウェアのテスト
• 自動化は難しい
• オシロスコープ・ロジックアナライザ
• プログラムだけならJTAG ICEで可能
• C言語用のテストツールが使える
• LEGOマインドストーム等で治具を自作
する事も
複数人での開発
• 設計や問題意識を共有したい
• 手分けして作業したい
• 複数バージョン作りたい
• プログラムのテスト
演習
• JavaScriptとRubyによるWeb版Linda入門(2)
http://shokai.org/blog/archives/7848
Upcoming SlideShare
Loading in …5
×

プログラミング方法論第12回

1,727 views

Published on

SFC プログラミング方法論第12回 2013年7月1日の講義資料

  • Be the first to comment

プログラミング方法論第12回

  1. 1. プログラミング方法論 第12回 ソーシャルプログラミング(2) 橋本 翔(教育実習)
  2. 2. 今日のお話:複数人での開発 • 設計や問題意識を共有したい • 手分けして作業したい • 複数バージョン作りたい • プログラムのテスト
  3. 3. 橋本翔(28) • 教育実習生 • SFC博士課程 (増井研究室) • 実世界インタフェース • 分散並列/Webプログラミング • 趣味:プログラミング、料理 @shokai
  4. 4. 教育実習 • 博士号を取るのに必要 • 何言ってるかわからない時は止めてく ださい • チャットを使おうと思う • http://chat.shokai.org/
  5. 5. (前回の復習) ソーシャル プログラミング
  6. 6. social programming • たくさんの部品をたくさんの人が作って • 合体させて、どうにかシステムが動いてい る • どういう工夫があるか?
  7. 7. social programming • 部品同士はバラバラの人が作ってい て、相談してない • なぜか統合されて動いている
  8. 8. fastladder(Railsアプリケーション) で使われているgem addressable annotate capybara coffee-rails (~> 3.2.1) coveralls factory_girl_rails feed_searcher (>= 0.0.6) feedzirra! haml i18n-js! konacha launchy mini_magick mysql2 nokogiri opml! poltergeist pry-doc pry-rails quiet_assets rails (= 3.2.13) rspec-rails sass-rails (~> 3.2.3) settingslogic simplecov simplecov-rcov sinon-rails sqlite3 uglifier (>= 1.0.3) webmock
  9. 9. fastladder(Railsアプリケーション) で使われているgemで使われているgem actionmailer (3.2.13) actionpack (= 3.2.13) mail (~> 2.5.3) actionpack (3.2.13) activemodel (= 3.2.13) activesupport (= 3.2.13) builder (~> 3.0.0) erubis (~> 2.7.0) journey (~> 1.0.4) rack (~> 1.4.5) rack-cache (~> 1.2) rack-test (~> 0.6.1) sprockets (~> 2.2.1) activemodel (3.2.13) activesupport (= 3.2.13) builder (~> 3.0.0) activerecord (3.2.13) activemodel (= 3.2.13) activesupport (= 3.2.13) arel (~> 3.0.2) tzinfo (~> 0.3.29) activeresource (3.2.13) activemodel (= 3.2.13) activesupport (= 3.2.13) activesupport (3.2.13) i18n (= 0.6.1) multi_json (~> 1.0) addressable (2.3.3) annotate (2.5.0) rake arel (3.0.2) builder (3.0.4) capybara (2.0.2) mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) rack-test (>= 0.5.4) selenium-webdriver (~> 2.0) xpath (~> 1.0.0) childprocess (0.3.9) ffi (~> 1.0, >= 1.0.11) coderay (1.0.9) coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) coffee-script (2.2.0) coffee-script-source execjs coffee-script-source (1.6.2) colorize (0.5.8) coveralls (0.6.3) i18n (0.6.1) journey (1.0.4) json (1.7.7) konacha (2.5.1) actionpack (>= 3.1, < 5) capybara colorize railties (>= 3.1, < 5) sprockets launchy (2.2.0) addressable (~> 2.3) loofah (1.2.1) nokogiri (>= 1.4.4) mail (2.5.3) i18n (>= 0.4.0) mime-types (~> 1.16) treetop (~> 1.4.8) mechanize (2.6.0) domain_name (~> 0.5, >= 0.5.1) mime-types (~> 1.17, >= 1.17.2) net-http-digest_auth (~> 1.1, >= 1.1.1) net-http-persistent (~> 2.5, >= 2.5.2) nokogiri (~> 1.4) ntlm-http (~> 0.1, >= 0.1.1) webrobots (>= 0.0.9, < 0.2) method_source (0.8.1) mime-types (1.21) mini_magick (3.5.0) subexec (~> 0.2.1) multi_json (1.7.2) mysql2 (0.3.11) net-http-digest_auth (1.2.1) net-http-persistent (2.8) nokogiri (1.5.9) ntlm-http (0.1.1) poltergeist (1.1.0) capybara (~> 2.0, >= 2.0.1) faye-websocket (~> 0.4, >= 0.4.4) http_parser.rb (~> 0.5.3) polyglot (0.3.3) pry (0.9.12) coderay (~> 1.0.5) method_source (~> 0.8) slop (~> 3.4) pry-doc (0.4.5) pry (>= 0.9) yard (>= 0.8) pry-rails (0.2.2) pry (>= 0.9.10) quiet_assets (1.0.2) mime-types (>= 1.16) rspec-core (2.13.1) rspec-expectations (2.13.0) diff-lcs (>= 1.1.3, < 2.0) rspec-mocks (2.13.0) rspec-rails (2.13.0) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) rspec-core (~> 2.13.0) rspec-expectations (~> 2.13.0) rspec-mocks (~> 2.13.0) rubyzip (0.9.9) sass (3.2.7) sass-rails (3.2.6) railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) sax-machine (0.2.0.rc1) nokogiri (~> 1.5.2) selenium-webdriver (2.31.0) childprocess (>= 0.2.5) multi_json (~> 1.0) rubyzip websocket (~> 1.0.4) settingslogic (2.0.9) simplecov (0.7.1) multi_json (~> 1.0) simplecov-html (~> 0.7.1) simplecov-html (0.7.1) simplecov-rcov (0.2.3) simplecov (>= 0.4.1) sinon-rails (1.4.2.1) railties (>= 3.1) slop (3.4.4) sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) sqlite3 (1.3.7) subexec (0.2.2) thor (0.17.0) tilt (1.3.6)
  10. 10. 最近のwebアプリケーション • モバゲーはwebアプリをloadするだけで 1GBメモリを使う • cookpadのModel(DB)数は1000以上、テ スト走り切るのに10分以上 • 数十人が1つのアプリを同時に開発
  11. 11. • 自分が必要だと各自判断してみんな相談せず に作った部品が、組み合わさってアプリケー ションになっている • どうして数十∼数千の部品が組み合わさって 動くの? • どうやって作っているの?
  12. 12. 複数人での開発 • 設計や問題意識を共有したい • 手分けして作業したい • 複数バージョン作りたい • プログラムのテスト
  13. 13. 設計や問題意識の共有
  14. 14. 設計や問題意識の共有は難しい • 曖昧な説明していませんか • 「順番に処理」 • 「フワッとフェードインしてきて」 • 人によって意味が違う・・ • 視覚的・感覚的・並列的 → 言葉で表せない • ミーティングの時にわかったつもりでも実 はよくわかってなかった件
  15. 15. フローチャート • 1921年 フランク・ギルブ レスが発明
  16. 16. UML • オブジェクト指向プログラミング用の統一モデリング言語 • 90年代半ばにスリーアミーゴスが考案
  17. 17. プロトタイプ / モックアップ • 実物大サイズ模型(動かなく ても良い) • ビデオ • 静止画 • 小芝居 • で設計や問題意識を共有する
  18. 18. シナリオ
  19. 19. デザインドキュメントを書く • 設計や問題意識を共有 • 目的 • 機能要件 • 実装上難しい点 • 設計・実装 • wikiやblogやMLなどを使う
  20. 20. 手分けして作業したい 複数バージョン作りたい
  21. 21. バージョン管理ツールのbranch機能 • % git branch など • バージョン管理ツールは「ある時点とあ る時点の差分」を保存している • 複数人で同じファイルを編集できる • 作業が済んだらmergeする • 複数バージョン同時開発 見えないチカラ:A successful Git branching model を翻訳しました http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html
  22. 22. issueリスト / bugトラッカー • 問題意識を共有 • メモ+TODOリスト+議論BBS+バグ報告+ソースコード管理 の融合 • 何か思いついたら書く、誰かが何とかしてくれるかも • 問題を分割統治
  23. 23. プログラムのテスト
  24. 24. テスト • プログラムをテストするプログラム • 動かしてみなければ正常かどうかわからない • バージョン管理システム上のある時点のプロ グラムが、正しく動くかどうか常に確認した い • テストの方が本体より大きくなる事もある
  25. 25. 自動テスト • 何かする毎にテストが走る • ファイルを保存する • バージョン管理ツールに commitする • 本番サーバーにリリース前
  26. 26. テスト • 正常時テスト・異常時テスト • 境界値テスト • GUIのテスト • 負荷テスト • 単体テスト・結合テスト • テスト駆動開発 • 継続的インテグレーション
  27. 27. 単体テスト・結合テスト • 部品でテストして、全部okなら • 合体させてさらにテスト
  28. 28. テストツール • 大抵のプログラム言語にはテスト用のライブラリがある • Ruby • Test::Unit, RSpec, minitest • Java • JUnit, Selenium • JavaScript • Capybara, Jasmin, mocha, nodeunit
  29. 29. 正常時テスト • Rubyのminitestの例 class TestSkypeChat < MiniTest::Test def test_message body = "hello hello" msg = Skype.message SKYPE_TO, body assert_equal msg.body, body assert_equal msg.time.class, Time assert_equal msg.user, SKYPE_FROM end def test_message_escape body = "hello "'$@&()^![]{};*?<>` world" msg = Skype.message SKYPE_TO, body assert_equal msg.body, body assert_equal msg.time.class, Time assert_equal msg.user, SKYPE_FROM end end
  30. 30. 境界値テスト • 例えば • 北緯91度、東経181度など異常な値が入 った時、適切なエラーを返すか? class TestGPS < MiniTest::Test def test_location result = Location.new :latitude => 181, :longitude => 91 assert_equal result, LocationError end end
  31. 31. テスト駆動開発 • 本体実装より先にテストを書く • テストが詳細仕様書の代わり • spec = 動く詳細仕様書 • (個人的に好きではない) • さすがに本体実装が完全にゼロの時はテスト駆 動開発しない
  32. 32. spec require 'bowling' describe Bowling, "#score" do it "returns 0 for all gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should eq(0) end end • rspec(Ruby)の例 • 「∼∼の時、∼∼は∼∼であるべきである」
  33. 33. 継続的インテグレーション • バージョン管理ツールと 連動 • commit毎に自動ビルド、 自動テスト
  34. 34. テストが難しいor不可能な問題 • 結果が正しいか判定しづらい • 画像処理、音声処理、システム内に人間が含まれる、等 • 特別なハードウェアが必要な場合 • ユーザーインタフェース • 人間の入力が必要 • Web系・エンタープライズ系以外のアプリケーションはテ ストツールが少ない
  35. 35. 異常時テスト・負荷テスト • 異常な事が起こった時に自動対応機能が正しく動作するか 試す • 突然ブレーカー落としてみる、ノイズを入れる • 通話中にさらに通話しようとする、等 • web系はツールが多い • Apache JMeter • curl-loader • httperf • ab • 仮想マシンを使う
  36. 36. GUIのテスト • Capybara • JavaScript • Webブラウザを内蔵、クリックやキーボードイベ ント発生 • Selenium • Java • マウスが動く • Sikuli • 例示プログラミング Safx: シミュレータ上でのiOSアプリのGUIテス トをSikuliで自動化する http://safx-dev.blogspot.jp/2013/02/iosguisikuli.html
  37. 37. 電子回路・ハードウェアのテスト • 自動化は難しい • オシロスコープ・ロジックアナライザ • プログラムだけならJTAG ICEで可能 • C言語用のテストツールが使える • LEGOマインドストーム等で治具を自作 する事も
  38. 38. 複数人での開発 • 設計や問題意識を共有したい • 手分けして作業したい • 複数バージョン作りたい • プログラムのテスト
  39. 39. 演習 • JavaScriptとRubyによるWeb版Linda入門(2) http://shokai.org/blog/archives/7848

×