この記事は 静岡 Advent Calendar 2019 の 16日目 です。
昨日の 静岡 Advent Calendar 2019 は、
ayumi_hsz さんの 『静岡でCoderetreatを開催した話』です。
皆さんこんばんは。
静岡でエンジニアをしている C# ラブ勢の t2_Kob です。
今日は、
Global Day of Coderetreat 2019 in Shizuoka
ペアプロしながらプログラミングを練習する1日!
今年はCoderetreat10周年!
https://connpass.com/event/147716/
に参加してきた話とペアプロについて、とりとめなのない話をしようと思います。
静岡でだって、勉強したい。
皆さんご存じないかもしれませんが、実は静岡ってそれなりに人口も多く、情報系の会社だってそれなりにあります。
ただの横に長くて新幹線が遅い県ではない のです。
エンジニアだって実はたくさん居るはず...なのですが......居ないのです。
いや居るはずなんですよ? いえ、居ます。
ですが残念ながら地元の勉強会に参加する(参加できる)人はあまり居ません。
個人的に興味のあるイベント(C#, 設計, DDD とか)は少ないし、イベントを主催しても参加してくれる人もあまり居ないし…
(いいなと思う勉強会は東京で19:00開始とかだし...)
と悶々とするエンジニア人生を送っていたところ、
運よく『静岡で素敵なイベントがあるよ』とお声がけいただきました。
Coderetreat...?
知らない人とペアプロする1日。 なにやら面白そうな予感がする。
新たな出会いにも期待しつつ滑り込み参加を決めました。
なんと無料なのにご飯もおやつも出てくるみたい。
すごい・・・
どんな人が参加するんだろう?
美味しいと噂のタピオカドリンクを買おうと思ったらまだ開いてなかった。
悲しみに暮れながら会場にイン😭
思ったより素敵な会場にドキドキしつつ、着席して開始を待ちます。
おっ、少しずつ人が増えてきた…
最終的な参加人数は合計10名強。
なんとなく皆出来そうな予感...! なんかめっちゃ若い人もいる。
皆のスキル感はどうなんだろう?と思っていたら、
日ごろから仕事でプログラムを書いている人は挙手してくださいとのアナウンス。
しかし挙手したのはなんと私を含め わずかに3人。手は挙げなかったけどデザイナーさんも居るようだ。
なんと驚いたことに初学者の方も参加されていた!
・・・ここに来るのにどれだけ勇気が必要だっただろう?
すごいな。
こいつはいろいろな意味で燃えてきたぞ。
Coderetereat is 何?
さて、Coderetereat 本番が始まります。
Coderetereat とは、みんなで『ライフゲーム』をペアプロするお祭りのこと。
より詳しい Coderetereat に関する話については、
昨日の Calendar を担当いただいている ayumi_hsz さんの 『静岡でCoderetreatを開催した話』が詳しいので、ぜひそちらを参照ください。
ライフゲームとは、将棋盤や碁盤のようにマス目で区切られた世界の中で、
ターン毎に特定のルールに従って生命が生まれたり死んだりするもの。
↓の黒いマスが生命で、過密すぎると死んじゃう、過疎すぎても死んじゃう💀
User:Arbol01 [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)]
これ ↑ を作ります。
昔からあるお題だけど、考えれば考えるほど奥が深い。
考えたいこともやりたいことも沢山あるのに、
Coderetreat では 1回のペアプロ時間はたったの45分 しかない。
しかも 毎回違うペア になって、コードも1からやり直し というルール。
納得いくまで何度でも設計しなおして作って壊してじっくり考える派としてはすごくつらい条件だ。
設計技法を駆使してモデリングしたいけど、それでは間に合わないだろう。
...
あれ、そもそもペアプロの相方さんのスキルって具体的にどんな感じなんだろう?
ていうかエンジニアさんなの? どのプログラム言語触れるの??
ペアプロはじめました。
1人目のペアとなった方は、まさかの ガチ Vimmer さん(静岡にも実在した)。
かつ貴重なエンジニアさん。ただでも貴重なエンジニアがいきなり2人揃ってしまった。
PC は私のものを使うことにしたが、とにかくキーボードに苦戦している様子。
すまない、私の環境は VisualStudio 2019 + 英語キーボードなんだ・・・(中華PC)。
(おかげでキーボード談義、入力方法談義でとても盛り上がった)
...
ペアを組んだ方がC#を扱えるエンジニアさんだったこともあり、言語はサクっとC#に決定。
まずはじっくり設計をしていく。
・・分かってる。そんな事をしていたらほぼ確実に間に合わない。
45分間で動くものを作るためには、スモールスタートをしなくては難しい。
まずは小さく作って、インクリメンタルに改善をしていくべきだ。さもないとビックバンリリースを迎えて失敗するか、
下手をすればそもそも間に合わず成果が0になってしまう。
・・・けれどやる気があってゴリゴリ進める感じの方だったので、何となく言い出せなかった(ごめんなさい)。
基本的にサポートに専念する方向性にして、バリバリ書き進めていただく。
あっ、その設計だとこの後辛いよ..!
...
途中でドライバーを交代しつつ進めていく・・・
......
ピピピピピ...!!
記念すべき第1回目のペアプロは、
2重ループで碁盤の目の「データ構造」を再現したところでタイムアウトした。
なんてこった、画面に何も表示できていない。
10人中わずか3名しかいない貴重なエンジニアが2人そろって出来上がったのは、何も表示できないただの2重ループ。
TDD もしようとしてプロジェクトは作ったけど使えなかった。
遠くで例のライオンさんのスタンドがこちらを見ている気がする。
――――お前、サバンナだったらもう死んでるぞ――――
ペアプロ2回目は非エンジニアさんと。
駄目だ駄目だ。
楽しかったけど何も作れなかった。
相手のスキルやスタンス、テンポ、空気感が分からない中では
やはり予想通りスモールスタートしないと太刀打ちできない。
今度は打って変わって、非エンジニアの方とペアを組むことになった。
何の言語なら触れるだろうか?
おお、Python いけるんですね!
(私は過去にちょっとしたバッチを組んだことあるくらいだ。しかもVer.2。
・・というか、Python を触れるならエンジニアを名乗っても良い気がする。)
相手と自分にスキル差がある場合はどうする?
自分の使える C# にして、自分だけでゴリゴリ書いてしまう方法もあるけど、これはペアプロだ。
ペアで成果を出せなければ、何のために参加したのか分からない。そんなのは一人でやればいい。
相手の方だって、きっと何かを変えたくて参加しに来てくれているハズだ。
不毛の地、静岡でわざわざ勉強会へ来てくれた。そんな人を切り捨てたくはない。慣れている Python でやりましょう。
いや、やらせてください。絶対に勉強になるから。
■ ちょっと脱線: メンターとしてのペアプロ
過去、いろいろなエンジニアさんを見てきた。
自分も人のことを言えた義理ではないけれど、
彼らを見ていて思うのは とにかく教え方が下手 だ、ということだ。
それが人に教える必要が生じてくる中堅~ベテランであったとしても。
相手がどこに詰まっていて、なぜ理解できないのかが理解できない。
彼らの中では分かっていて当たり前なのだ。
・・・本当に?
入門的な内容だろうと、私も昔は分からなかった。
彼らだって、昔は分からなかったハズだ。
相手の知識がどの程度あって、どこまで理解できているのか?
それを確認しないから、いつまでたっても分かり合えない。
だから何度も同じことを質問されるし、返す態度も素っ気なくなる。
新人さんは聞きたくても聞けなくなってしまう。悪循環だ。
自分が理解できなかったときのこと、それを理解できた時のこと。
それを思い出すだけでいいハズなのに。
先輩に一度にまくし立てられたって、すこしも理解できなかったでしょ?
・・・もしかすると、先輩エンジニアも分かっていないのかもしれない。
なぜそう書くべきなのか?という問いにまで答えられるエンジニアは、
少なくとも、静岡には、、多くない…東京なら、違うのだろうか?
―――――――
脱線した話をペアプロに戻す。
設計なんて最低限でいい。
スモールスタートだ。小洒落たロジックなんていらない。
まずはコンソールに文字を出そう。
そして文字が表示出来たら一緒に喜ぼう。
…これでビッグバンリリースを目論んだ、第1回目のペアプロよりも大きく先に進んだ(!)
ほんの1mmしか進んでないけど、成果 0と比較したら ∞ 倍の成果だよ。
・・本当は、この先を考えたら画面とデータ構造を分離しておきたい。
けれど相手はまだあまりプログラムに詳しくない方だ。
それならやはり画面=データ構造となっていた方が理解しやすいだろう。
となるとそうだな、2重ループか... それはそれで茨の道だけど――――
2次元配列は知ってる? ならとりあえずそれで組んでみよう。
組めたら、次は2重ループで何か文字を表示してみよう。
ほら、なんとなくライフゲームっぽいマス目が見えてきた!
じゃあ次は、周りのセルを1つずつ確認していこう。
このあたりでタイムアップしたことを記憶している。
残念ながら完成はしなかったけど、1回目と比べて大きく前に進んだ。
ほら、画面にマス目出てるし!
(後から思ったけど、2重ループはやはり失敗だった。コンソール出力だと好きな位置に書けないのが辛い。)
ペアプロ3回目
3回目はデザイナーさんとペアプロ。
HTML + JavaScript ならいけるとのことなので、迷わず即決。書いてもらおう。
ちなみにペアプロ1回目、2回目ともに完成とは程遠い状態だったようだ(同じで少しホッとする)。
会話してスキル感を確認したところ、
どうやら完成までたどり着くのはちょっとだけ厳しそうな予感がする。
なら、まずはゴールを『1ターンだけのライフゲーム』に絞ろう。
ゴールを共有し、スモールスタートで合意を取りバリバリ書いていただく…
どうだろう、このままいけそうだろうか?
手が止まるようなら、一度紙で考えよう。
クラウドサービス全盛期の時代だが、考えをざっくりまとめるときは、紙に書くと良い。
こういう確認をしたいとき、「分かった?」 と聞くと 「はい」 と答えてくれるものの、
実際に書いてもらうと理解できていない ことがよくある。
中には聞くことに引け目を感じていたり、分からないことを分からないと言えない人も居る。
また 「聞いて分かった」 と 「出来る」 の間には大きな壁がある。であれば、どこまで出来るのかを図るには 書いてもらうのが一番はやくて正確だ。
図やコードを書いてもらうと、それを書くときの立ち振る舞い によって、理解の度合いが瞬時に分かる。
詰まったところだけではなく、姿勢や表情が焦りに変わったところや、指が宙で踊ってしまったところが分からないところだ。他の方法としては、説明をしてもらうのも良い。だけどそれだと空中戦になりがちだ。
何かを書いてもらったほうが 「ここが」分からない ということが明確になる。
また分からないところに至るまでの理解度 も図れるのでぜひおすすめしたい。なお、これはそもそも聞き方の問題でもある。
事あるごとに「分かった?」と聞かれるのはかなりのプレッシャーだ。
経験上、「いけそう?」と聞く方が少しいい結果になる。・・・こういう、非言語能力を使って相手の理解度を感じ取れるエンジニアって、実は少ないのかもしれない。。(きのせい?)
画面だけ見てると色々なものを取りこぼしちゃうよ。
さて続きだ。
...
2重ループに苦戦しつつも画面を出せた!
よし、1ターンだけでいいから動かせるようにしよう。
でもターン経過させるのって大変ですよねー。
とりあえず画面をもうひとつ作っちゃって、結果はそこに出してみません?
....
......
よし実行だ!
きた...! 動いた!!
たったの1ターンだけではあるけど、紛れもなくライフゲームだ!
もちろん完璧ではないけど、(個人的には)限りなく完成に近い。
相手の方もこころなしか嬉しそうだ。
動くって本当に嬉しいよね。
スモールスタートしてインクリメンタルに作っていけば、
何回もその嬉しさと達成感を味わうことができる。
それって素敵じゃない?
ペアプロ4回目
4回目も非エンジニアの方とのペアプロだった。
なんと、プログラムの勉強用サイト?を使って、Ruby でプログラミング入門中らしい(すごい!)
手を付ける前に、スキル感を確認するために今までの話を聞いてみよう。
・・どうやら、今まで組んだペアの相手が言っていること、やっていることが全然分からなかった模様。
もしかして実質見てるだけだったのでは...?😱
......
違う違う! これはペアプロのイベントなんだよ。
スキル差があるからって一人で進めたら、それはもうペアプロじゃない。
勇気を出して参加してくれたのに、よくわからなかったという感想だけで終わってほしくない。
少しくらい、楽しかった!とか、ちょっと分かった! みたいなポジティブな感想を持って帰ってほしい。
そうすれば、きっとこの先も前に進める。
プログラムって面白いんだよ!
よし、入門中の Ruby を使って書いてもらおう!
(主催者側みたいなノリだ…)
スモールスタートしてインクリメンタルに進めるいいところは、
どこが分からないのか、どこまで分かるのか、ひとつひとつ確認しながら進めやすいことだ。
スキル差があったり、勉強を主眼に据えたペアプロに向いている。また ペアプロでスキル差がある場合は、スキルの低いひとにドライバーを任せるほうがよい。
経験上、スキルの高さや慣れによって生じる「思考速度の差」によって、流れるように進む内容に着いて来られないパターンが多いからだ。
エンジニア第六感の差、と言い換えても良い。(キュピーンってやつ。相手が意図するところまで分かる。)
ドライバーがペアプロに慣れていれば今の考えを常時口に出して共有し、質問や確認をしながら相手に合わせて進めることが出来るが、即席ペアでは難しいだろう。
そんなこんなで作業開始。
まずは相方さんが、ライフゲームを実装していくにあたって必要なスキルをどこまで持っているか確認する。
配列は一応やったけどあまり覚えていないらしい。
よし、じゃあまずは勉強サイトで習った配列を思い出してみよう!
配列がもし理解しきれていないなら、まずは1次元のものを紙に書いて考えてみよう。
なんとなく分かってきた?
ならお試しで、紙に書いたものを for 文を使ってループで書いてみよう。
できた!じゃあループの中にコンソール出力を書いたらどうなるだろうか?
ほら、画面に出てきた!
じゃあ次は for 文をもう一つ中に入れてみよう。
どんな風に動くと思う―――?
予想通りうまく行った!画面にマス目っぽいのが出ている!
そしたら周りのセルに生命がいるか調べてみよう。
まずは上下左右だ!
おっ、値取れたね!😁
......
ピピピピピピピ!
今回のペアでも最後まで作ることはできず、
2重ループの中で、隣接するセルの様子を確認できるところまでで終わってしまった。
それでもそれなりに楽しんでもらえたようだ。
そりゃそうだ。何をやってるか分からないのをただ横で見てるよりも、
自分で手を動かして、少しずつでも出来上がっていく達成感を味わうほうがずっといいよね。
仕事と関係ないんだし、45分で完成しなくたっていいじゃないの。
完成してもお金もらえるわけじゃないんだしさ。
ペアプロ5回目(ラスト)
5回目はデザイナーの方とのペアプロ。
どうやら HTML と JS は書けるらしい。でも何となくどうぞどうぞ感が出ている(気がする)。
遠慮しないでいいよ。HTML + JS でやろうよ!
まずはいつもどおり前回までの話を聞いてみる。
・・・なんと 『見てるだけ』 だったらしい。
嘘・・・だろ・・・?
あっ、ホワイトボードに張り出された FDL(Fun-Done-Learn, ふりかえり手法) のふせんにも、『見てた。』って書いてある・・・
…?これってペアプロのイベントだったよね…? 自信なくなってきた。
それにしたって、このまま帰って貰っては静岡エンジニアの名折れ。
折角参加したんだから、せめてちょっとくらいワクワクしようよ!
―――――
方針はさっきまでと同じだ。
設計も2重ループでやろうぜ、で十分。
ガンガン(スモールスタートで) いこうぜ!
HTML と CSS がすごい速度で書かれていく。
一瞬でマス目が出来上がった。これは最後までいけるかもしれない。
JS はあまり得意ではないようだ。
大丈夫、サポートは任せてくれ!(ググるから。)
画面ができたらあとはロジックを書くだけだ。
2重ループが苦手?ならまず紙に絵をかいてからやろうぜ!
...
......
画面上のマス目が白と黒で塗り分けられて、
とうとう画面にマス目と初期配置が表示出来た!
さて次は書き換えだ。苦節5回目にしてとうとうここまできた。
あとは、
・次のターンでどう生命が生き死するか計算し、
・次のターンに移る(= 画面を書き換える)
だけだ。
まずは計算だけしよう。その値を使ってセルを書き換えるのは後まわしだ。
一度に複数のことを考えようとすると失敗しやすい。
まだあわてるような時間じゃない。
1ステップずつ確実に進めるんだ―――
エンジニア経験を積んで先のことが見えるようになってくると、樹形図のようにやるべきことが浮かんでくるようになる。
すると、この先でこれが必要になるからまずはこれとこれを作ろう と考えがちだ。こういった考えはペアプロと相性が悪い。
ペアプロやモブプロの核は、自分の考えていることをつぶさに公開することにある ためだ。
先が見えすぎていると、範囲が広すぎて言語化が難しくなる。
仮に言語化できたとしても、空中戦であれもこれもという青写真を共有することには困難が伴う。そんなときは やるべきことを付箋紙に書いて貼り出す とよい。
この付箋紙を話し合って優先度順に上から並び替えれば、誰の目にもやるべきこととその順番が明らかになる。
こうして問題を可視化していくことで、ひとりの脳内にしかなかった樹形図がビジュアライズされ、洗練されたものとなる。あとは分割されたタスクを優先度順にスモールスタートでひとつずつ倒し、ループを回すたびにタスクを見直す。
作業にリズムが生まれるのでペアプロやモブプロをするときに使うと非常に有効だ。
そうやって 「向き直り」を繰り返す ことで、本来たどり着くべきゴール へ近づいていく。それは最初に思いついたゴールではない事が多い。
見えていたつもりになっていたけれど、物事を詳しく知るにつれてより深い洞察が可能となりゴールが変わってくる。
だから最初に思いついたことを一気通貫最後まで作り上げようとするのは無駄だ。
どうせ最初に書いた青写真とは変わってくるんだから。(自分で言っていて耳が痛い)
...
よし、計算がいい感じにできた。
あとはそれに従ってセルを書き換えるだけだ!
...
......!
ピピピピ 『実行だ!』 ピピピピピピ!
...
ピコピコ ピコピコ....
エンターキーの押下に呼応して、生命が動き出した。
動いた・・・!
タイムアップと同時に実行して、動いた。
それも本日初の完遂。・・・まるでドラマみたいな展開だ。
出来上がったのは、たった3x3マスのライフゲーム。
TDD したワケでもないし、スマートさの欠片もないコードだ。
すごい人たちから見たら笑われるようなちっぽけな物かもしれないけど、
それでも確かにライフゲームだった。
お互いに笑顔がこぼれる。
ああ、こういうの、いいな・・・
――――――
タイムアップ後、司会進行が進んでいるけど、
その間も初期配置を変えたりして(ミニミニ)ライフゲームを味わっているようだ。
めっちゃわかる。自分で作ったものが動くって楽しいし嬉しいよね!
この 動いた瞬間の幸せな感情 って、日常生活の中では殆ど味わうことが出来ないように思う。
動作した瞬間、多幸感や満足感に万能感といったさまざまな感情が一気に波のように押し寄せてくる。
もしかするとプログラミングってある種の麻薬みたいなものなのかもしれない。
そりゃいつまでも現役エンジニアで居たい人が多いわけだよね。そういえば、通っていた塾の先生は数学の問題を解くのを趣味にしていた。
当時は意味が分からなかったけど、きっとこういう気持ちだったんだろうな。
全5回のペアプロがおわって
たったの 45分*5セッションだったけど、
- C#
- Python 3
- HTML + JS
- Ruby
と4種類もの言語でペアプロを楽しむことができた。
ペアプロで組んだ方にも少しは楽しんだり、学んでいただけたように思うし、
個人的にも普通の仕事ではなかなか味わえない感動や達成感も味わうこともできた。
コミュニケーションの仕方や進め方、教え方などに良いところも反省点も見つかったし、
お菓子やご飯は美味しくて "映える" し・・・
(※ 本文長すぎなので泣く泣く割愛しました。)
静岡でこんなに贅沢な時間になったのは久しぶり。
唯一気がかりだったのは、見てるだけ、あるいはそれに近い人が発生してしまったこと。
エンジニアさんが少ないという制約上、もしかするとペアプロという概念や考え方をもう少し最初に浸透させたほうが良かったのかもしれない。
今考えると、参加者の中では数少ないペアプロ経験者としてもう少し手伝える方法があったはず...😫
(でもこんな状況も Coderetreat なのかも?)
Global Day of Coderetreat 2019 in Shizuoka 主催者のみなさん、
そして一緒にペアプロして下さった参加者の皆さん、ありがとうございました。
世界中で親しまれているのも頷ける、実に楽しい実りあるイベントでした。
もし来年も開催されるならぜひ参加したいと思います。
皆さんも一緒に出ませんか!
明日の 静岡 Advent Calendar 2019 は、
yabecchy さん の 『【後編】静岡県のウェブ制作系セミナー / 勉強会 のこれまでとこれから』 です。
おまけ: 静岡の勉強会やエンジニア事情について(メモ書き)
懇親会でいろいろ静岡の現状について話をして、今考えていることをメモ書きします。
・(特に) 新人さんが勉強できる機会が圧倒的に不足している。
・おそらく上記の積み重ねによって、きちんと人に教えることのできる中堅層~ベテラン層が不足している。
よい「考え方」や「姿勢」を伝えられる人が居ないので、負の連鎖が起きている。
正しいものを正しくつくるどころの騒ぎじゃない。この構造そのものを変えていけるような取り組みが必要だろう。
・静岡県で見ると、西部・中部・東部とエンジニア圏が3つに分かれているのが割と痛手。
・地元でイベントに参加するという概念がないのかしら...
車通通勤だったり? あるいは、東京が近いからそっちへ行ってしまう?
それともそもそも勉強したくない?(職業プログラマばっかり?)
・いずれにせよ、エンジニア同士のコミュニティだったり、イベントだったりを充実させていきたい。
・色々な人と設計や DDD、C# について語り合ったりしたいけれど、ニッチになると母数の問題ががが。
意外と需要あったりしないかな?
・エンジニア第六感(と勝手に呼んでいる) ひらめき力をつける良い方法はないだろうか?
・偉そうなこと言ってるけど自分もまだまだ先は長い...