ごまだれ日記

プログラミングの技術メモとか

JJUG CCC 2023 Fall参加メモ

JJUG CCC 2023 Fallに参加したのでメモを書いておきます。個人的には現地参加は本当に久しぶりです。 午前中は用事があったので午後からの参加です。

ccc2023fall.java-users.jp

動くコードを書こう

speakerdeck.com

主にこれが目当てで参加しました。動くコードを書くというのは当たり前なのですが、意外とできていない人が多いのではないか、というか自分はできていないのではないかという思いが元々ありました。去年から競技プログラミング(競プロ)に取り組んでいて強く感じたことです。 ちゃんとアルゴリズムを組む力がなくても、プログラミングって案外できちゃうのですよね。アルゴリズムを書く力がなくても、パターンの暗記、高度に抽象化されたライブラリの使用、あとは動作確認をガチる、などによってカバーできちゃう。それによって一応「動く」コードはできあがるので、自分はプログラミングができる、と勘違いする。(私のことです) 一応「動く」コードができあがるなら別にいいじゃないかというと、それではダメなケースが多くあります。実際、私は上記のような感じで自分はプログラミングが得意だと勘違いしてましたが、競プロによって化けの皮が剥がれました。簡単な問題はもちろん解けるけど、解法を発想するのがそれなりに大変な問題や、解法は明らかだけど実装が面倒な問題が解けませんでした。自分が解くことができたのは解法を思いつくのが簡単、かつ実装も簡単な問題だけ。ショックでした。何年も仕事でプログラミングしてきたはずなのにどうして?しかし、何にせよ現実として解けないので、自分はプログラミングが苦手であると考えるしかありませんでした。

まあそういった思いを抱えていたために、こちらのセッションが気になりました。そして、聴講してどうだったか。 キーワードは「状態遷移」でした。状態遷移というとフラグとかステータスの遷移を連想しますが、それ以外にもそもそも逐次実行もプログラムカウンタの状態遷移であるという内容がありました。プログラミングとは本質的に状態遷移を扱うものなのかもしれないですね。故に難しい。 たとえばオブジェクトはできるだけ状態を持たせない、できるだけ不変にする、というのが基本的には良いことだとされています。状態を扱うことは難しいからです。つまり、プログラミングは本質的に難しい…

アルゴリズムの実装について、隠れた状態を発掘するのが難しい、しかしそれを見つければ実装自体は簡単、という例が出ていました。とてもよくわかります。競プロでもそういう問題は多いです。難しい。難しいけど、プログラミングができるようになる、動くコードを書くというのはそういうことが容易にできるようになることなのだと理解しました。きれいなコードを書くとかもめちゃくちゃ大事ですし、プログラミングする上で大事なこと、習得が必要なことはたくさんあるけど、それらはアルゴリズムをちゃんと発想できるようになってからの話なのかと思いました。

生成系AIによって仕事が奪われないかどうかがよく話題に上がるようになり、私もすごく不安を抱えていますが、こういったことができるようになればAIに仕事を奪われなくて済むのではないかという趣旨が示されて締めくくられていました。この時代にこそ基礎力が大事になるのですね。 アルゴリズムもそうですが、コンピュータの動作原理などのいわゆる低レイヤーの知識も重要になるのかなと思いました。プログラムカウンタとかはそういう話ですし。

なので、今後その辺りを中心に自己研鑽をしていこうかなと思いました。アルゴリズムについては、引き続き競プロに力を入れることで鍛えていけるかなと思いました。今回のセッションだと競プロには触れられませんでしたが、触れるつもりではあったらしいので…

低レイヤーはまた別途やらないとダメですね。積んでいるNand2Tetrisを進めたい…

Spring Eventsでのトランザクション処理の地獄とそれを解決できる方法

github.com

Spring Eventsは使ったことがないですが、イベントハンドラの形でリクエストを処理するフレームワークのようです。このセッションでは、実際にコードを修正して動かしながら説明をされていました。内容としてはトランザクションの考慮が足りなくてイベントの処理順が想定通りにならない問題と、その解決方法についてです。結論としては @TransactionalEventListener を使うとなっていました。 やはりアノテーションを使ってトランザクション管理するのは難しいですね。アノテーションの仕様をそれなりに深く理解していないと、まさにこの例のような罠を踏んでしまいます。アノテーションを付けるだけでそれっぽくは動くので便利だけど、裏ではアノテーションプロセッサがめちゃくちゃ頑張っているので挙動を把握しにくいです。仕様の調査、綿密なテスト。当たり前っちゃ当たり前だけど、アノテーション周りは特に気をつけたいです。

ところで、デモではIntelliJ IDEAでtest.httpというファイルを開いて、それを使ってHTTPリクエストを送っているのが気になりました。ざっくり調べたところ、IntelliJ IDEA Untimateで使えるプラグインの機能のようでした。VSCodeにも似たような機能があるようです。便利そう。

それと、なんとベルギーのチョコをいただいちゃいました。美味しかったです。ありがとうございました。

Database Rider を用いたデータベーステスト

スライドは現時点だと公開されていないですが、するとは言っていた気がします。

内容としてはタイトルの通りで、Database Riderというツールの使い方についてでした。リポジトリ層のテストとして、実際にDBにアクセスさせて行う部分の支援ツールですね。DBにテストデータをINSERTする機能のほか、アサーションをする機能もあるとのこと。 今の私の業務ではテストデータのINSERTやアサーションはJdbcTemplateを使ったりしていて、かなり冗長で醜い感じになっています… なのでその辺りをDatabase Riderでなんとかできるのだとしたらすごくありがたいですね。できれば導入したい。アサーションもしてくれるというのがすごく気になります。

DBのテストはテストデータの扱いも面倒ですが、テスト実行に時間がかかりがちという問題もあります。せっかくなのでその辺りの対策について質問してみました。H2をインメモリモードで動かして使うことでかなり速くなるということでした。たしかに速くなりそうなのですが、実際にプロダクション環境で使うRDBMSは大抵はH2ではないと思うので、テストと本番で異なるRDBMSを使うというのがテストとしていいのかどうか気になりました。 少し調べてみた感じだと、H2にはMySQLモードで動かすとかそういう機能があるとのこと。本物ではないのでそれでもカバーできる範囲は限られるのでしょうけど、それでも良いケースもあるのかも。あるのかな?この辺りはもうちょっとちゃんと調べたい。

おわりに

最近の関心事はアルゴリズム、テスト、DBという感じだったので、まさにそれというトピックのセッションを無意識に選んでいました。 やはりJJUG CCCみたいなイベントは現地に行くのがいいですね。コロナ禍でオンライン開催だったときは、参加しやすいはずなのにあまり参加しなくて… 久しぶりにまともに参加できてよかった。アルゴリズムを勉強する重要性についても再確認できたし、これからも頑張っていきます。