Posts for: #Issue Management

部屋の片付けへの趣き

今日のバドミントン練習はエアシャトルでリフティングを10分、連続最大回数は322回だった。その後にショートサーブ30回、フットワーク10分の練習をした。リフティングは連続回数よりもラケットコントロールの質を求める練習に変えていく。昨日と同様、みなとのもり公園をジョギングで4週走った。fitbit によると 1.8km 走ったそうな。

プロジェクトマネージャーが手を動かすことの功罪

朝からお手伝い先の社内インフラサーバーが落ちていて待ち時間があったのでふと思い返してつらつら考えごとをしていた。

お客さんが選ばなければ、逡巡と葛藤の結果、最終的に私は品質を優先する

開発合宿の課題管理の雑談から引用

私はもっと仕組みを作るところに注力すべきだった。私自身がコンサル嫌いの、実務をやっている姿勢をみせてメンバーが参考にしてほしいという意識が強過ぎた。また開発は楽しいことから必要以上に手を動かし過ぎてコアな開発に入り過ぎたことで、自分がやらないと他のメンバーが担当しにくい体制になってしまった。「任せる」はずが「任される」ことになってしまった。バックエンドの品質は大事だから責任感もあった。もしかしたらお客さんが求める以上の過剰品質なモノづくりをしてしまったのかもしれない。そして、仕組みづくりの後はメンバーへ委譲すべきだった。いまメンバーへマネージャーを委譲しているが、マネージャーという業務はもともと得意でもなくこだわりもなかったがためにすんなりと委譲できた。

しかし、開発の方は得意分野、且つ好きであるために品質にこだわってしまう傾向があることを認識できた。そのことが裏目に出てしまった。これが自社プロダクトの開発ならばすべて自社の資産になるためにそれでもよかったかもしれないが、他社プロダクトでやってしまうと、自分の時間を必要以上に注ぎ込むことになってしまった。その結果、お客さんの信頼を得られてはいるものの、自社プロダクトの開発に着手できず、クロージングの時期が遅れて微妙な状況になってしまった。もしかしたら、お客さんもうちの会社との契約を終了できなくなってしまって困っているという考え方もできる。

rabbitmq の autoAck (noAck) の振る舞い

先週の続き 。id 連携のリクエストをし続けながら compose サービスを down させたときの振る舞いを検証する。理想的にはそれぞれのモジュールのサービスが graceful に振る舞って、それぞれの永続化する場所でデータが溜まってくれることを期待している。その1つがメッセージキューでもある。Persistence Configuration によると、rabbitmq のメッセージを永続化するには queue に対して durable の設定を行い、producer が送信するメッセージに対しても persistent の属性を付与すればよい。しかし、実際に検証してみると、サービスの再起動時にメッセージキューからメッセージが消失していることがわかった。consume メソッドに渡す仮引数に autoAck というパラメーターがある。コメントにもそれっぽいことが書いてある。

When autoAck (also known as noAck) is true, the server will acknowledge deliveries to this consumer prior to writing the delivery to the network. When autoAck is true, the consumer should not call Delivery.Ack. Automatically acknowledging deliveries means that some deliveries may get lost if the consumer is unable to process them after the server delivers them. See http://www.rabbitmq.com/confirms.html for more details.

ConsumeWithContext

autoAck という名前からメッセージを取得したら自動的にそのメッセージに対して ack を返すようなイメージで私は考えていた。しかし、どうやら consumer が subscribe して接続した時点で consume 扱いとなり、consumer がメッセージを実際に取得したかどうかに関係なく consumer の終了時にそのときに溜まっているすべてのメッセージが消失しているようにみえる。余談だが、rabbitmq のドキュメントにも noAck と autoAck という2つの用語が存在する。どうやらもともと noAck という名前だったのを autoAck という用語に変更したようにみえる。メッセージを永続化するには autoAck=false にしてメッセージに対する処理を完了した後に consumer が必ず ack を返すという実装にしないといけないことがわかった。このパラメーターは2年前から同じ設定だったので私がいま検証するまで誰もこの振る舞いに気付かなかったんやと驚いた。

部屋の掃除

19時に閉まる業務スーパーへ買いものへ行くために18時過ぎにお仕事を終えて、移動して買いものをして、炊飯開始して、ジョギングして、戻って晩ごはんを食べて、バドミントン練習をして、お風呂に入って、ストレッチして、なんとなくベッドに入って休もうとした。ここで22時半ぐらい。まったく眠れなくて寝室の掃除を始めたら、これが捗ってやる気が出てきて、部屋のレイアウト変更したりして少し片付けもできた。引っ越してからまったく進めていなかった部屋づくりが突発的に急に少しできた。これまでも時間がなかったわけではないが、まったくやる気がなくて手をつけられていなかった。それがなぜできたのかはわからないが、手をつけられていなかったことに手を入れられたことで心理的に楽になった気がした。明日も帰ったら少しだけ部屋づくりの作業をしようと思う。

秋の城崎温泉の中日

居間で1時半から6時頃まで寝てた。今日のバドミントンは雨天中止。朝から大雨、河川洪水、土砂災害警報と出ていた。雨も夜までずっと降り続いていた。

起きてから昨日、移動途中のサービスエリアで買っておいた丹波黒枝豆を茹でてみる。大粒で少し甘みがあっておいしい枝豆だった。普通の枝豆とは少し趣が違うようなのでお土産にもよさそうに思えた。おやつ代わりに茹でた枝豆を食べていた。

その後、午前中に雑談しながら発表資料を作り終えた。今回の開発合宿は余裕がなくてすべてにおいて準備不足だったが、そのうちの大きな反省として発表資料を事前に作らなかったことがあげられる。きのいえにいると、なんやらかんやら周りと雑談して盛り上がるので自分の作業がまったく進まない。ワーケーションは「余白」が大事になる。普段話さない人たちと雑談するためのイベントでもある。

