********************************************************************** セッションS1-b 分科会 テーマ:「ワークショップ形式による開発プロセスの振り返り2」 コーディネータ:木元峰之 日時:2008/9/4 20:30〜23:00 参加人数:24名 ********************************************************************** 司会「5チームくらいに分かれてください」 (以下「」は司会:木元氏の発言) テーブルを島状に並べ直して、 5チームに別れます。 1チーム:5人 2チーム:5人 3チーム:4人 4チーム:5人 5チーム:5人 電卓のような基板を見せながら 「ではやることを説明します」 「去年参加された方は何人くらいいらっしゃいますか? 2人?」 「2人ならそれほどハンデにもならないでしょうし、そのままいきましょう」 各班に一つずつ電卓のような機器を配る 「この機会に2桁の数値を入れます。 すると内部で計算が行われ、4つの数字が出てきます どういう計算・アルゴリズムで行われているか、当ててもらいます」 まず時間制限と入力回数に制限があります。 入力回数は98回とします。」 「去年は50回にしたら、みんな怖がってなかなか入力しなかったので・・」 「入力データと出力データはノートを配りますので、そこにメモしていってください」 ○課題1のルール 2ケタの数値を4つ入れる input func out A -> f1 -> a B -> f2 -> b C -> f3 -> c D -> f4 -> d 出力は±3桁の整数 f1 〜 f4を当てる 入力制限 : 98 時間制限 : 20分 ・操作 ・数値を入力してEnter、±3桁の出力が4つが表示される ・上 前回入力ログ ・下 入力モードへ ○課題1-1 (問題コード:5179) ・1回目 (操作練習) input : output 01 : 4 02 : 3 03 : 2 04 : 8 ・2,3回目 (以下、4チーム内での操作と会話) まずは境界値から入力してみましょうか? 00 : 000 00 : 000 00 : 000 00 : 000 (結果がすべてゼロなので、入力値 × 係数が行われている?) 99 : 198 99 : 099 99 : 198 99 : 198 (2倍か入力値そのまま。どの係数がどの入力値に対応してるかは分からない) 各桁に1を入れてみてはどうでしょう? 00 : 000 00 : 000 00 : 000 01 : 002 (d = 2D ?) 00 : 000 00 : 001 01 : 000 00 : 000 (入力と出力の位置がずれている。b = C ?) 00 : 002 01 : 000 00 : 000 00 : 000 (a = 2b?) 01 : 000 00 : 000 00 : 002 00 : 000 (c = 2a?) 入出力の対応から a = 2B b = C c = 2A d = 2D が有力との結果が得られた 上の式を念頭にいくつか数値をテスト(検算)を行ってみた。 どうやら上記の式で問題ないようだ。 - 上記の解は関数だという前提では正しいけど、完全な証明は無理かもしれない。 - 内部でプログラム的なことを行っている(特定の数値に対してのif等)と 全数値を試してみるまで分からない。 (ひとつ前の入力値などを使われているとさらに難しくなる) - 結局ある程度の数をこなして信頼性高めるしかない? ○課題1-2(問題コード:3577) 「私をどれほど信用するか、能力をどうみるかにもよりますね」 木元氏の善意(or悪意?)や能力をどれほど信じるか、ですね。 (前回と同様に00と99、各桁に1を入力してみることになった。 アルゴリズムを考える前に、ざっと一通り入力してみることになった) 00 : 000 00 : 006 00 : 000 00 : 002 (すべて000になっていない、定数を使っているのかもしれない) 01 : 000 00 : 005 00 : 000 00 : 001 もしかして前回の値を使っているかも、一度チェックしてみませんか? (木元氏が開始前に意味深(善意・悪意等)の話をされていたので、 多少警戒している) 01 : 000 00 : 005 00 : 000 00 : 001 (同じ値なので問題ないようだ) 00 : 002 01 : 006 00 : 000 00 : 002 00 : 000 00 : 006 01 : 002 00 : 003 00 : 001 00 : 006 00 :-001 01 : 002 99 : 029 99 :-093 99 : 099 99 : 002 01 : 008 02 : 005 03 : 002 04 : 004 とりあえず、これぐらいで一回考えてみましょう a = 2B + D これは比較的ラクに出ましたね b = 6 - A (仮) b には定数入ってるかも? (b用の検証) 06 : 038 10 : 000 14 : 010 18 : 010 0 = 6 - 6 (正しい) 一個ずつに検証するの面倒なので、全部の仮定式たてて、 一気に検算を行ったほうがいいかもしれませんね c = 2C - D (仮) cはこれでOKそうですね d = ? dが難しいですね。 全桁にひとつずつ99を入れてみますか 99 : 000 00 :-093 00 : 000 00 :-097 00 : 198 99 : 006 00 : 000 00 : 002 00 : 000 00 : 006 99 : 198 00 : 101 00 : 094 00 : 006 00 :-099 99 : 002 d = 2 - A + C (仮) dもこれで問題なさそうです。 a = 2B + D b = 6 - A c = 2C - D d = 2 - A + C 「早く終わった人たちは自己紹介でもしていてください」 「自信ある人、前に出て紹介してください。」 # 3チームほど挙手 # 5チーム目が成果報告 a = 2B + D b = 6 - A c = 2C - D d = 2 - A + C 「どんな課程でやりました?」 「の前に、各チーム、入力回数は?」 5チーム:10 4チーム:13 3チーム:15 2チーム:12 ・操作の課程のまとめ ・0123、0124、0134・・・などひとつづつ変える ・すべて0を入力 ・ひとつずつ1 ・最小,最大 (境界値) (おおよそどのチームでも同じような操作を行っていた) 「まだ、やりたいですか?それとも別の課題をやりたい?」 --- ほぼ全員が別の問題をやりたいという方に挙手 (ある程度操作方法のセオリーが見えてきていたので、 単純作業になることを嫌っていた雰囲気があった) 「次の問題に行く前に何か気付いた点などは?」 ・離れた箇所でも同じような方法を取ってた、何かセオリーがあるのかも しれない? 「境界値テスト(00,99)やユニットテスト(ひとつずつ1)などは、 ソフトウェアのテストではよくある方法ですね」 ・定数を出すには、とりあえず全部ゼロを入れるとよかった ○課題2(最大値の探索) ・課題2のルール 以下のように12桁の数値を入力すると、数値が表示される。 000000000000 → 00001 最大値を求めよ。 (今回もブラックボックスの解析、 ただしアルゴリズムを推定する必要はない) とりあえずさっきと同様に試してみては。 すべて0(最小値) : 1 (以下、出力の0はすべて表記しない) すべて9(最大値) : 1 、、何か変ですね、、変化が少ないですね。 1つずつ1を入れてみましょう 100000000000 : 5 010000000000 : 5 001000000000 : 5 (以下ずっとずらしても5が続く) では、9ではどうでしょう? 900000000000 : 2 090000000000 : 2 桁をずらしても変化がないので、 数の種類や数に関係しているのでしょうか・・? 連番を試してみましょう 110000000000 : 17 連番だと点数が高くなりましたね 990000000000 : 2 数の種類によっては連番でもダメなようです。 連番のバリエーションを試してみましょう 000000010001 : 5 110000011100 : 17 110000011110 : 17 法則性が見えづらいですね。。 少し方向性を変えていろんな数値を入れてみましょう 123456789000 : 25 123456789000 : 25 987654321000 : 22 123456789123 : 24 かなり点数が上がりましたね、数列に何かあるのかも? 135790000000 : 15 147000000000 : 10 数列違うかも・・・ 数値の種類と数に関係してそうなので、 連番の種類を増やしてみましょう 220000000000 : 2 330000000000 : 17 440000000000 : 2 550000000000 : 2 660000000000 : 2 770000000000 : 17 880000000000 : 17 数値によって違うかも 880000000088 : 32 888654321000 : 76 888854321000 : 76 888884321000 : 75 ここで時間切れ 「各チームの点数を聞いてみましょうか」 最高点は768 「どういうパターンを試してみましたか?」 ・特定の数値だと点数が高いかも(1、3、7、8) ・すべて同じ数を並べる ・桁ずつ調べてみた ・7を重ねるとある程度でかくなる、4桁まで、5桁目で法則性が崩れた ・1378以外でも、2を含めた場合、少し法則性が崩れた。 「今回の目的はアルゴリズムの解析ではなく、最高点の取得なので 手当たり次第に入力する方が賢かったのかもしれませんね」 ○課題3(間違い探し) 「次は間違い探しで・・・ 間違いは20コあります。 時間は・・・途中で聞きながら回ります。」 みんなすごい早さで解いてしまっていた。 (4班は2分ほど、おおよそのチームが数分以内で解けていた) 「間違い探しは、バグを探すのに似てるよね。」 「目立つバグはすぐに見つかる」 「今年は去年ほどうまくいかなかったかも。問題が簡単過ぎましたね。」 「今手に入る他の間違い探しといえば、、 パターン基板がゴロゴロしてるくらいしか・・」 「いっそ、パターン基板を間違い探しにしてみますか?」 一同少し引きつり笑い、、パターン基板のミスで苦しめられたのかも。 ○テーブルごとの感想 1チーム ・プログラムのミスを探すのはよくやってるけど、ブラックボックスは難しい。 ・人の書いたコードのバグを探すのに似てる。くせがあったりとか、 まったく分からないとか。 ・ブラックボックステストは初めてだったので、どうすればいいのか。 ・2番目のがやっぱり一番難しかった。自分たちより点数が高いチームがあった。 どこかで煮詰まってしまっていると、まったく違う解法に気付かなくなることに 気付かされた。 ・闇雲に進みすぎた。戦略が必要だったかも。 ・一人でやっていては行き詰っていたかも。チームでやればできるという体験が できた。 2チーム ・1つ目で、答えが本当に正しいのか調べる方法も探さないといけない。 ・時間が決められている状況だとランダム総当りでいく。 ・チームでいろいろ話合うといい意見が出るのを体験できた。 ・法則性に固執せず、2番目のは早々に諦めた。それが勝因となった。 ・アプローチに徹してひたすら試すのが、いい結果を生めた。 チームの目で問題にアプローチできたのもよかった。 3チーム ・新しいパターンを見つけたときに、うまく発想の転換ができなかった。 ・法則に当てはまってしまうと、別の方法になかなかいけなくなった。 発想の転換が必要。 ・2番目難しかった。もっといい戦略が見つからなかった。 ・2回目の参加でした。去年に比べ2番目のはすごく難しかった。 予想外のことを行った時に不意に点数があがり、発想の転換が必要だと思わされた。 4チーム ・普段数字を見てて先入観をもってしまっていた。周りの人間がプロセスよく やってるのが勉強になった。 ・テスト屋さんの意見を聞いてみたい。 ・一定の考えにとらわれていてた。 ・簡単な問題と難しい問題があって、難しい問題の時に解けないような問題に チームとしてどのように挑めばどうなるか、どうすればいいのか。 ・法則性の発見に固執しすぎた。 5チーム ・ブラックボックステストは初めてできていい経験になりました。 班の人のも勉強になりました。 ・11桁の問題が解けなかったので、悔しかった。簡単な問題探しでは自然と 分業ができていてよかった。 ・答えがすぐに見つからない問題というのは新鮮でよかった。チームワークの 大切さもよくわかった。 ・1番は調べる方向性が見えて。法則にとらわれず、いっそ総当りにいけば よかったかも。 ・どうすれば12桁が最大の数値を手法を見つけたいと思いたいと思ってしまった。 「出展について、ワインバーグの本に教材が載っていました」 「来年以降もいろいろなワークショップを皆さんとやっていきたいです」 「またテスト手法についてはいくつか本が出ているので、今回何か思った点が あれば見てみてください」