1週間遅れの実家帰り

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

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

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

go の iterator 実装へのリファクタリング

mongo-go-driver を使った go の iterator 実装

先日 go 1.23 がリリースされた。このバージョンの目玉機能の1つに range-over function iterators がある。簡潔に言えば、ユーザー定義のイテレーターを言語機能の仕組みを使って簡単に実装できる。ある制約を満たして関数を実装すれば、for 文の range 構文を使ってイテレーターとして扱える。ユーザー定義のイテレーターを実装するのが、ほとんど関数を実装するだけで出来てしまうので実装の難易度が減ったと言える。どんなコードかをみるには次のチュートリアルがわかりやすいと思う。

昨日で私が抱えていたプロジェクトのボトルネックを解消できた。ここからはボーナスステージで相対的に自由に開発できる。手始めにプロダクトの依存バージョンを go 1.23 へアップグレードして mongodb からの fetch 処理をイテレーターに置き換えるリファクタリングをした。アプリケーションからみたら mongodb は Store という generic なインターフェースを定義していて、そこに Iter() メソッドを追加した。mongodb のコレクションは必ず Iter() メソッドを実装しなければいけないという制約を課す。

type Store[T any] interface {
    ...
    Iter(ctx context.Context, query query.Query, opt *sort.Option) iter.Seq2[*T, error]
}

mongo-go-driver はもともと cursor でイテレーター機能を提供しているため、これを range-over function iterators を使ってアプリケーションから使えるように間をつなげてあげればよい。具体的には generics を使って次のような汎用の iter() メソッドを mongodb client に実装する。

func (c *client[R, E]) iter(
	ctx context.Context, name string, filters queryFilters, sortOpt *sort.Option,
) iter.Seq2[*E, error] {
	if c.toEntity == nil {
		panic(fmt.Errorf("require toEntity() function"))
	}
	return func(yield func(*E, error) bool) {
		collection := c.raw.Database(c.db).Collection(name)
		opts := []*options.FindOptions{}
		if sortOpt != nil {
			opt := options.Find().SetSort(makeSortSet(*sortOpt))
			opts = append(opts, opt)
		}
		cursor, err := collection.Find(ctx, filters, opts...)
		if err != nil {
			if !yield(nil, err) {
				return
			}
		}
		defer cursor.Close(ctx)
		for cursor.Next(ctx) {
			var result R
			if err := cursor.Decode(&result); err != nil {
				if !yield(nil, err) {
					return
				}
			}
			if !yield(c.toEntity(&result), nil) {
				return
			}
		}
		if err := cursor.Err(); err != nil {
			if !yield(nil, err) {
				return
			}
		}
	}
}

Store インターフェースを満たすコレクションの実装は次のように型チェックのためのメソッド実装をもてばよい。

func (c *MyCollection) Iter(
	ctx context.Context, query query.Query, opts *sort.Option,
) iter.Seq2[*entry.MyEntity, error] {
	return c.iter(ctx, c.name, makeFilters(query), opts)
}

朝から iterator 実装の試行錯誤や使い方の勘どころを確かめながら、これも1日でほとんどリファクタリングして移行できた。python のジェネレーターもそうだけど、関数をイテレーターにできると直感的にわかりやすく簡潔に実装できる。すごくよい機能だと思う。1.23 以降の go のコードはイテレーターを使うよう、大きく変わっていくと思われる。

プロジェクトのボトルネック解消

目次

今日は開発の設計に関する打ち合わせが2つ入っていて、どちらも私はメインではないものの、メンバーが要件ヒアリングしやすいよう、ハドルで話しを聞きながらチャットにコメントしたり質問したりしてサポートしていた。その合間に ldap サーバーのグループメンバー管理のための api を実装していた。いま ldap client はライブラリとして作っている。docker-openldap というコンテナを使って dockertest で単体テストを実装している。openldap サーバーに対する ldap プロトコルの操作を容易にテストできるので開発がやりやすい。新規にグループメンバーを操作するための api をライブラリとしての ldap client に実装し、その後に web api としての機能を提供した。だいたい1日で完了した。この2週間ほど取り組んでいた、開発フェーズにおける私のボトルネックをこれで解消できた。ここからは私がやりたい開発ができるボーナスステージへと移行していく。これで少しストレスやプレッシャーが減っていくはず。

バドミントンという健康的な趣味

昨日、大きな仕様変更を入れた内容の、API ドキュメントを書き直していた。大きな変更をしたのでドキュメントの修正量も大きくて半日以上かかった。こういった効率化しにくい、地道にコツコツやらないといけない作業が忙しいときに降りかかるのがつらい。誰でもそうだとは思うけど。元来、私は積み重ねをしていく地道な作業は得意な方だと考えている。しかし、いまはリーダーとして他のメンバーを引っ張っていく立場にあるため、時間のかかる作業をしていると足踏みしているような罪悪感を感じてしまう。一方でそういった実務をちゃんとやることをメンバーにみせることも大事かなと思って、面倒な作業を自分でやるときもある。ケースバイケース。

体育館でバドミントン

前回の所感 。19時からバドミントンへ行ってきた。19時の時点では3人しかいなかったものの、後半にながいさんも来られて、最終的な参加者数は4人だった。ここ1-2週間は椅子にすわってデスクワークばかりやっていて、ほとんど運動できていないのでカラダを動かすのにちょうどよい機会になった。今回も line のオープンチャット 経由で加古川から初参加で来てくれた方がいた。三宮は職場の通勤途中になるらしく、それもあって立ち寄ってくれたようだ。その方も私と同じ世代で初心者からバドミントンを始めて1年ほどの経験らしい。毎週、地元の体育館で練習していると話されていた。うちらに比べればずっと上手だった。うちらはみんな初心者だから適当にやってきたのだけど、(うちらと比べて) 熟練者が来てくれたのでバドミントンの練習方法もいろいろ教えてもらった。その方は次の動画をみて勉強していると話されていた。私も後でみてみようと思う。