お昼頃に マルサン精肉店 ですき焼き用の但馬牛を買いに行く。店員さんと話しながら1人200gを基準に購入する。但馬牛のリブロースを200g、鹿児島産の赤身肉を100gとした。但馬牛はとてもおいしかったが、リブロースの霜降りの脂身があるため、量は食べられない。実際に食べてみた所感としてはリブロースを150g、赤身肉を100gでよかったと思える。足りないよりは余る方がよいのでこのぐらいは許容範囲と言える。お店では陳列棚にお肉を並べていなかったため、100gの単価がわからなかった。私の先入観でお肉はそう高くないだろうと考えていた。実際に買ってみたらリブロースが3000円/100g、赤身肉が1900円/100gだった。先に値段を聞いてから他の部位とも調整して買うべきだった。インフレしているのもあると思うが、5人分のお肉の料金が8人でカニを購入したのと同じぐらいの金額になってしまった。失敗。

午後からまた別のお風呂へ入りにいったついでに かみや民藝店 さんの前を通りかかって入ってみた。陳列されている麦わら細工を見学してからオーナーさんに話しかけてみた。この麦わら細工を作っているのは日本で城崎温泉と伊勢の2箇所しかないらしい。昨年、お土産に麦わら細工のストラップを購入してから気になっていた。

お土産を買ってきてから、うちの会社のロゴは幾何学模様だからこの麦わら細工で作れないかと考えていた。うまくできればオリジナルな会社のノベルティになるのではないかと。オーナーさんに聞いてみたところ、うまくできるかどうかは実際に作ってみないと分からないものの、特注のようなものも引き受けているという。基本的にすべて手作りで作るため、既成品を作るのも特注品を作るのも手間暇はあまり変わらないらしい。

  • カスタムメイドの追加費用はない
  • 最低発注数のようなものはない
  • 納期は急いでいないからいつでもよい

1つ2500円前後で作ってくれるという。まず試作品としてうちのロゴの色違いで2つを作ってもらうことにした。それをみてから実際にノベルティとして発注するかどうかを決める。麦わら細工でノベルティの試作品交渉がうまくいった。

晩ごはんに関西風のすき焼きを作って食べる。まず肉を焼いて溶き卵でそのまま食べる。焼いて食べるときのインパクトは大きい。よいお肉だったのもあっておいしかったと思う。焼いて食べた後は普通に煮込むすき焼きを作る。最初に焼いて食べるお肉のインパクトが大きかった分、煮込んで食べたときの印象が薄くなってしまう感じがした。2回に分けて鍋を作ったが、最初は野菜が足りなくてすき焼きに煮込む水分が少なかったように思えた。鍋いっぱいの野菜を多めに入れてから煮込むとよさそう。

晩ごはんを食べ終えてから2日目の親睦会に入る。3人で発表していく。私はこの10ヶ月間の運動や体重減やバドミントンを始めた話しをまとめてみた。準備不足もあって単体と経緯をまとめただけでなにを伝えたいか、よくわからない発表になってしまった。はらさんは「ロールモデルを歩く」という主題で自分がなりたい人に、自分がなっていけるような生き方をしていくという話しをされた。それを聞いていて参加者からこれからは「風の時代」になっていくとか、経済的な価値よりも精神的なつながりを大事にする価値観が重要視されるのではないかといったコメントもあった。60歳になってものづくりをしている人は周りからみて迷惑になっているのではないか?若い人たちからみて年配の作る人は迷惑ではないか?50代になると受託開発の単価が下がる問題への対応。40代のうちから単価をあげず最初から高くないから下がらないという戦略もある。

私がいま独立して会社をやっている理由を端的に表すと「組織に馴染めない」ということがあげられる。それについても聞いてみた。

  • ai を相手に話せば、若い人に迷惑をかけずにやり取りできるのではないか?
  • 老化しないための研究が発展して不老不死のような状況もみえてくるのではないか?
  • 50代になると選択肢がなくなっていく
    • サラリーマンとして我慢してやっていく
      • その生き方も強いと言える
    • 組織と折り合いをつけられているならそれは能力の1つと言える
  • 50代で潜伏していた人はあまりいない

