おはようございます。ワンダーソフト開発部です。
モチベーション
最近、弊社ではScala開発に参加するメンバーが増えてきたので、Scalaの良さげなサイトを探しています。
コーヒーブレイクの最中に他のエンジニアさんや生成AIチャットと会話をしながら、ちょっとずつ頭に浸透させる無理なく日常的にScalaができたら、、、と目論んでいる次第です。
s-99
s-99 というサイトをご存知でしょうか。ScalaのListの問題がパズルように並んでいてそれを少しずつ解いていくサイトになります。名前の通り99問くらいあったと思います。時々眺めては触ったりしています。パターンマッチの問題が多い印象です。
この問題を解いて生成AIに解説してもらう、というのもアリな気がしました。
P01 (*) Find the last element of a list
そして早速1問目でつまづきました。claudeを利用して解いてみたら、
object P01 {
def last[A](list: List[A]): A = list match {
case Nil => throw new NoSuchElementException("Empty list")
case x :: Nil => x
case _ :: tail => last(tail)
}
}
いいような、、、でも最初に Nil でマッチでいいのだっけ。。となりました。
これに疑問を感じたので 最初にNil でいいのかな。。?ということを質問すると別の回答を出してきました。
> Is it efficient to match Nil first in pattern matching?
⏺ No, matching Nil first is not efficient. In pattern matching, Scala evaluates patterns top-to-bottom, so checking for empty list first means every recursive call has to check
the empty case before the actual cases.
For the last function, it's more efficient to match the base case x :: Nil (single element) first, then the recursive case _ :: tail, and finally Nil for the error case:
def last[A](list: List[A]): A = list match {
case x :: Nil => x // Base case - single element
case _ :: tail => last(tail) // Recursive case
case Nil => throw new NoSuchElementException("Empty list")
}
解説つきで返答してくれるのですが、最初からこの回答にならなかったのは、たまたまなのかな、と思い、何度かセッションを立ち上げ直して確認しても同様でした。 ここら辺がどうしてなのかな、というのを追いかけてみたいと感じたので、以下の claude-trace を利用してみました。 https://github.com/badlogic/lemmy/tree/main/apps/claude-trace
npm install -g @mariozechner/claude-trace
ライブラリをインストールした後に、以下のコマンドを実行するとログが自動で取れるようになるようです。
claude-trace
その後、同様の質問をし(結局同じ回答が返ってきました。)てから、claude のセッションを exit すると、自動でブラウザが立ち上がって、以下が表示されました。
確認した情報
1つ目のタブで一連の会話の内容がHTML表示されました。日本語で質問した場合は文字化けでした。。
2つ目のタブと3つ目のタブでおそらくanthropic社のapiとの通信のpost情報等が記載されていました。
どう言う質問をどのようにしていったのかをHTMLでパッとみれて他の人と共有できるかもしれない、という点では良さそうでした ✅
ただ、回答をどうしてそう考えたのか、、についての記載はありませんでした。ここはプロンプトだったり reasoning を利用する、という方が有効に思いましたが、日常づかいでどこまでそれを意識して使うのか、、という疑問と、claude code action などで実装やレビューで活用する際にも似たような問題が発生するのかな、という疑問が発生しました。
良いドキュメントを求めて、、、コーヒーも試供します☕️
社内で良さそうな記事とかリポジトリのリンクを集めてWikiページを作っていきたいと考えています。ブログとして公開して時々更新するような方法も検討したいと思います。もし良いサイトがあればどなたか教えていただければ、と思います。
生成AIを活用して学習する、という部分については、個人個人でやるよりも、他の人と一緒に生成AIに質問をしてみる、ということをして議論の枠を広げるために役立てるのもいいかも、と思いましたが、ここはどなたからご意見もいただきたいです。
上記の取り組みについてドキュメントやサイトの情報を下さった方にはコーヒーを試供させていただければ、と考えています☕️
参考
- https://aperiodic.net/pip/scala/s-99/
- https://hexx.github.io/scala_text/exercises.html
- そして気づけば
s-99 の問題解説を眺めて適宜質問をしながら、
ドリップコーヒーと共に、まったりとした時間が流れていきます。
コードとともに、いい香りの文化も自然と育ってきた気がしています。
今後も、ソフトウェア開発やデザインのあれこれについて、コーヒーとともにゆるく投稿していきますので、どうぞお楽しみに ☕✨
🔗 Wonder Soft Coffeeのオンラインストアはこちら:
👉 https://coffee.wonder-soft.com/collections/all