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

39
プログラミング方法論 12ソーシャルプログラミング(2) 橋本 翔(教育実習)

Upload: sho-hashimoto

Post on 21-May-2015

1.201 views

Category:

Documents


4 download

DESCRIPTION

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

TRANSCRIPT

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

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

ソーシャルプログラミング(2)

橋本 翔(教育実習)

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

今日のお話:複数人での開発

• 設計や問題意識を共有したい• 手分けして作業したい• 複数バージョン作りたい• プログラムのテスト

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

橋本翔(28)

• 教育実習生

• SFC博士課程 (増井研究室)

• 実世界インタフェース

• 分散並列/Webプログラミング

• 趣味:プログラミング、料理

@shokai

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

教育実習• 博士号を取るのに必要

• 何言ってるかわからない時は止めてください

• チャットを使おうと思う

• http://chat.shokai.org/

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

(前回の復習)ソーシャル

プログラミング

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

social programming

• たくさんの部品をたくさんの人が作って

• 合体させて、どうにかシステムが動いている

• どういう工夫があるか?

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

social programming

• 部品同士はバラバラの人が作っていて、相談してない

• なぜか統合されて動いている

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

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

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

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)

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

最近のwebアプリケーション

• モバゲーはwebアプリをloadするだけで1GBメモリを使う

• cookpadのModel(DB)数は1000以上、テスト走り切るのに10分以上

• 数十人が1つのアプリを同時に開発

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

• 自分が必要だと各自判断してみんな相談せずに作った部品が、組み合わさってアプリケーションになっている

• どうして数十~数千の部品が組み合わさって動くの?

• どうやって作っているの?

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

複数人での開発

• 設計や問題意識を共有したい• 手分けして作業したい• 複数バージョン作りたい• プログラムのテスト

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

設計や問題意識の共有

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

設計や問題意識の共有は難しい

• 曖昧な説明していませんか

• 「順番に処理」

• 「フワッとフェードインしてきて」

• 人によって意味が違う・・

• 視覚的・感覚的・並列的 → 言葉で表せない

• ミーティングの時にわかったつもりでも実はよくわかってなかった件

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

フローチャート

• 1921年 フランク・ギルブレスが発明

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

UML

• オブジェクト指向プログラミング用の統一モデリング言語

• 90年代半ばにスリーアミーゴスが考案

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

プロトタイプ / モックアップ

• 実物大サイズ模型(動かなくても良い)

• ビデオ

• 静止画

• 小芝居

• で設計や問題意識を共有する

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

シナリオ

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

デザインドキュメントを書く

• 設計や問題意識を共有

• 目的

• 機能要件

• 実装上難しい点

• 設計・実装

• wikiやblogやMLなどを使う

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

手分けして作業したい複数バージョン作りたい

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

バージョン管理ツールのbranch機能

• % git branch など

• バージョン管理ツールは「ある時点とある時点の差分」を保存している

• 複数人で同じファイルを編集できる

• 作業が済んだらmergeする

• 複数バージョン同時開発見えないチカラ: A successful Git branching model を翻訳しました

http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html

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

issueリスト / bugトラッカー• 問題意識を共有

• メモ+TODOリスト+議論BBS+バグ報告+ソースコード管理の融合

• 何か思いついたら書く、誰かが何とかしてくれるかも

• 問題を分割統治

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

プログラムのテスト

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

テスト

• プログラムをテストするプログラム

• 動かしてみなければ正常かどうかわからない

• バージョン管理システム上のある時点のプログラムが、正しく動くかどうか常に確認したい

• テストの方が本体より大きくなる事もある

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

自動テスト• 何かする毎にテストが走る

• ファイルを保存する

• バージョン管理ツールにcommitする

• 本番サーバーにリリース前

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

テスト• 正常時テスト・異常時テスト

• 境界値テスト

• GUIのテスト

• 負荷テスト

• 単体テスト・結合テスト

• テスト駆動開発

• 継続的インテグレーション

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

単体テスト・結合テスト

• 部品でテストして、全部okなら

• 合体させてさらにテスト

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

テストツール• 大抵のプログラム言語にはテスト用のライブラリがある

• Ruby

• Test::Unit, RSpec, minitest

• Java

• JUnit, Selenium

• JavaScript

• Capybara, Jasmin, mocha, nodeunit

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

正常時テスト• 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 endend

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

境界値テスト• 例えば

• 北緯91度、東経181度など異常な値が入った時、適切なエラーを返すか?

class TestGPS < MiniTest::Test def test_location result = Location.new :latitude => 181, :longitude => 91 assert_equal result, LocationError endend

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

テスト駆動開発• 本体実装より先にテストを書く

• テストが詳細仕様書の代わり

• spec = 動く詳細仕様書

• (個人的に好きではない)

• さすがに本体実装が完全にゼロの時はテスト駆動開発しない

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

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) endend

• rspec(Ruby)の例

• 「~~の時、~~は~~であるべきである」

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

継続的インテグレーション

• バージョン管理ツールと連動

• commit毎に自動ビルド、自動テスト

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

テストが難しいor不可能な問題

• 結果が正しいか判定しづらい

• 画像処理、音声処理、システム内に人間が含まれる、等

• 特別なハードウェアが必要な場合

• ユーザーインタフェース

• 人間の入力が必要

• Web系・エンタープライズ系以外のアプリケーションはテストツールが少ない

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

異常時テスト・負荷テスト• 異常な事が起こった時に自動対応機能が正しく動作するか試す

• 突然ブレーカー落としてみる、ノイズを入れる

• 通話中にさらに通話しようとする、等

• web系はツールが多い

• Apache JMeter

• curl-loader

• httperf

• ab

• 仮想マシンを使う

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

GUIのテスト• Capybara

• JavaScript

• Webブラウザを内蔵、クリックやキーボードイベント発生

• Selenium

• Java

• マウスが動く

• Sikuli

• 例示プログラミングSafx: シミュレータ上でのiOSアプリのGUIテストをSikuliで自動化するhttp://safx-dev.blogspot.jp/2013/02/iosguisikuli.html

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

電子回路・ハードウェアのテスト

• 自動化は難しい

• オシロスコープ・ロジックアナライザ

• プログラムだけならJTAG ICEで可能

• C言語用のテストツールが使える

• LEGOマインドストーム等で治具を自作する事も

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

複数人での開発

• 設計や問題意識を共有したい• 手分けして作業したい• 複数バージョン作りたい• プログラムのテスト

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

演習

• JavaScriptとRubyによるWeb版Linda入門(2)

http://shokai.org/blog/archives/7848