Ruby の ===

Ruby3.3リファレンスマニュアルで主要なクラスだけ調べた。

経緯

昨日の「勝手にモブプロ」で、Rubyにも===あるよねって話が出てた。
そうだっけ?なにするんだっけ?って思ったので調べた。

結論

Objectクラスで===は定義されている。デフォルトはObjectクラスの==と同じ。
=====は、各クラスの性質に合わせて各クラスで再定義されている。

=====と異なる意味で再定義されている主要なクラス↓
・Range
Regexp
・Proc
・Module

case when式when===を呼び出している。

詳細

Objectクラスの == と ===

根本的なところ

==

Object#== (Ruby 3.3 リファレンスマニュアル)

オブジェクトと other が等しければ真を返します。
デフォルトでは equal? と同じオブジェクトの同一性判定になっています。

つまりobject_idが等しければtrueを返す。

このメソッドは各クラスの性質に合わせて再定義すべきです。多くの場合、オブジェクトの内容が等しければ真を返すように(同値性を判定するように)再定義されることが期待されています。

この部分は下記のおまけに記載。

===

Object#=== (Ruby 3.3 リファレンスマニュアル)

デフォルトでは内部で Object#== を呼び出します。

==と同じくobject_idが等しければtrueを返す。

case 式で使用されるメソッドです。制御構造/case も参照してください。

case式に関しては以下。
制御構造 (Ruby 3.3 リファレンスマニュアル)

case whenをifにすると===がみえてくる

case 式0
when 式1, 式2
  stmt1
when 式3, 式4
  stmt2
else
  stmt3
end

は以下とほぼ等価

_tmp = 式0
if 式1 === _tmp or 式2 === _tmp
  stmt1
elsif 式3 === _tmp or 式4 === _tmp
  stmt2
else
  stmt3
end


=== が ==と異なる再定義をしているもの

Range