バドミントン経験1年の方の振る舞いをみていて、バドミントンは趣味でずっと続けていくのによいスポーツだなと思えた。運動にもなるし、カラダを痛めるといった健康を害することもなさそうだし、お金もかからないし、老若男女、初心者誰でもできるコミュニティ向けのスポーツでもある。教える方のスキルが高いほど、初心者の練習相手として、初めてイベントに来られた方がバドミントンに関心をもつ手助けもできそうに思えた。いまのお仕事の開発が一区切りつけば、有料のバドミントン教室へ通ってみて基礎を教えてもらいに行こうかなと思い始めた。

プロジェクトのボトルネック解消への壁

目次

週末は休んでいたので今日は調子よかった。週末にある程度やっておこうと思っていた実装作業が手つかずだったものの、午前中の定例会議でメンバーに設計内容の最終確認をした。それから集中してコードを書いていたら日付が変わるぐらいの時間まではやっていたけれど、大きな仕様変更を完了した。

連休の週末に時間があったにも関わらず、なにもやらなかったのはこの仕様変更のための作業に私自身が本当の意味で関心をもっていないのではないかという仮説をたてた。仕事でやらなければいけない、面倒でやや規模の大きな作業を、個人の時間で取り組むほどのモチベーションをもっていない。そして無意識的に脳が業務時間だけでできると判断してしまっている。実際にそれで完了することも多い。開発の前倒しはできないが。

夏休み3

目次

午後からオフィスへは行ったけれど、昨日に引き続き、しんどくてほぼお休みしていた。

夏休み2

目次

朝から実家へ帰らないといけなかったが、しんどくてドタキャンした。おかんに悪いことした。来週に持ち越し。

なにもしていない一日

お昼までゆっくりして午後からストレッチへ行ってオフィスで作業していた。本当は夕方から実家へ帰ろうと思っていたものの、作業がまったく捗らなくて翌日へ持ち越した。

ストレッチ

今週は運動も料理も何もせずひたすらコードを書いていた。どこも筋肉痛はなくなっているものの、腰に張りがあったりしたのは椅子に座っている時間が長かったからだと思う。今日の開脚幅は開始前151cmで、ストレッチ後156cmとこれまでよりは数値がよかった。筋肉痛だとカラダが硬くなってしまったりしているみたい。

今週は開発者として実装に集中していた

久しぶりに実装に集中した金曜日

既存の web api のある機能を再設計する。既存機能のエンドポイントの見直しも含むのでテストコードなども移行しないといけない。ひとまずエンドポイントの移行と機能分割はできた。最低限の進捗。まだこれから仕様変更や拡張を追加していく。似て非なる機能を分割しているので名前の付け方をわかりやすくしないといけない。用途と名前空間をうまく組み合わせてわかりやすくしたいが、こういう作業は深夜よりも朝の方がうまくいく気がするのでまた明日にする。朝起きれるかなぁ。

オプトラン中間決算

先週の金曜日にオプトランの株価が1500-1600円台まで落ちれば 割安で狙い目ではないかと書いた。実際に月曜日に歴史的な暴落があって寄りと引けで購入していて、それぞれ 1,490 と 1,466 だった。過去5年の最安値が 1,420 なので割安だろうと考えた。昨日、中間決算があって 2024年12月期 第2四半期 決算説明資料 をみていた。通期での業績は変更していないものの、直近の四半期の業績はよくなかった。前四半期がかなりよかったため、半期の累計としてみたら通期目標に対する進捗はよいと言える。しかし、直近の四半期の業績はよくないから、この空気は売り込まれるやつだと昨日の夜の時点では予想していた。経営陣もそれを見越してなのか 7.72% の自社株買い を発表している。月曜日に割安と考えた見立ては失敗だったかなと諦めつつ、今朝の時点では、大きく売り込まれたらまた買い増ししようとも考えていた。結果的に今日の株価は 1,640 で始まって 1,697 で終わった。自社株買いのおかげ?私のこれまでのオプトランの観察眼では、大きく売り込まれるはずだったのが、なにもなく過ぎ去った。また定期的に少しずつ買い集めていって2024年12月期の決算が終わったときに覚えていたらふりかえってみたい。

寝不足でバテた

久しぶりに実装に集中した翌々日

火・水と連日で遅くまでコードを書いていてバテた。晩ごはんをオフィスで食べて帰って20時頃からそのまま寝てた。区切りがよかったのもあって今日は休むことにした。疲れが溜まっていたからすぐ眠れた。2時頃に一度起きたものの、わりとぐっすり眠れた。深夜までコードを書いていたから単純に寝不足だったように思う。私がボトルネックに成りうる大きな課題の1つを解消した。よいペース。今週中にもう1つの大きな課題を fix したい。

一開発者としてコードを書く日々

久しぶりに実装に集中した翌日

昨日に引き続き、日中コードを書いて、晩ごはんを食べた後にまたコードを書き始めて、翌1時半ぐらいまで書いていた。昼間はどうしても他メンバーの進捗をみたり、質問を受けたりするから割り込みで作業を中断されがち。夜は割り込みが入らないことがわかっているからコードを書くことに集中さえできれば区切りのよいところまで一気に書ける。いままで夜に運動していた時間をしばらくはコードを書くことに割く。いま私がボトルネックになりそうな課題を抱えているのでそこを早めに解消しておきたい。