発表を終えて、0時ぐらいから知人のトラブルプロジェクトの話しを聞いていた。自身の経験則から私ならどう考えてどう行動するかと考えながら雑談していた。抜本的に改善しないといけない状況だが、プロジェクトの状況からどうにもならない、かなり高い確率で失敗の未来がみえている。雑談をしていて課題管理や業務の教え方について思うことが出てきたのを、忘れないように書き殴っておいた。この話しをできただけでもこの開発合宿は価値があった。

  • 若いメンバーは「わからない」「できない」が言えた時点で正しいとする

    • そこから先の問題を表現する練習を積み重ねる
    • これは文章でやり取りするよりも、口頭で話しながらできるようになってもらう
    • 専門用語が出てくれば、なにが/どうわからないかを短文で説明してもらう
      • その後に具体的に論理を説明しながらわからない内容を長文で説明してもらう
  • 問題の本質を理解するための問答ではなく、私が言ったことを理解するための問答になっていた

    • 文章で指摘した方が後で読み返せて調べられるし、証拠も残ってよいだろうと考えていたが、人によってはそのやり方が最善でもなかった
    • 口頭で問題の本質を確認したり、相手が何を理解出来ているかを質問して考えてもらう時間をもっと取るべきだった
      • 教え方・教わり方に個人差がある
        • 文章だからわかりやすいとか、口頭だから曖昧になるというわけでもないことを学んだ
  • プロダクト開発のコアな役割を担ってしまうと品質をとるか、成長を促すかのトレードオフに直面する

    • 私の価値観ではプロダクトの品質をあげる方を選んでしまった
      • プロジェクトに入る前にお客さんにどちらかの2択を決めてもらう
        • メンバーの成長を優先か、プロダクト/プロジェクトの品質を優先するか
          • お客さんが選ばなければ、逡巡と葛藤の結果、最終的に私は品質を優先する
  • 業務の進め方が一定水準に満たないメンバーをどう対応するかa

    • コードレビューならマージしない、やり直しをしてもらうスキームを作るべきだった
    • 最初からうまくできるわけはないから、やりながら慣れていってもらうことを優先して導入を甘めにしてしまった
      • 問題の本質を理解できていないようにみえても指摘したことを修正したらマージしていた
        • 問題の本質を理解するよう促したり、モブプロしたりしてもっと時間をかけて基本を指導して最低水準を設けるべきだった
        • もっと話して時間をかけてゆっくりしっかり指導していくべきだった
          • 最初に業務を遂行する上でのスキルの基準を示すべきだった
  • リーダークラスのできる人、チームを相手に課題管理を教えるのか、新人や経験の浅い人たちも含めて課題管理を教えるのかでやり方が異なる

    • 前者はみて学んでくれる
      • 実践しながら勝手にできるようになっていくのでプロジェクトが進む
    • 後者は成長を主目的とする
      • 品質や機能開発を停滞させても業務の進め方をしっかり指導することが中長期的に大事になる
  • 課題管理のビジネスをする上でマネージャーとして実践的に入るのはよい

    • 終わりのスキームを最初から作っておく必要があった
    • マネージャー (&遊撃) でプロダクト開発のコアな役割を担ってしまうと抜けられなくなる
      • クロージングをどうすればよいかを悩み始めた
      • 課題管理の OJT を実践的に1ヶ月で終えられるようなコンテンツづくりやノウハウのパッケージングをしていく必要がある
        • 現状ではうまくいけば半年、そうじゃなかったら1年ぐらいかかる
    • プロダクト開発の初期で私からメンバーにマネージャーを移行するスキームを作っておく
  • マネージャーは厳しいことを指摘しないといけない

    • なぜ厳しいことを指摘するのかの背景や理由を説明できるようになる
    • 厳しいことを言っても人間関係を崩さないだけの人間力も必要になる

ひとりではできないこと

今日のバドミントン練習はエアシャトルでリフティングを30分した。連続最大回数は80回だが、ほとんどの試行は20回も続かずに失敗してしまう。難しい。

隔週の雑談

顧問のはらさんと隔週の打ち合わせ。今日の議題はこれら。

課題管理と adr の関係の考察

数年前から adr の話題や導入した会社の記事などをみかけるようになった。私はこれまで課題管理をうまくやっていれば adr はそれほど重要ではないとあまり重視してこなかった。しかし、世の中的に認知されて流行っているものはなにかしら意義があるのだろうと最近は少し見直してきているところもある。このスライドによると2017年から流行り始めたらしい。

  • 開発に関する情報を一元管理する、または全文検索ことにビジネスチャンスはある
    • 検索のニーズや要件は多様で言語によっても違い、技術もまだまだ発展的でもあるからずっとビジネスの種になる気はする
    • gitlab issues のコメントの全文検索は有料機能なので slack 通知したチャンネルを全文検索している
      • 課題管理システムのプラグインでテキストをシステム間連携することで検索システムを別途構築できる可能性がある
      • 検索できなくてもデータのアーカイブをするという視点でもビジネスニーズに応える?
  • ベクトル検索 を検索がまだ一般的にはなっていない?
  • wiki と adr の違いの1つとして wiki になにを書いてよいかわからない問題がある
    • 文章を書けるようになるのは経験や習熟を必要とする
    • adr のようなテンプレートがあることで経験の浅い開発者も書きやすくなる狙いはある
    • 課題管理システムの wiki に adr のラッピングをして別機能としてみせるのはよいかもしれない
    • 業務の引き継ぎにも adr は役に立つのではないか?
    • adr 一覧をみたり、そこから検索することで検索効率や精度は上がるという想定
  • 大きい会社でも巨大な課題管理システムと wiki が1つだけあって一元管理しているという噂は聞く
    • ある会社では wiki は誤っている可能性があるから信用するなという教訓があった
      • wiki の情報は更新されていない可能性があるから参考にしながら必ず裏をとって業務をしなさいという話し
    • wiki を編集したら必ずレビューが必要になるプロセス
  • notion のプロジェクト管理の使い勝手はどうか?
    • テンプレートを使ってガントチャートやカンバンを作れる
      • 基本的に自分でカスタマイズできることの良し悪しがある
        • db をどんどん改良できるが、それだけに魔改造してしまう
        • 時間とともに複数人が改良すると保守できなくなっていく懸念がある
      • 中核機能をパッケージ側で提供することは堅牢性を担保する上で重要ではないか
    • タスク管理と wiki がシームレスなところはよい、はらさんは日報を書いてリンクしている
  • 会社のインフラに日々の開発情報を書いていくと退職後に参照できない
    • フリーランスのような働き方をするにはナレッジデータベースをローカルに作りたいという欲求がある
    • 組み込みの課題管理システムにより、自身のナレッジデータベースをローカルに残すという目的はよいかもしれない

仕事は楽しいかね? の考察

まとめを見返しながら、だいたいの項目は理解または支持できる。1つだけ次の項目が私には欠けていることに気付いた。