Range#=== (Ruby 3.3 リファレンスマニュアル)
始端と終端のなかにあるときにtrueを返す。
内部ではRange#cover?が実行されている。
(2.5以前はRange#include?だった)

(1..10) === 10     #=> true
(1...10) === 10    #=> false

("a".."b").include?("a")    #=> true
("a".."b").include?("ab")   #=> false
("a".."b").cover?("ab")     #=> true
("a".."b") === "ab"         #=> true
Regexp

Regexp#=== (Ruby 3.3 リファレンスマニュアル)
文字列との正規表現マッチを行う。マッチしたときはtrueを返す。

/\A[a-z]*\z/ === "HELLO"  #=> false
/\A[A-Z]*\z/ === "HELLO"  #=> true

"HELLO" === /\A[A-Z]*\z/  #=> false
#逆はダメなので注意
Proc

Proc#=== (Ruby 3.3 リファレンスマニュアル)
Procオブジェクトを実行して結果を返す。

proc = Proc.new{ | a , b | a * b }

proc.call(2, 5)     #=> 10
proc[2, 5]          #=> 10
proc === [2, 5]     #=> 10
Module

Module#=== (Ruby 3.3 リファレンスマニュアル)
指定のオブジェクトがそのクラスかそのサブクラスのインスタンスであるときtrueを返す。

class Mikan < Object
end

class Arita < Mikan
end

mikan = Mikan.new
arita = Arita.new

Object === mikan   #=> true
Mikan === mikan    #=> true
Arita === mikan    #=> false
Object === arita   #=> true
Mikan === arita    #=> true
Arita === arita    #=> true

mikan === Mikan    #=> false
#逆はダメなので注意

おまけ

== は 人の目で同じならtrue、に再定義がほとんどっぽい

たしかにequal?==がちょっと意味が違うクラスがほとんど。
人の目でみて同じならtrue、という意味に再定義されている。

Integer

Integer#== (Ruby 3.3 リファレンスマニュアル)

1 == 2            #=> false
1 == 1.0          #=> true
1.equal?(1.0)     #=> false

1はIntegerクラスで1.0はFloatクラスだが、==はtrueになる

Array

Array#== (Ruby 3.3 リファレンスマニュアル)

array = [ "a", "c", 7 ]

array == [ "a", "c" ]             #=> false
array == [ "a", "c", 7 ]          #=> true
array.equal?([ "a", "c", 7 ])     #=> false
Hash

Hash#== (Ruby 3.3 リファレンスマニュアル)

hash = { 1 => :a, 2 => :b }

hash == { 1 => :a }               #=> false
hash == { 2 => :b , 1 => :a }     #=> true
hash == { 2 => :b , 1.0 => :a }   #=> false 

{ :x => 1 } == { :x => 1.0 }      #=> true 
Range

Range#== (Ruby 3.3 リファレンスマニュアル)

range = (1..2)

range == (1..2)                #=> true
range == (1...2)               #=> false
(1..2) == Range.new(1.0, 2.0)  #=> true
range.equal?(1..2)             #=> false
Regexp

Regexp#== (Ruby 3.3 リファレンスマニュアル)

a = /\d\d\d/

a == /\d\d\d/    #=> true
a == /\d{3}/     #=> false
a.equal?(/\d\d\d/)   #=> false

終わりに

るりま読んでこれ書いたけど、チェリー本にがっつり書いてあった…。

===がどのように定義されているか分かるとwhen節の条件部に何を書くか明確にできる。(気がする)

完全未経験から現在フィヨルドブートキャンプで学習中。
自分で気になったところの記録(メモ)です。
間違い等あればご指摘いただければ幸いです。

参考リンク

library _builtin (Ruby 3.3 リファレンスマニュアル)

2024.2.12~2024.2.18【週報】

今週の振り返り

目標と成果

目標 成果 反省・感想
JSクラスの課題のOKをもらう 👍
バイトがある日も最低1時間は勉強する ○? 一応やったけど…

やったこと

今週の学習時間

学習時間:31時間30分
学習日数:7日

今週あった出来事&感情

  • 初めてのLT会に参加!
    自分の知らないことも多くとても興味深く聞かせていただきました〜!

  • 家族が発熱しコストコ行くの中止
    コロナ陽性…

  • 私も土曜から発熱しバイト休む
    数年ぶりの発熱…

来週の目標

  • はやく元気になる

来週の予定

  • 前職上司の退官を祝う会に参加する
    なので絶対に元気にならないといけない…


    頑張ろう!

2024.2.5~2024.2.11【週報】

今週の振り返り

目標と成果

目標 成果 反省・感想
Omotesando.rb#94の参加記録記事を書く ⚪︎ 👍
バイトがある日も最低1時間は学習する × 3日できた…
(提出物が返ってきたらそれの修正に取り掛かる) ⚪︎ 💪

やったこと

  • JSクラス課題修正
    命名難しい…

  • 自作npm着手
    JSクラスの課題が返ってくるまでのあいだ、少し自作npmのことを考えてました。
    イデア出しがなかなか難しいなと感じています…

  • Omotesando.rb参加記録投稿
    今回も知らないことがたくさんあって勉強になりました🙏
    参加記録:Omotesando.rb#94にオンライン参加しました!

  • Rails輪読会参加
    Gitフック機能、RuboCopオプション、Brakeman
    バイトで1回しか参加できず…😭

  • リーダブルコード輪読会参加
    条件文の引数順、三項演算子
    早期リターン、ガベージコレクション、ネスト、continue

今週の学習時間

学習時間:22時間45分
学習日数:6日
週5でバイトしてましたが、目標をたてたことでなんとかPCに向かうことができました。
(日曜日は心折れましたが…)

今週あった出来事&感情

  • たくさん稼働延長(残業)した結果、体がボロボロになった
    倉庫でのアルバイトのため肉体労働が中心なのですが、残業まで頑張った結果体がボロボロになりました。苦笑
    来週は加減してやりたいと思います。

来週の目標

  • JSクラスの課題のOKをもらう

  • バイトがある日も最低1時間は勉強する
    朝起きてバイト前に勉強する方がいいのかもしれない…💡

来週の予定

  • 懸命にバイトする…

  • 家族でコストコに行く

Omotesando.rb#94にオンライン参加しました!

2月1日にOmotesando.rb #94に参加しました!
【オフライン開催】Omotesando.rb #94 - connpass
都合で今回は初のオンライン参加をしました。
参加しての感想・自分で調べたことを記録しています。
間違い等ありましたらコメントいただけたら幸いです。

会場提供:MEDLEY様 Layzieさん

医療ヘルスケアの未来を作るサービスを提供。
人材プラットフォーム事業(ジョブメドレーなど)
医療プラットフォーム事業(電子カルテやオンライン診療支援システム、患者向けオンライン医療事典など)
システムの8割くらいRailsで、残りはNode、Goとか。
エンジニア募集中とのことです!

ふぁくとさん (@faktfakt)

Rails+OracleDBにおけるboolean型カラムの初期設定でハマったこと」

t/fではなくてboolean型のtrue/falseにしたいが、なかなか難しかったというお話でした。
Railsのデフォルトがt/fでOracleのデフォルトがY/Nになっているようで、
そのズレが原因のような気がするとおっしゃっていました。
私はRDBMSではPostgreSQLSQLiteしか触ったことがないため、OracleDatabase自体をあまりよく分かっていませんが、
「元々これだったのでなぜその技術が選定されたのか分からない」というお話しも出ていて、
そのへんは難しいのだなぁと感じました。

Yuji Tさん (@yujittttttt)

正式なタイトルを全文メモできませんでした…すみません。
神奈川県公立高等学校入学者選抜インターネット出願システムの不具合(メールが受信できない問題)に関するお話でした。
DKIMの設定がされていなくてDKIM認証が失敗してしまっている、とのことでした。
LT内で紹介されていた記事:出願システム不具合の原因、DKIM 未設定& DMARC 検疫か | カナガク
DKIM:送信メールの改ざんやなりすましを防ぐ技術。
出願システム不具合の原因、DKIM 未設定& DMARC 検疫か | カナガク
知らない単語もたくさん出てきましたが、メールが送信されてから受信されるまでどのような認証を通っているのかの流れがなんとなく分かった気がしました。
SPF/DKIM/DMARCとは?意味・定義 | ITトレンド用語 | ドコモビジネス | NTTコミュニケーションズ
GMailも今月から1日5000件以上メールを送信する場合は規制が入ったりする(要件を満たす必要がある)そうで、
年々メールを送ることが難しくなってきている、メールを送るのはやめた方が良い、という意見もあるとのことです。
そんな現状を全く知らなかったので、もっとITのニュースをとりこむようにしようと思いました。

ShintaniTeppeiさん (@euglena1215)

「習うより慣れる Ruby AST」


AST:Abstract Syntax Tree(抽象構文木
RubyAST:Rubyのプログラムを意味のあるかたまりごと(トークン)でツリー構造に変換したもの
ソースコードはあくまで文字列なので、文字列を解釈可能なものに変換する必要がある
Rubocop:RubyプログラムをRubyASTに変換して、あらかじめ用意しておいた違反しているツリー構造と一致しているかどうかをパターンマッチして警告を出している

RubocopはRubyのコードをASTという形に変換して解析していることを初めて知りました!
スライドにたくさんの例を示してくださったおかげで、ASTがどういうものなのかなんとなく分かった気がしました。

RubyプログラムがどんなASTになるのか、逆にASTがどんなRubyプログラムにマッチするのか確認できるツールを作成されたとのことでした!
ツール:rubocop-ast.wasm
ブログ記事:rubocop-ast.wasm を作った - カレーの恩返し

RuboCopの解析をもう少し調べてみましたが、難しかったです…。
RubyのコードをParserというgemでASTに変換して解析している、というだけ分かりました。
もう少し学習を進めてから再度学んでみたいと思いました。
RuboCop Under a Microscope - Speaker Deck

なぜASTを調べたのかとの問いに、RuboCopのカスタムルールを作りたくて、とおっしゃっていました。
カスタムルールの作り方の記事が結構あったので自分用に残しておきます。
Rubocop でカスタムルールを作る - Money Forward Developers Blog
RuboCopの新しいルールを追加する方法(Custom Copの作り方) - アジャイルSEの憂鬱
[Rails基礎] RuboCop カスタムCopのつくり方

maki O/O/さん (@makiOo1o)

「独学・業務未経験者の学習方法」


以前の自己紹介で就活されていることは知っていましたが、独学で学習されていたのは知らず驚きました!
そしてやったこと一覧が山盛りで興味深く聞かせていただきました。

質問をレベル分けする、というのは質問が苦手な私もすぐできるしやってみようと思いました。
ロジックを考える際、自分も少し紙に書いてやっている部分が少しあるのですが、
makiさんがやってらっしゃる紙プログラミングのように丁寧ではないので、
もっと深掘りすることでロジックを説明する力がつくのかな、と感じました。

今後の学習で使えるヒントがたくさんあったので、実践していきたいです!

小林悟史(noel)さん (@free_world21)

Ruby/Railsの勉強会のおかげでブルーモ証券起業した」


以前にLTをしたことがきっかけで証券会社のシステムをRailsで作ったというお話でした!
LTの資料をSpeakerDeckにあげて、そのリンクをLinkedInに載せていたところ、XのDMでお声がかかったとのことでした。
そのきっかけになったLTはこちら↓
金融機関の(システムの)作り方 - Speaker Deck

話を聞いていて初学者の私は、ただただ「すごい〜!」と驚くばかりでした。
Railsってやろうと思えば証券会社のシステムも作れるのか!なんでもできるんだな!」と思いました。 (なんでもかはわかりませんが)
Railsの勉強をしていくのがさらに楽しみになりましたし、LTをすることで自分の将来の幅が広がっていくことも聞けて良かったです!

ryosk7さん (@ryosk7)

「技術書典からバックレなくて良かった話」


技術書典15でRubyとNFTを題材にした本を出されたそうです!
スライドの「お前なにやってたん期間」に笑いました。笑
限られた10日程の期間の中でのスケジュールがすごかったです。

その限られた期間の中で勉強されたという言語が、知らないものだったので調べました。
SOLIDITY:Ethereum(ブロックチェーン技術が備わったプラットフォーム)のブロックチェーン上で動作するプログラム(コントラクト)を記述することができるプログラミング言語
Solidityとは?基本文法や実装方法まで実例を用いて詳しく解説|Udemy メディア
Solidityはどのような開発言語?特徴・習得難易度・市場価値をご紹介|フォスターフリーランス
Solidity とは何か? 開発環境を構築する! #初心者 - Qiita
Hardhat:Ethereumの開発環境でのスマートコントラストの環境開発ツール HardHat: 導入方法
Hardhatの公式ドキュメントを読み解いてみた #Blockchain - Qiita

また、インプットとアウトプットが両方できた、とおっしゃっていたのも印象的でした。
執筆、というとアウトプットのイメージが強かったのですが、執筆に向けて新言語を勉強したり今までの技術を再度確認したりすることでインプットもできるのだなと思いました。

kaibaさん

「動かして完全に理解するSidekiq」


非同期処理の詳しくの図がわかりやすかったです!
コードをお借りして再現できるかやってみようとしましたが、そもそもRedisを起動するためにDockerが必要なのを忘れていました…。
パーフェクトRuby on Railsを読んでいて、ActiveJobの非同期処理でSidekiq実行するというときにRedis環境のためにDockerが必要でそこで立ち止まったのを思い出しました…。
Dockerの知識がほぼないので、もう少し学習を進めて再度チャレンジしようと思います。
LTのデモで実際にキューの中のジョブを実行している様子を並列と縦列で見て、なるほど〜と思いました!


まとめ

初めてのオンライン参加でしたが、しっかりLTをきくことができました。
LTも技術の話から多種多様でとても面白かったです!
また現地参加して、いろんな方とお話ししてみたいと思いました!
ありがとうございました!


2024.1.29~2024.2.4【週報】

今週の振り返り

目標と成果

目標 成果 反省・感想
JSクラスプラクティスのクラス分けを決めて、
機能を最低1つは実装する
⚪︎ 提出できたので
レビューきたら修正
学習時間を40時間超える × 学習時間を全然把握
していなかった
SOFTSKILLSを読み終える ⚪︎ 🙌

やったこと

  • JSクラス課題
    標準入力
    Readline | Node.js v21.6.1 Documentation

  • Rails輪読会参加
    エラーハンドリング
    CI、GitHubActions
    Rubocop

  • リーダブルコード輪読会参加
    コメント:実例、コードの意図、情報密度

  • 勝手にモブプロ参加
    Rackについてでした!良い勉強になりました!
    [Rails基礎] RackとRackミドルウェア|Railsの練習帳

  • Omotesando.rb#94オンライン参加
    初めてオンライン参加しましたが、やはり現地参加したい〜と思いました!

今週の学習時間

学習時間:39時間45分 学習日数:5日

今週あった出来事&感情

  • 友人とカレーを食べに行った🍛
    彼女の行動力や仕事への考え方を聞いて学びになった!

来週の目標

  • Omotesando.rb#94の参加記録記事を書く

  • バイトがある日も最低1時間は学習する

  • (提出物が返ってきたらそれの修正に取り掛かる)

来週の予定

  • 懸命にバイトする…



2024.1.22~2024.1.28【週報】

今週の振り返り

目標と成果

目標 成果 今後
JS非同期処理のプラクティス課題を終わらせる ⚪︎ 👍
Omotesando.rb参加記録のブログ記事を投稿する ⚪︎ 👍
SOFTSKILLSの第6部を読み終える ⚪︎ 第7部へ

やったこと

今週の学習時間

学習時間:20時間
学習日数:5日
今週はかなり少なかったです…

今週あった出来事&感情

  • FBCの方たちとランチ会🍖
    今後のアイデア出しに参考になるお話をたくさんしてくれました!楽しかったです😄

  • FBCミートアップ参加
    ミートアップでのコミュニケーションにもここ数ヶ月でだいぶ慣れてきました😅笑

  • 新春輪読会EXPO2024開催🎍
    主催させてもらいました!
    みなさんに楽しかったと言っていただけて嬉しいです😭✨
    コミュニティ参加をしたいけど勇気がでない、という人の後押しが少しでも出来たなら幸いです🙌

  • 風呂の電気がつかなくなった
    不動産屋、大家さんとのやりとりにてんやわんや

  • 車のバッテリーがあがっていてバッテリー交換した
    保険会社、ロードサービスとのやりとりにてんやわんや
    そして金欠…

来週の目標

  • JSクラスプラクティスのクラス分けを決めて、機能を最低1つは実装する

  • 学習時間を40時間超える

  • SOFTSKILLSを読み終える
    第7部で全部読み終わるので頑張ろう!

来週の予定

  • Omotesando.rb#94 オンライン参加

Omotesando.rb#93に参加しました!

1月11日にOmotesando.rb #93に参加しました!
【オフライン開催】Omotesando.rb #93 - connpass
前回が初めてで今回は2回目の参加でした!
参加しての感想&自分で調べたことを記録しています。
間違い等ありましたらコメントいただけたら幸いです。

会場提供:wantedly様 Oshiumiさん

選考前と入社後のプロダクトを作っている。
システムの多くはRuby、サービスによってGo、Pythonも。
元々がRailsができている。
Wantedly Engineering Handbook - Wantedly Engineering Handbook
エンジニアを積極採用中とのことでした!

リサさん

「N+1問題が起こる原因について調べてみた」

smallmoneky.hatenablog.com


自分もよくN+1問題対策を忘れて引っかかっていた部分でした。
最近Railsから離れていてちょっと忘れかけている部分だったので、また調べて思い出さないとなと思いました。
Active StorageのN+1問題を解決する - 時々とおまわり
Active StorageのN+1問題を解決する #Ruby - Qiita

each文がN+1を引き起こす原因なのではなく、each文の中で、articleに紐づいている、userのデータを毎回取得しにいっていることが原因

自分の予想、過程、結果ととてもわかりやすいLTで、堂々と発表されていてかっこよかったです!
自分もわからないを放置しないようにして、自問自答しながら理解していきたいなと思いました。

神速さん

「LTの敷居を下げる」


「話すネタがない」のところの、

Ruby関連で新しく覚えた何かを話すくらいの気持ちで良い

というのが印象的でした!
「Omotesando.rbに初めて参加した人、Rubyを使い始めて3年未満の人は手をあげて〜」と声がかかると、
自分含めたけっこうな人数の人が手をあげていて、
「Omotesando.rbに初めて参加する人も多いし、RubyRailsの経験が浅い人も多いから、LTもそんな難しく考えなくて良い」とおっしゃっていました。
「みなさん全員Rubyをずっとやってきているベテランの方々ばかりなんだ」と勝手にイメージしていたので、ちょっとだけLTが身近に感じられるようになりました!

そして最後に教えてくださったメソッドは、私はmapしか知らなかったので、勉強になりました!
flat_mapEnumerable#collect_concat (Ruby 3.3 リファレンスマニュアル)
filter_mapEnumerable#filter_map (Ruby 3.3 リファレンスマニュアル)

まいむさん

Rubyメソッドの勉強 紆余曲折」


勉強してもすぐに忘れる…

めちゃくちゃ共感しました!
こないだ見たはずなのに「なんだっけ…?」みたいなのが頻発しているので、まいむさんのLTはとても参考になりました!

  1. Rubyメソッドの暗記カードを作成

  2. AtCoderの問題を解く

  3. 資格試験を受ける(RubySilver)

  4. ドキュメントを読み込む

私はどれもやったことがないのですが、
みなさんこうやって試行錯誤して努力されてスキルアップしているんだなと思ったので、
自分もなにか工夫してやってみようと思います!

Hamaさん

「ActiveModel::APIで使用されるゲッター・セッターメソッドについて」


現地では全然ついていけませんでした。
セッターメソッドの方が簡単だったとおっしゃっていたので、自分はセッターメソッドをHamaさんのLTを参考に追ってみることにしました。
------以下自分の勉強過程------

class User
  include ActiveModel::API
  attr_writer :name, :age
end

User.new(name: '太郎', age: 20)
#=> <User:~ @name='太郎', @age=20>

上記ではnewしたときに引数にメソッド名を:で渡すと値が該当するインスタンス変数に入る。
これがなぜ起きているのかを見に行く。
ActiveModel::API
initializeメソッドはActiveModel::APIの中にある。
rails/activemodel/lib/active_model/api.rb at 36c1591bcb5e0ee3084759c7f42a706fe5bb7ca7 · rails/rails
そのなかにassign_attributesメソッドがあるのでその中へ。
rails/activemodel/lib/active_model/attribute_assignment.rb at main · rails/rails
最終的には以下にたどりつく。
rails/activemodel/lib/active_model/attribute_assignment.rb at main · rails/rails

def _assign_attribute(k, v)
        setter = :"#{k}="
        public_send(setter, v)
  略
end

このknamev'太郎'が入る。
setter = :"name="となりこれがpublic_sendメソッドに送られる。
Object#public_send (Ruby 3.3 リファレンスマニュアル)

オブジェクトの public メソッド name を args を引数にして呼び出し、メソッドの実行結果を返します。
name:文字列かSymbol で指定するメソッド名です。

第一引数にシンボルを入れるとそのメソッド名を呼び出して第二引数をそのメソッドに渡すのでname=メソッドが実行され'太郎'が渡された。
結果newしたときに@name='太郎'となった。
------ここまで------

今回メソッドの中にどんどん潜って見にいくことをしたのは初めてだったので、コードを追っていく過程はとても勉強になりました!
ありがとうございました!
自分にはセッターメソッドの方ですらなかなか難しかったのでゲッターメソッドはいずれ追ってみたいと思います。

kishimaさん

「Now is the time to create your own (m)Ruby computer」


コンピュータを作る実際の手順を説明してくださっていて、とても難しかったですが興味深かったです!
今回はmrubyでアプリケーションを書いたとのことでしたが、mrubyがあまりわかっていなかったので調べました。
チェリー本に以下のようにありました。

Rubyには複数の処理系(複数のRuby実装)があります。公式かつ最もポピュラーな処理系は、C言語で実装されたMRIです。
ほかにも、Javaで実装されたJRubyや、GraalVM上で動作する高速なTruffleRuby、Restで実装されたArtichoke、RubyスクリプトJavaScriptコンパイルできるOpal、組み込みシステム向けのmrubyなど、さまざまな処理系があります。

mrubyの特徴としては、以下があるようです。

  • CPUやOSに依存せず、省リソース且つ省メモリでの環境で実行ができる

  • C言語との高い互換性

  • アプリへの組み込みが容易

  • 拡張しやすい
    「mrbgems」を使って自由に拡張できる

mruby 最新情報 | OSSサポートのOpenStandia™【NRI】


Rubyの処理系のことはあまり知らなかったので、今後勉強してみたいなと思いました!
自分オリジナルのコンピュータ、かっこいい…✨

SoraIchigoさん

「テストカバレッジを100%にするということ」


テストカバレッジを使いこなして信頼できるテストを作ろうというLTでした!
自分はまだ学習途中で、テストカバレッジ云々はあまり実感していないところではありますが、
前回のOmotesando.rbでもテストカバレッジのLTがあって、
実務においてテストカバレッジは注目すべき点なんだなと思いました。
そして、テストカバレッジを増やすことを目的にしてはダメで、信頼できるテストを増やすことが大事ということもわかりました。
以下の言葉が印象的でした。

  • 最初にテストを書いておけばテストを書く場所を作れるので自ずと後続の人もテストを書いてくれる

  • 実装と同じくらいテストコードも負債化する
    せっかく書いたテストが将来のテスト追加を阻まないように注意


チーム開発のプラクティスに入ったら、テストもたくさん書くらしいので、良い勉強になるな〜と楽しみにしておこうと思います。

まとめ

今回はFBC生(現役・卒業生)が多くて嬉しかったです!
今後も参加していきたいと思います!
ありがとうございました!