ちょっと最近,ドタバタしてて twitter だと腰を据えて話せないなと感じたので,ちょっと最近のTDD 議論についてちゃんと僕の気持ちを書いてみようと思います.
これは僕が"今"感じてる事とか考えている事を書いているだけですので,誰かを論破したいとか,誰かを説得したいという意思は無いです.
本当に裏とかはなく,純粋に「"庄司嘉織"という人間は"今この時"にこういう事を感じてこういう事を考えた」というだけです.
もちろん明日には考えが変わるかもしれないし,逆に過去の発言とは違うかもしれませんが,「最近はこう感じている」という事をちゃんと書いておこうと思いました.
id:babie さんにちゃんと返事をしていなかったので,まずちゃんと返事をしておこうと思います.(遅くなってしまってすいません)
@kakutani は興味なくても、あのスライドだと @yoshiori の誤った考え方(である可能性がある)に、権威付けを与えている。「@kakutani @t_wada 直伝だ」と見える。この議論いかんであの言が偽だったら、@yoshiori はスライドを訂正した方が良い。
http://twitter.com/babie/status/9468960884
これは権威付けをしたいという気持ちは本当になく,感謝とリスペクトを含めて出していました.
また,もう一点,僕でもそうやって発表者に聞いて教えてもらったりしてるので,みんなも恐れないで聞いてみると親切に教えてもらえるよというのを伝えたくて入れています.
(本当に悩んだので両人にいちおう承諾を得ました)
もう、俺の師匠として @kakutani と @t_wada の名前を出さない方がいいのかなぁ…… リスペクトしてるから感謝の意味も含めて出すようにしてるんだけど、二人の名前を出して二人に迷惑かかっちゃってもアレだしなぁ
http://twitter.com/yoshiori/status/9109219107
@yoshiori 別に構わないですよ。名誉なことです。
http://twitter.com/t_wada/status/9109350418
@yoshiori なんのことわりもなく書籍のあとがきに書かれたこともあるので平気:-)
http://twitter.com/kakutani/status/9116364567
と,言ってもらえたので資料に入れさせていただきました.
次に
@yoshiori 「オレオレTDD」を広めるなら、但し書きを付けるなどの、誠実な対応を望みます。
http://twitter.com/babie/status/9470015080
ですが,副題に「"僕"(とドワンゴ)のXP」と入れている事で僕は僕自身が理解した XP や TDD について話しをするという事になると感じていました.
さらに発表の最初で
方向を示し(一周目),道を通す(二周目)の人たちがいた
僕ら(三周目)がすべきは高速道路の設置であって,車輪の再開発では無い
先人が学んだ事や感じた事は本やブログにいっぱいあるので,
僕らはさらにそれを読み実践し,感じた事や起った事をまた残そう
という話しをしました.
で,「今日は僕がこの一年でやった事,感じた事を話します」と.
僕が僕の言葉で僕の感じた事や学んだ事を話しているので間違った理解があるかもしれません(むしろいっぱいあると思います).
プレゼンの時は「と感じます」とか「と思います」と発表したのですが,資料にそれを書いてしまうと冗長なので書いていません.すいません.
ただ,"僕"が"僕"の言葉で"僕"の理解した事,感じた事,考えた事を発表するとそれはある意味すべて「オレオレxxx」になってしまうと思うのですがどうでしょうか?
逆に「オレオレxxx」にならない為には自分の主観を入れずに引用だけで話すしかなくなってしまうと思うのですが……
"僕は" TDD は開発手法であって,テスト手法では無いと感じています.
テスト手法としては不十分だと思います.
ここでちょっと言葉の難しいところなのですが,
「TDD はテスト手法としては不十分だけどテスト手法である」
「TDD はテスト手法としては不十分だからテスト手法ではない」
どちらでも良いと思っているのですが,今まで僕自身で経験したり人に話したり相談された経験から"僕は"「テスト手法ではない」と言ってしまった方が良いと感じました.
僕が一番最初に id:kakutani に相談したのもこの台詞だったと思いますし,また僕も一番聞かれる質問なのですがどうしても最初は UnitTest で網羅的なテストを書こうとしてしまって手が止ってしましました.
TDD の話しをしていると,どうしても言われるのが,
「TDD やってたらテストの工程はいらないんですね?」
「テスト計画もなくていきなりテストを書くのか?」
的な事を言われます.
"僕は" TDD をやっていてもテストの工程は別に必要だと思ってますし,その工程ではちゃんとテスト計画もすべきだと思っています.
というような経験や考えから"僕"は「テスト手法ではない」と言ってしまった方が良いと感ています.
むしろ,TDD で開発するのは,
「emacs で開発するのか vim で開発するのか?」
「Eclipse で開発するのか NetBeans で開発するのか?」
くらいの違いだと思っています.
チーム内では揃えたほうが良いという事も含めて.
(エディタや開発環境もチーム内で揃っていた方がペアプロとかしやすい)
品質管理のテストを一緒にしたらいけないのかどうかも聞かれた事があるのですが,"僕"は一緒にすべきでは無いと思います.
UnitTest 的なものが一緒になってしまうとどうしても仕様変更時のメンテナンスコストが高くなってしまいます.
(もちろん,テストの工程ではメンテナンスしなくてはいけませんがそれは上記でのべたように別に設けるべきだと思っています)
また,特に DB と連携する部分などで如実に SlowTest の問題が発生してしまいます.
メンテナンスコストの肥大化や SlowTest のせいで逆に TDD がやりにくくなっては本末転倒だと思います.
完全に結果論なのですが,id:babie をはじめ色々な方の意見を聞く事が出来たので僕にとってはとても良かったと思っています.
僕はそもそも,
「TDD はテスト計画をせずにテストしてしまうから……」とか「品質管理のためには……」とか言われるとなぁ TDD はあくまで"開発"手法であって、テスト手法では無いんだよね。もう、TDDで品質があがるって啓蒙するの止めちゃえば、いっそ変な誤解が広がらないんじゃないかなぁ。
http://twitter.com/yoshiori/status/9102087388
という考えから「テスト手法ではない」という発表をしたので,
逆にこの「テスト手法ではない」という考えが広まってしまって凝り固まってしまってしまうような事になってしまったら,
「ヨシオリはああ言っているけど,言いすぎだ!!間違っている!!」
と発表してもらえればなぁと思います.
(もしも世間がそれで凝り固まるくらい開発のための TDD になってくれると個人的には嬉しいのですが)
まず、大前提として、純粋に僕が TDD として学んだ事、感じた事を発表したので TDD という言葉を使いました。
(BDD としては学んでいないので)
で、それとは別になりますが、何年か前に BDD という言葉を知った時には BDD については TDD に対する混乱を名前を変える事で解決しようとしてるとしか感じず、
(そしてそれは似た様な事を表す別の言葉が出来て逆に混乱の元なのでは?)としかとらえていなかったのてちゃんと学んでいませんでした。
蛇足ですが、逆に今回の件で興味が出たので BDD 学ぼうと思います!!
enum ってコンストラクタ持てるの?
持てる。余裕。そして便利
インスタンス制御クラスもシングルトンも enum で
http://d.hatena.ne.jp/amachang/20100215/1266245521
ぶっちゃけただのクラスなので、あんまり知られてないけど,
コンストラクタどころか任意のインターフェースの実装も出来るし,
自分で抽象メソッド定義して実装する事も出来るよ!!
enum Hoge implements Runnable{ FOO("foo"){ @Override public void run() { // 何か処理 } @Override public String getAddress() { return address; } }, BAR("bar"){ @Override public void run() { // 何か処理 } @Override public String getAddress() { return address + "bar"; } }; String address; private Hoge(String address){ this.address = address; } abstract String getAddress(); }
enum 恐しい子////
というような話しとか,Exception まわりとかも WEB+DB Vol.52 に纏めてあるので,
良かったら暇な時に読んで感想とか聞かせてくだしあ><
http://gihyo.jp/magazine/wdpress/archive/2009/vol52
わけのかわらないタイトルですが,そのままです.
import sys;from itertools import ifilterfalse, count;[globals().__setitem__('compile',lambda bf_src : '[globals().__setitem__("dx",0), globals().__setitem__("dseg",[0] * 32768)] '+bf_src.replace('[',' and [ifilterfalse(bool$( dseg#__getitem__(dx) != 0 and [ True ').replace(']',' ] for i in count()))#next() ] ').replace('.',' and [sys#stdout#write(chr(dseg[dx]))] ').replace('+',' and [dseg#__setitem__(dx$dseg[dx] + 1 )] ').replace('-',' and [dseg#__setitem__(dx$dseg[dx] - 1 )] ').replace('>',' and [globals()#__setitem__("dx"$dx + 1 )] ').replace('<',' and [globals()#__setitem__("dx"$dx - 1 )] ').replace(',',' and [globals()#__setitem__("dx"$ord(raw_input(">")[0]))] ').replace('#','.').replace('$',',')),sys.stdout.write('from itertools import ifilterfalse, count;' + compile(sys.argv[2])) if sys.argv[1] == '-s' else eval(compile(sys.argv[1]))]
takano32 のこれを見て
http://taka.no32.tk/diary/20060908.html#p01
と思って書いてみました.
yoshiori@yoshiori-ubuntu [3]$ python bf.py '>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.' Hello World!
こんな感じになるのですが,これだけだと面白くないので,コンパイルしたソースも表示出来るようにしました.
引数に [-s] を追加すると中間コード(Python-oneliner)が出力されます.
上記の Hello Workd! を表示する bf は下記のようにコンパイルされます.
yoshiori@yoshiori-ubuntu $ python bf.py -s '>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.'
import sys;from itertools import ifilterfalse, count;[globals().__setitem__("dx",0), globals().__setitem__("dseg",[0] * 32768)] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx - 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [sys.stdout.write(chr(dseg[dx]))] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx - 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx - 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx - 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [globals().__setitem__("dx",dx + 1 )] and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [globals().__setitem__("dx",dx - 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [sys.stdout.write(chr(dseg[dx]))] and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True and [dseg.__setitem__(dx,dseg[dx] - 1 )] ] for i in count())).next() ] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [dseg.__setitem__(dx,dseg[dx] + 1 )] and [sys.stdout.write(chr(dseg[dx]))]
これで,「難解プログラミング言語」は読めねーよ!! って人も読みやすくて有名な Python に変換されるので良かったですね!!
ちなみに id:kazuhooku のマジメに素数探索を実行すると
1分くらいかかります.
yoshiori@yoshiori-ubuntu [3]$ time python bf.py '>++++[<++++++++>-]>+++++++[<++++++++>-]<+>+++++++++>>++++++++++[<++++++++++>-]<--[>[-]<[->+>+<<]>>[-<<+>>]<-[>[-]<<[->>+>+<<<]>>>[-<<<+>>>]<+[>>[-]>[-]<<[>+>+<<-]>>[<<+>>-]<>[-]+<[>-<[-]]>[-<<<<[->>+>>+<<<<]>>>>[-<<<<+>>>>]<<+>>]<<-<-]> >[-]+<[[-]>-< ]>[-<>>[-]+<<<<[-]+>>>]<<<-]>>>> >[-]+<[[-]>-< ]>[-<<<<<<<<.>>>[-]++++++[<<++++++++>>-]<<.>>++++++[<<-------->>-]<<<<.>>>>>>>>>]<<<<<<->>[-]<<<[->>+>+<<<]>>>[-<<<+>>>]<>+<[[-]>-<<<->>]>[-<<<+++++++++<->>>>]<<]' 97 89 83 79 73 71 67 61 59 53 47 43 41 37 31 29 23 19 17 13 11 07 05 03 02 python bf.py 57.01s user 0.04s system 99% cpu 57.496 total
java-ja 温泉開催します.
Python 温泉(PySpa)にインスパイアして開催している,というか,
PySpa が大体 6 月と 10 月開催なので 3 月くらいにもやらないの?
と思ったら,id:voluntasに「メンドイ,お前がやればいいじゃん」
と言われたのが元なので PySpa と場所も期間も変りません.
違いは「お酒飲んでもいいよ」って事だけです.
なので,ほとんど PySpa のパクりになっちゃうけど,纏めると以下になります.
@yamashiro @yoshiori という意見がありますよ RT @tomerun: @voluntas 参加資格のところがよく分からなかったのでとまどった、というのがあります
http://twitter.com/voluntas/status/8280172789
簡単に言ってしまうと
成人のチンコクラスタなのですが,もうすこし説明すると
成人男性(何かあっても自分で責任がとれる人)
です.
言語とかも関係ありません.
お金が無い人!! 安心してください!!
無線 LAN 完備,3 日間,朝晩飯付きで 24 時間温泉に入れて 2 万円は高くないと思うのですが,
相場として高い安いは別にしても払えなくて参加出来ない人がいるのはかわいそうだよねと,
参加したいっていう折角の意気込みを「お金」がネックになっちゃうのは不毛だ!!
っていう男気溢れる人が参加費を負担してくれちゃいます!!
なんて太っ腹!!!
最初はそういう学生とかにも参加して欲しいよねって事で立ち上がったのですが,
別に学生じゃなくても良くね?って事で学生じゃなくても申し込めるので,おきがるにどうぞ!!
| id:t_yano | http://d.hatena.ne.jp/t_yano/20100105/1262668611 |
| id:warufuzaketaichi | http://d.hatena.ne.jp/warufuzaketaichi/20091226/1261833543 |
2010/3/20, 2010/3/21, 2010/3/22の2泊3日
熱海/来宮 芳泉閣
貸し切りです
すでに予約済み
2万円です.
余った金額は PySpa と協力して旅館の設備(LAN環境など)にまわします.
Java 書かなきゃいけないとかの縛りもないので,みんな好き勝手に書いています.
また,ボドゲとかが大好きすぎる人間が数人いるので,大ボドゲ大会が開かれたりもしました.
お酒が入るのを少し心配していたのですが,そもそもその場で寝ちゃってもいい会場なので,
何も問題無く終りました.
という事で,是非申し込んでくだしあ><
ドワンゴのパブリックイメージってどうなんだろうねーって
このまえ社内で話してました.
「汚ない格好でコンビニ袋さげて時間関係なく出社」なんて
2ch で書かれてたりしましたし,
「ふざけてる」,「遊んでる」,「破滅」とかまぁ,そんな感じかなぁと……
で,まぁ,大体あってます.
あってるし,否定しないし,しかも,
そう思われてるのを寧ろカッコイイと思ってしまう
駄目男気な人の集りなのです.
ただ,まぁ,本当にふざけて遊んで破滅してるだけだと何も出来ないので,
実際の開発がどんな感じで進んでるのかをちょっと発表してみようと思います.
(僕は裏方の開発なのですが,サービス側の開発の話しも入れる予定)
「java-ja 第1回チキチキ 地方巡業withひがやすを飲み会in富山」で発表した時に,
id:t-wada からこんなブコメを頂きました.
良い発表でした! 資料もすばらしい。ドワンゴでの試みをぜひ他所でも今後聞きたいなと思いました。私は転ぶメタファを優先するから三本柱というけど、三種の神器の方が語呂としてはカッコいいな。
http://b.hatena.ne.jp/t-wada/20090408#bookmark-12852198
このころから漠然と「あぁ,さらにプロジェクトが進んだら続きを話したいなぁ」と
思っていました.
で,次にJJUG で「15分で0からCIまで用意してTDD開発」というのをやりました.
(これはライブコーディングだったので資料ありません><)
今回の発表が集大成的な感じになるんじゃないかなぁと思っています.
TDD,CI と開発手法的なものが続きましたが,今回はそれにプラスして
タスク管理と見積りの話しをしようと思っています.
遅れって書いてるとネガティブなイメージとか卑屈っぽいイメージで取られてしまうかもしれませんが,そんなつもりは毛頭ありません!!
という感じです.
方向を示し(一周目),道を通す(二周目)の人たちがいたからこそ
高速道路の設置が三周目で出来る事を伝えられればいいなぁという
前向きどころか前のめりな三週目です.
方向を示し,道を通してきた人達がいるからこそ,アクセル限界まで踏み込める今の環境と,さらなる高速化のための高速道路の設備的な発表です.
で,XP なんですが,正直僕がプログラマになったころはプログラムの文法やらアルゴリズムを覚えたり考えたりするのが精一杯で,XP とか アジャイルとかは
「何言ってるの??」的なスタンスでした.
ちょっと胡散臭い宗教的な目でも見てました.
でも,実際にやってみると,そうじゃない,例えそうであっても,その宗教の崇める神はコードであり,そこから生まれるソフトウェアであり,さらにそこから生まれる価値なんだという事がわかりました.
なので,逆に昔の僕みたいな考えの人にも是非聞いてもらいたい感じです.
なんか気がつけばサブチームのリーダになっていたので,今まで苦手で逃げてきていた,タスク管理や見積りもしなくてはいけなくなりました.
覚えなくてはいけないのでスキルとして身に付けるために,社内で有志を募って
「アジャイルな見積りと計画づくり」の読書会を開いて勉強しつつ,タスク管理や見積りをしました.
やっていくうちに感じた
「お,これってパフォーマンスチューニングなんじゃね?」
とかも含めてどうやってタスク管理しているのか,見積りしているのかを発表したいと思っています.
(今のところ)特に箝口令とかないので,話せるギリギリまで話すつもりです.
成功の部分だけでなく実際にやって失敗したところとかも含めて話しますので
是非,聞きにきてください!!><
2010年2月19日(金)の 13:10〜14:00 ,B(夢扇)で話します!!
コンテンツ委員なしんちゃんに
「なんぞwww」と微妙なコメントでお勧め(?)いただいていますが,
デブサミで「【13-A-6】ひよこクラブ ver.Engineer」やります!!