毎日1つ試し続ければ必ず上達や進歩ができる

  • 新しいことを始めると、いまやっていることを継続する時間がなくなったりしないか?
  • プロダクト開発ではがんばってもあまり成果が出ないような時期もある
    • リファクタリングやテスト追加などはまさにそう
    • そういったときも1つでも変化をもたらせれば日々の生活が変わるのか?
  • はらさんのお奨めは梅原さんの 1日ひとつだけ、強くなる。 世界一プロ・ゲーマーの勝ち続ける64の流儀
  • 本書を読んではらさんのよかったところは「試してみることに失敗はない」
    • それまでも試すことはやっていたはずなのに躊躇してしまう理由として失敗したら時間の無駄だと考えてしまっていた
    • 失敗したら嫌だと考えてしまうところがあったが、この考え方があるから vision pro を購入できる
    • やりたいことをすぐやってみるという思考につながった
  • 面倒くさいときもなるべくパソコンを使うようにしてなにかしら調べる
  • 私はオフィスにいれば、家よりはなにかしら作業するモチベーションになる
  • 目標達成や成果をあげるには環境がもっとも大事
    • 個人の感情を信頼しない
      • 人間は面倒だとすぐ怠けてやめてしまう
    • 環境を整えることでワークフローを洗練させて習慣化する
      • 日記になにか書かないといけないから調べものをする
      • 嫌々ながらでもやっているうちに習慣になってくるとワークフローが洗練していく
      • 人間の運用を変えていくなにかは普遍的な価値またはビジネスチャンスがある
    • 調子の悪いときにどうやって早く脱却するかが大事
      • ひとりでは言い訳を作ったり怠けてしまう
      • このときに他人の助けがいるのではないか?
        • 話しを聞いてもらうだけでも前へ進むきっかけになる

go の結合テスト向けカバレッジ計測の考察

以前リリースパーティーで go 1.20 で結合テスト向けのカバレッジ計測の機能が入ったことを聞いていた。次のブログ記事でやり方が紹介されている。

将来的に結合テストを作るときにカバレッジ計測のカスタマイズを施したバイナリを使って api server を起動する仕組みにすればこの機能を使えることに気付いた。

まずは単体テストを実行して任意のディレクトリ (tests/coverage) にカバレッジ計測のための中間データを生成する。

$ mkdir -p tests/coverage
$ go test -cover ./... -covermode atomic -args -test.gocoverdir="$PWD/tests/coverage"
$ go tool covdata textfmt -i=./tests/coverage -o coverage.out

coverage.out がさまざまなツールの入力となる統計情報となる。例えば、このファイルを使って次のようにしてソースコードのヒートマップの html を作成できる。

$ go tool cover -html coverage.out -o coverage.html

nikolaydubina/go-cover-treemap を使うと treemap でカバレッジのヒートマップを確認できる。

$ go-cover-treemap -coverprofile coverage.out > treemap.svg

カバレッジ計測向けのバイナリをビルドする。そのバイナリを起動するときに環境変数 GOCOVERDIR に単体テストのカバレッジの中間データが含まれるディレクトリを指定する。

$ go build -cover -covermode atomic -o bin/api ./cmd/api/...
$ GOCOVERDIR="$PWD/tests/coverage" ./bin/api -verbose

このバイナリを使って起動した api server に対してリクエストを呼び出すことでカバレッジを計測してくれる。結合テストからバイナリ起動した api server に対してリクエストしたときに GOCOVERDIR に中間データが追加されていく。結合テストを完了したら最終的なカバレッジの統計情報を生成する。 

$ go tool covdata textfmt -i=./tests/coverage -o coverage.out

textfmt のヘルプをみたら同じディレクトリじゃなくてもよいみたい。

$ go tool covdata textfmt -help
...
Examples:

  go tool covdata textfmt -i=dir1,dir2 -o=out.txt

  	merges data from input directories dir1+dir2
  	and emits text format into file 'out.txt'

責任を扱うコミュニケーションの在り方

水曜日から継続していたメンバーのコードレビューをお昼頃に完了して、それからは自分の時間に集中して開発に取り組めた。途中、晩ご飯休憩もしながら翌2時頃までコードを書いていて issue を2つ fix した。

隔週の雑談

顧問のはらさんと隔週の打ち合わせ。ここ1-2ヶ月はあまり議題がなくて近況について雑談した。いまの開発フェーズが終わらないと、私が開発以外にリソースを割いていないので他のことに取り組む余裕はないかもしれない。開発プロジェクトにおける、議題の1つで次のインタビュー記事の内容について雑談した。

責任をすぐに相手に投げてしまわないこと。責任をこちらで負えるように日頃から信頼貯金を貯めていくことが大事です。責任を負うこと自体はたいへんだけど、仕事は楽になるんです。

でも、人は責任を負いたくないと考えてしまうんですね。気持ちは分かりますよ、責任を負うのには胆力が必要ですから。そして責任を負いたくないから「いつまでですか?」と聞いてしまう。その途端、スケジュールを決めるのは相手の裁量になる。責任から降りて、自分から立場を下にして、受発注の関係にしてしまっています。

何が事業貢献なのか分からなくなっていた伊藤直也さんが再認識したユーザーエクスペリエンスへのコミット

私自身、このインタビュー記事を読むまで相手に仕様や納期を決めてもらうことを、相手に責任を負わせるという視点をもっていないかった。しかし、その通りでもあると新たな気付きを得た記事でもあった。うちらはプログラマーという、システムを作る専門家なのでビジネス課題や解決したい業務課題について、その課題意識をもっている人 (ビジネスオーナー) から教えてもらうのを至極当然のように考えてしまう。そして、それ自体はいまの業務の在り方としてそうならざるを得ないところもある。

システム開発はそれぞれの専門職が分業によって行う。とくに規模が大きくなればそうなる。この構造そのものは一般的といえる。しかし、一緒にプロジェクトをやっていく働き方や考え方によってはその責任を分散させられるというのがこの記事に書いてあることだとわかる。そして、私自身これまで意識せずにそういった行動をいくらか取ってきているところもあり、それは「気付き」のレベルによって起こるものだとずっと考えていた。気付くからより多くの、より本質的な、より優れた改善のための行動ができる。そして、私の考え方も間違ってはいないと思うが、私は他人よりリスクを取りがちな性格があるから責任をこちらで負うという意識をあまりもっていなかった。つまり、私は自分の価値観でこうしたいと思って勝手にやっていたことを、別の見方では相手から責任を受け取って進めているという解釈もできる。

ちょうど 兵庫県知事の百条委員会の答弁 もみていて感じたことだが、私はこういったコミュニケーションを本質的に好んでいない。自分の責任ではないという議論をしても、モノゴトは前に進まない。世間では百条委員会の後も知事の説明は十分ではなかったとみられている。その所以である。誰かが責任をもってモノゴトに取り組む必要がある。その責任の所在を明確にすることも大事ではあるが、自身の責任ではないという主張だけでは物足りなさを感じる。普段の業務においてもそういう姿勢やコミュニケーションを取る人が少なからずいる。はらさんの経験でもその点においては同意していた。よくある状況だと思える。自身に責任を負うことをためらわないコミュニケーションを取る人とそうではない人の2通りがあるのだと気付いた。そして、私は後者の人とコミュニケーションを続けていると疲弊したり苛々したりすることがある。それゆえに私自身も結果に対して潔くあろうと努めるし、潔い人たちとウマがあうのだろうともわかってきた。

課題管理の文脈においては、コミュニケーションのやり取りから責任の綱引きがどのような場所でどのぐらい起きるのか。人間であれば読み取れるが、ai はその意図を解釈できるか。そういった業務の責任という概念を見える化することに意味はあるかもしれない。責任の押し付け合い、または責任分散、本質的にどうあるべきだったかをなんらかの指標をもって数値化できればおもしろいのではないかと思えた。

go における簡単な式の評価

テスト自動化のツールを作っていて、テストデータでちょっとした式の評価をやりたくて調べたらまさに次の記事で解決した。

この記事では go/types パッケージに定数や式の評価を行う機能がその使い方が紹介されている。簡単に使える。ふとサードパーティのパッケージならどうなるんだろう?とインターネットを検索したものの、自分ではみつけられなかった。chatgpt に問い合わせたら次のようなコードを紹介してくれた。そして、たしかにほとんどは正しくて意図したように動いた。次のコードでは http フレームワークの echo の定数を参照している。types.Package を生成するためのモジュールの読み込み方法について標準ライブラリはそのためのユーティリティが用意されているが、サードパーティのパッケージは用意されていなかった。

import (
    "fmt"
    "go/token"
    "go/types"
    "golang.org/x/tools/go/packages"
)

func eval(expr string) (types.TypeAndValue, error) {
	cfg := &packages.Config{
		Mode: packages.NeedTypes | packages.NeedImports,
		Fset: token.NewFileSet(),
	}
	pkgs, err := packages.Load(cfg, "github.com/labstack/echo/v4")
	if err != nil {
		return types.TypeAndValue{}, err
	}
	if len(pkgs) == 0 || pkgs[0].Types == nil {
		return types.TypeAndValue{}, fmt.Errorf("failed to load echo package")
	}
	mainPkg := types.NewPackage("main", "main")
	mainPkg.Scope().Insert(types.NewPkgName(token.NoPos, mainPkg, "echo", pkgs[0].Types))
	return types.Eval(
		cfg.Fset,
		mainPkg,
		token.NoPos,
		expr,
	)
}

このコードで expr に次のように echo の定数を指定するとその値を参照できる。

echo.MIMEApplicationJSON

動的型付けのノリで関数も実行できたりするのかな?と試してみたら (当たり前だが) できなかった。chatgpt になぜ関数実行できないかを尋ねたら次であるとのこと。静的型付けのコードを実行するには、本来コンパイルしないといけないのだから式の評価よりもずっとやることがある。

packages.Load を使用してサードパーティパッケージをインポートできているにもかかわらず、expr からそのパッケージの関数を呼び出しても結果が取得できない原因は、go/types パッケージがサポートしているのは、型や定数のチェック、構文解析、式の評価であって、関数の実行そのものはサポートされていないためです。

go/types の Eval 関数はあくまでコンパイル時の型検査や式の評価を行うもので 関数の実行や実行時の評価 (ランタイムの処理) は行いません。これは、Eval が式を評価して型と値を返すだけであり、動的な関数の実行などはできないためです。

集中開発の1ヶ月間

プロジェクトの進捗報告

出張したときの月例報告の19回目。前回の進捗報告はこちら 。この開発フェーズは私が経営陣へ進捗報告するものの、引き継いだマネージャーにも同席してもらって、こんな打ち合わせをしているというのを知ってもらう機会にしている。この1ヶ月間の進捗やこの開発フェーズでやろうとしていることを一通り説明して、あとはざっくばらんに経営陣と雑談するといった機会にもなった。最低限、開発のボトルネックになりそうなところは私が集中開発して解消したので見た目上はよいペースで進捗している。

進捗報告して雑談しているうちに、もうこれ以上は私がお手伝い先へ提供できる新たな価値はなさそうに思えてきた。ここからは課題管理できている issue を優先度順にひたすら fix していく、よくないところはリファクタリングする、開発の負債やボトルネックを解消していくといった、より実践的な実務が求められる。課題管理を含むプロジェクトマネジメントやチームの情報共有を改善することで開発をうまくまわしていくフェーズは十分にメンバーが実践できるようになったと思える。自身の引き出しの中身を払い出してしまって、なにも残っていないような寂しさを感じるようになった。

いまマルチブラウザ/デバイスのテストの自動化のために BrowserStack というプラットフォームを評価している。まだ評価中なので採用の可否はこれから判断するところだが、採用したらコストがかかるのでその話題も経営陣に伝えてその場で議論したりしていた。おそらくこのサービスは Selenium Grid を使っているのではないか?と推測される。うちのプロジェクトだけでなく、社内インフラとして全社共通のテスト基盤を作るという施策もあるかもしれないと話しが発散したりもした。開発においてプラットフォーム的な投資も大事だと考えられている。うちのプロダクトで作る課題管理のメトリクスに、プラットフォーム投資のための見える化ができる機能もあるとよいのかもしれないと思ったりしていた。

寝ている間に再設計

昨日のもやもやは寝ている間に整理され、今日は標準的な開発者としての過ごし方になった感じがする。

マネージャーとの 1on1

これまでは私がマネージャーとして 1on1 をしてきたが、今後は交代したメンバーがマネージャーを務める。この開発フェーズでは私は開発者 (メンバー) として 1on1 をしてもらうといった感じかな。自分が開発者側だと思うと、いま私が取り組んでいることの話しをしやすかったりした。立場によって 1on1 のやり方は変わることを実感した。マネージャーはメンバーの話しを聞く方に注力したり、プロジェクト全体の話しをしがちになる。開発者として臨むと、自分の抱えている issue に集中して話せるといった違いがあった。

CPAP の中断

夜に睡眠外来へ行ってきた。以前に CPAP 装置 を借りて3ヶ月ぐらいやっていたものの、ここ2ヶ月ほどやらなくなってしまっていた。もともとは体脂肪コントロールの疲労回復のために始めたものだった。体脂肪コントロールがうまくいって目標達成したことで睡眠改善を行う目的もなくなってしまって関心を失ってしまった。借りているだけで毎月5千円ほどかかるので中断して機器を返却することにした。旅行のときなど、一時的に借りられないかを聞いてみたら、それは不可とのこと。また再開したくなったらいつでも言えばよいとのこと。

ツールの再設計

昨日の続き 。睡眠外来から帰ってきて、晩ごはん食べて、軽く飲みながら24時過ぎまでコードを書いていた。今日もまる一日ツールの再設計をしていた。昨日のノーアイディアな状況から少しずつ好転していって、ある処理で歯車が噛み合ってからはいつも通り着実に進捗していく様がみられた。意図的にやっていることではあるけど、課題について考えながら一晩寝ると、寝ている間に無意識に刷り込まれて脳が考えてくれる。それで徐々によい設計が現れてくるようになって明確な実装に落ち着いたのではないかと推測する。今日はよい感じに集中できた。

1週間遅れの実家帰り

昨日も遅めの時間までコードを書いたら帰ってバテてしまい、朝から実家へ帰るつもりがお昼からになってしまった。本当は先週、帰るつもりだったのが1週間遅れになってしまった。それでも帰れてよかった。こうやっておかんが連絡してこなかったら、実家や田んぼのことを放置してしまうのではないかとふと思った。11時から軽くオフィスで作業して13時から三宮を出発して14時過ぎには実家へ着いた。1ヶ月ぶりぐらいに車を運転するのもあって気分転換にもなった。それからトラクターで田んぼを耕すことにした。晴れた日がずっと続いていると、地面がよく乾いてしまい、掘り返すと砂煙だらけになっていた。また地面も硬くてトラクターにも負荷がかかっているように思えた。一度耕した後も砂地になってしまって繰り返し耕せているかもわからなくなっていた。本当は一度耕した後に水はけがよいように畝を作るところを今回はその作業はやめた。また近いうちに雨が降った後に帰ってトラクターで畝作りをする。

ある会社の課題管理の考察

社内 slack で知人がその会社の、あるチームのメンバーについてコメントしていた。いま5年目の開発者で、課題管理的なことがうまくできなくて、これまでも何度も同じことを注意しているのに改善がみられないという。いくつか、私も自身の経験でコメントしてみていたが、どうやらアドバイスできるような状況ではないらしく、お手上げのような雰囲気だった。チームの他のメンバーはうまく課題管理できているし、毎日朝会もしているのに注意した内容に関する報告や相談をしてくれないという悩みもあるそうだ。もし業務委託社員なら解約しているとまで言うのだから問題社員なのだろう。そういった社員向けにアドバイスだったり、改善のための施策だったり、みえる化の指標を提供していくというのがうちの会社のビジネスになる。それでも出来ない人はどうするか?ということを知人とやり取りしながら考えるきっかけになった。多様性の文脈で向いていない業務はやめて、他の (相対的に向いている) 業務を担当すればよいのだろうけど、現実の会社ではそんな都合よく配置転換はできないかもしれない。

次開発は開発者として専念

今日も出張戻りで運動はおやすみ。帰ってから運動をする余裕もあったけれど、日銀の追加利上げ決定から為替が円高に動いて、日経平均先物が急落しているのをみかけて、帰りの新幹線内から経済系の関連記事を読んだりしていた。景気が悪化すると経営に影響するから、こういった転換点に敏感になった。

5次開発の要件打ち合わせ

前回の所感 。これまでは2時間をとって要件の発散会議をしてきた。今回は残課題の issue が溜まっていて、まずはそれらを fix してから最低限の機能開発をするといった段取りで進めることを出席者に共有した。そのため、要件を発散させるような話しはほとんどしなかった。主には残課題の共有をしながら、11月頃から最初のお客さん導入を想定して、それまでにやらないといけない要件の機能の再確認を行った。ちょうど2時間ぐらいでおさまった。優先順位なども改めて確認する必要もなさそうに考えている。お手伝い先のプロダクト開発において課題管理が普通になってきたので、特別な確認や打ち合わせをしなくてもどの課題をやらないといけないかは明示されるようになった。これはこれで課題管理の方法論の成果でもある。一方でメンバーからはどの issue を担当すればよいか、開発始めの段階は担当者を割り当ててほしいという意見もあったので、私がいくつか残課題をそれぞれのメンバーに割り振っていった。これも開発が進むうちに、自分が関心のある issue を取ったり、やらないといけないものを自分で割り当てるようになっていけば自律的な開発へ向けてさらに進展していく。

これまでは機能開発を3ヶ月、QA を1ヶ月としてきた。今回は機能開発を2ヶ月、テスト/QA 期間を2ヶ月とる。自動テストや QA 工数の削減のための取り組みに時間を割いて、人間が QA 検証する工数を削減していく。私自身やらないといけない残課題がいくつかあるので早め早めに fix していって集中力をもって取り組む必要がある。今回はマネージャー業をメンバーに移行した分、久しぶりに開発に専念してコードを書ければいいなとも思う。どうなるかな。

落ち着いた開発とふりかえり

今日は出張中で飲み会があったので運動はおやすみした。

4次開発の大きなふりかえり

前回の大きなふりかえり 。約4ヶ月の開発フェーズが終わってからの大きなふりかえり。もう4回目なのでメンバーも慣れてきたし、過去の知見もたまってきた。そして、私がいまあまり調子がよくないのもあってなにか目新しさがなくなってきたところでもある。今回の開発は2つの大きな失敗があった。

  • 想定していた開発機能を1つ落とした
  • QA 検証を網羅的に進めることができなかった

これらは私のマネジメントの失敗になる。これまでうまく進み過ぎていたと言えるのかもしれない。プロジェクトマネジメントは毎回うまくいくとは限らない。スクラムガイドにもある見積もりより経験主義の重要性を認識する開発期間でもあった。これまでの順調な進捗に、私自身マネジメントの驕りがあったのだとも思う。次の開発フェーズでまた気を引き締めてプロダクトの品質を担保していく。

いつも通り gitlab の統計情報を眺めながら定例イベントのふりかえりなどもやっていった。UI 周りのふりかえりを口頭での報告や文章で表現するのが難しくなってきたという意見があった。UI は画面の操作をみないと本当の意味で理解するのは難しい。テックブログを読む会も、自分が読みたい記事をすぐにみつけるのが難しいから事前に読みたい記事を探しておくといった「準備」をするメンバーもいる。実は私もたまにその準備をしているのでその気持ちはわかる。記事を探すという作業には一定の時間を取られるという事実がわかってきた。

記事を読んだ後に軽く雑談する時間があってもよいのではないかという意見もあった。これはこれであってもよいとは思う。ふりかえりは隔週でもよいが、メンバー間での確認事項は毎週やった方がよいのではないか?という意見も出た。これは話す必要があるときにハドルすればいいでしょうというところで一旦は見送った。みんなで集まる会議時間はコストが大きいので慎重に判断する。1on1 の隔週30分もそろそろ調整や見直しがあるかな?とも考えていたけど、逆にメンバーからはなんやかんやで30分話すことはあるからこのまま継続した方がよいといった意見も出ていた。

開発のやり方がだいぶ定着してきて、大きなふりかえりも1つの型ができて落ち着いてきた感じはある。よくもわるくも。

同期との飲み会

たまたま新卒で入った会社の同期から連絡がきて、関西で働いている同期が2年ほど単身赴任で東京出張になるらしく、久しぶりなので飲みにいこうという話しになった。本当は4人で飲む予定だったのが、1人がお仕事でドタキャンになって3人で飲んできた。10年以上会っていなかった同期だから近況を話すだけでもおもしろかった。今日会った3人に見た目は昔とあまり変わってなかった。私は体脂肪コントロールした後でよかった。ある同期は課長になっていて、単身赴任である省庁へ出向になった。外からみたら国家公務員やね。本当は話したらダメなんだろうけど、同期というよしみもあって飲みながらいろいろと話しを聞いてた。ここには書けないが、おもしろかった。飲み過ぎた。

私は最初の会社を3年でやめたものの、飲んだ同期たちはもう20年以上、1つの会社で働いているわけで価値観もだいぶ違うだろうと思う。同期って本当によいもので、価値観が違っても会社が違っても未だに仲良く気軽に話しができる。私はたまたま新卒で入った会社が大企業のグループ企業だったから100人ほど同期がいて、5つのクラスに分かれて30人ぐらいのクラスで4ヶ月ほど研修を受けた。いまとなってはその頃の同期とはほとんど会わないし、みんながいま何をしているのかも知らない。おそらく半分以上はその会社をやめてしまっていると推測する。やめた同期とも会う機会があれば楽しく話せるとは思う。

マネージャーがメンバーの代わりにしてあげられること

昨日に引き続き、回復を優先して運動はお休み。

発熱2日目

朝起きたら昨日の夜は少し改善がみえていた喉がかなり痛くなっていて、寝汗もいっぱいかいてて、明らかにまた熱が出ているだろって雰囲気になっていた。たぶん6時頃。さすがにこれはお仕事休むかなぁと、諦めて寝ているうちに少しよくなったから、行けるところまでは行くかとオフィスへ向かうことにした。そしたら、その後、どんどん改善していって、今日は37度前後まで熱が下がった。結果的にしんどいピークは起きたときだった。明日には治っていることを期待したい。

昨日の夜は早く帰ってベッドに入って安静にしていた。熱があるとはいえ、家に帰ってもやることがないし、いつも起きている時間に眠れるわけもなく、暇なので 忘却バッテリー の電子漫画を買って読み始めたらおもしろくて、昨日だけで数巻を一気に読んでしまった。今日もまだ発熱が続いているから早めに帰って、昨日の続きで一気に18巻まですべて読んでしまった。完全にこの漫画にはまってしまった。おもしろい。

決断というストレス

忘却バッテリーを読んでいて、思うところが1つあったので備忘録に書いておく。

名門ではない都立高校の野球部に、なぜか一流選手が数人集まっただけの野球部だったが、本当の強豪高校と戦うには総合力が足りない。当然、監督もいない。そこで監督を探す文脈で出てきたのが佐古さん。佐古さんはもと野球をやっていた経験者だが、いまはニートで指導者としての経験もなくて、そんな実績で監督がやれるのかということに対して、自分は「決断」のストレスを負担するという。

忘却バッテリー 12巻

忘却バッテリー 12巻

これは本当にうまい売り込みで、ある心理学者によると、人間が一日に決断できる回数はそのものごとの重要度や難易度に関係なく一定であるという説がある。より重要なことに心理的な決断能力を使いたい。もしくは自分が判断しなくてもよい決断を他人へ委譲することで効率的にそういった状況も作れる。

以前 102. A Philosophy of Software Design (3/3) w/ twada で twada さんが認知負荷の話しをされていた。プログラミングにおける文脈の、ある課題に向き合うときの認知負荷を次の2つに分類して説明している。

  • 課題内在性負荷
  • 課題外在性負荷

課題内在性負荷が高いのは、本質的な難しさも含まれるため、高くても仕方がない。脳のリソースは有限だから、なるべく課題内在性負荷の解決にリソースを使いたいところが、それとは関係のない課題外在性負荷にリソースを浪費してしまうと集中力を欠いたり、効率が悪くなったりする。なぜソースコードに誤った名前が付けてはいけないか、フォーマットがおかしかったりするとダメなのかを脳のリソース活用の視点から説明している。脳のリソースは希少なのでより大事なことに使わないと、考えるエネルギーが枯渇して足りなくなる。

私もいまチームのマネージャーをやっていて、自分自身は大したプログラマーでもなく、マネージャーとしての指導経験もない。そうであってもチームにとってどのような貢献ができるかを考えたとき、唯一の強みが「課題管理」のノウハウだった。しかし、そういう強みだけでなく、メンバーが目の前の業務により集中できるよう、誰でもできることではあっても、その認知負荷 (この文脈では「決断」) を代わってあげるという概念もあることにたったいま気付いた。私はこれまでずっとこのことを責任を肩代りしてあげるのだと思い込んでいた。日本人は歴史的に責任を取りたくないというメンタリティをもっているから、責任をこちらで引き受けることで安心して作業できるだろうと考えていた。一般論として、業務では、多くの文脈で意思決定 ≒ 責任を伴うものではあるけれど、開発の文脈で言えば、必ずしも決断 ≠ 責任ではない。メンバーの認知負荷を下げるためにマネージャーが決断するという役割分担も合理性があるように思える。自身が若い頃の、決断しない管理職やマネージャーへの苛立ちのようなものも、その心理的なストレスや認知負荷を私が感じていたということだったのかもしれない。

実践知リーダーシップの概念の1つに覚えておこうと思ったヒトコマだった。

ベテランはレガシーを保守するべき?

今日の運動は縄跳び(両足跳),散歩,ジョギング,ハンドグリップをした。統計を 運動の記録 にまとめる。夕方から疲労が腰にきて熱が37.1度あって、公園で軽く運動して帰ってきて測ったら38.2度になってた。珍しく熱が出ている。熱はあるけれど、とくにしんどくはない。

問題だらけのプロダクト

お手伝い先のうちのチームに春から入っている若者がいる。いま私が作っているプロダクトは、その若者がこれまで保守してきた旧プロダクトからのリプレースになる。一方で旧プロダクトも顧客に広く提供していることからお客さんが新プロダクトへ移行するまでは保守していかないといけない。たまたま旧プロダクトの保守をやってパッケージングしたら致命的な不具合が発生しているらしい。その issue をみて、今後はその若者が独りで保守するのではなく、うちのチームとして他のメンバーも保守していく体制に変えていくつもりではある。

そこでたまたま issue をみたので私が介入して少し調査した。驚くほどひどいプロダクトで xhr リクエストが失敗したときにまったく無関係なライブラリのワーニングダイアログが表示される。社内のコンサルタントが検証したらそのワーニングダイアログが出ましたと issue 登録していて、アプリケーションのエラーの情報はなにもない。実運用で xhr リクエストが失敗する可能性があるのは当たり前の話しなのに ui のカスタムエラーハンドラーは未定義という状況だった。こんなレベルのプロダクトをよく顧客に提供できるなと呆れてしまった。

ローカルの開発環境の構築方法などもヒアリングして、私が整理して他のメンバーでも開発できるようにしていこうと考えている。そのヒアリングをしていても、その若ものも自分しか環境構築できないレベルらしく、ドキュメントも更新していないと話していた。いくら保守するだけと言っても最低限の品質に達していない。旧プロダクトも保守できる体制を作らないといけないと私は考えていて、いまの新プロダクトの開発が落ち着いたら私が積極的に介入して整理整頓をしていきたいという意志を固めた。

「清潔感」の身につけ方

私はこれまでに服装や身だしなみなどに気をつかったことは一度もない。基本的にはユニクロの服を着ていてそれで十分に満足している。最近は業後にすぐ運動へ行けるよう、ヒートテックとジャージでオフィスで働いている。社交的でもないし、人と会うのもコミュニティイベントや勉強会ぐらいしかないのだからそれでなんの問題もなかった。しかし、今後は経営者としてマーケティングをしていかないといけない。ピッチで話す機会もあるかもしれないし、金融機関へ行って融資のお願いをする機会もあるかもしれない。そのときに最低限の「清潔感」のようなものがないと相手に不快感を与えてしまうのかもしれない。

中年男性というのは、ただいるだけで鬱陶しい存在になりがちで、当然ながら自分もその例にもれない。それでこの数年は、おしゃれでなくても「清潔感」はできる限り維持したいと思っている。そういう消極的な動機で、ファッションに関する実践が続いているのである。

2024年6月12日

たまたまあんちぽさんの日記を読んでいて、私も中年男性は存在そのものが忌避される対象だと認識している。そして経営者としての振る舞いを考えたらこういう視点ももつ必要があるかもなと再認識した。以前、あるイベントで日本酒コミュニティのメンバー募集をしていて対象年齢を40歳未満としていた。主催者がその理由をおっさんがくるとうんちく語って鬱陶しいと赤裸々に話していて、まったくその通りだと同意するものの、40代のおっさんがその場にいて直接的に年齢で言及されると気分がよくない気持ちもあるなと思った。その話題についてただ話したい動機であっても、おっさんは若い人に長話をしてはならない。これは私も常々気をつけていることではある。一方で話しを聞いてほしいという相反する気持ちもある。

閑話休題。おっさんは存在そのものがネガティブとなるため、そのネガティブさを少しでも緩和する努力をおっさん自身がしないといけない。そういうスキルやプラクティスを学んでいく姿勢も経営者としては求められるように日記を読んでいて感じた。