「リファクタリング専門チームによるお金周りリファクタリング」を斜め読みして思ったこと

engineer.crowdworks.jp

これ。すごく読みやすいし良い記事だった。

再現性のある取り組みだと思うのだけど、微妙に補足しといたほうが良いのかなーと思うところもあり、メモがてら書いておく。

専任が引っ張る体制

属人化を嫌って、「技術的負債はみんなで対処するぞ!」「そのためのコーディング規約とかを整備するぞ!」とかとかやりだすと、続かない。

2016年頃に、自分がまだRails初心者だったころにこんなことがあった。

class HogeHogeFeedbacksController < SecureApplicationController

  def create
    feedback_params = params.require(:feedback).permit(:content, :score, :version, :device_name)
    feedback = HogeHogeFeedback.new(feedback_params)
    feedback.user = current_user
    if feedback.save
      ...
      redirect_to ...
    else
      render :new
    end
  end
end

っていう感じの、ほぼほぼRails Wayに乗っかるようなコードをPull Request出したときのことだ。

レビュー時に「サービスクラス作れ」「サービスハンドラークラス作れ」とかとか言われた。「コード量が増えるだけじゃん?」と初心者ながらに反論したものの、受け入れられず、無駄に記述量だけが多いコードを書くことになった。

class HogeHogeFeedbacksController < SecureApplicationController

  def create
    HogeHogeServiceHandler.new(
      content: params[:feedback][:content]
      score: params[:feedback][:score]
      version: params[:feedback][:version]
      device_name: params[:feedback][:device_name]
    ).handle

    ...

    redirect_to ...
  rescue HogeHogeServiceCreationError => e
    render :new
  end
end
class HogeHogeServiceHandler
  def initialize(content, score, version, device_name)
    @content = content
    @score = score
    @version = version
    @device_name = device_name
  end

  def handle
    HogeHogeFeedbackCreateService.new(
      content: @content,
      score: @score,
      version: @version,
      device_name: @device_name
    ).perform
  end
end


class HogeHogeFeedbackCreateService
  def initialize(content, score, version, device_name, current_user)
    @content = content
    @score = score
    @version = version
    @device_name = device_name
    @current_user = current_user
  end

  def perform
    feedback = HogeHogeFeedback.new
    feedback.content = @content
    feedback.score = @score
    feedback.version = @version
    feedback.user = @current_user
    feedback.save!
  rescue ActiveRecord::RecordNotFound
    ...
  end
end

あまり覚えてないけど、たしかこんな感じの構成に書き換えたと思う。そしてレビューが通ってリリースされた。(そして、3ヶ月後くらいに変数名のタイポを発見したw)

Railsを普通に使ってる人が10人いたら、おそらく10人全員が変更前のコードを好むだろう。なのになぜタイポのリスクが高い後者のようなコードが受け入れられたのか?

 

そこに「ルール」があったからだ。

Railsをあまり知らない人でもとりあえずルールに従っておけば間違いない」みたいな解釈がされたルールがあったんだと思う。

 

課題のないところをルールで縛るとか、冷静に考えるとありえない話。なんだけど、 属人化を排除しないといけない!って思うと、「なるべくルールの例外はつくるべからず」みたいな判断が働いてしまう のだろう。しらんけど。

 

ともかく、今回MinoDrivenさん(とkinakoboさん?)がかなり引っ張っていろいろやってるのが大きいんだろうなーーーーーってブログ記事読んで思った。

すごく大変だと思うのだけど、こだわり持ってる人がとにかく突き進めていくのがこういう成功事例につながってるんだと思う。

間違っても「全員がこういう美しいコード書けるように整備しよう」とか考えないでほしいなって思った。

現状理解と斬新的な改善

現状を納得する必要はないけど、少なくとも動いてしまってるコードである以上は理解する必要がある。

  • 誰がどういう期待をもって使うものか
  • かりに全部作り変えたとして、残さないといけないものはどれか、捨ててもいいものはどれか

などなど、いくら現状がクソコードで納得しがたいものであっても、理解はしておかないといけない。

  たしかMinoDrivenさんと一緒にリファクタリングやってるkinakobo氏は、「実は使われていないメソッド」みたいなのを地道に消す取り組みとかもやってた気がする。

今回の記事には関係がないけど

qiita.com

あたりを読んだときも、似たようなことを感じた。

 

「こんなの1から作り直してやる!」から始めてはいけないと改めて思った。

「DDDで」とか「クリーンアーキテクチャで」とかは解決策ではない

自分がうっっっっっっすら記憶してる限りだと、お金周りのコードはモデルがファットなだけじゃなくて、コントローラもそこそこボリューミーだし、サービスクラスもいくつか絡んでいる、みたいな構造だったはず。(自分みたいな素人がなんとなくリファクタやってくれっていわれたら、多分コントローラとかサービスクラスを分解して、闇雲に何かをやる気がする)

そんななかで、モデルの役割整理にフォーカスを絞っているのが、成功の鍵なんだろうなーってうっすら思った。

・・・てか

リファクタリング専門チームによるお金周りリファクタリング」に書かれてないような前提の補足をして、より理解を深めて読んでもらいたいなーから書き始めたんだけど、なにも貢献できてない気がする。

やはり自分には文章力が足りない。

唐津の七ツ釜はとても良かった

3連休に何もしないのはもったいないので、唐津の方をドライブしてきた。

たまたまGoogle Map見てたら

f:id:YusukeIwaki:20190812152053p:plain

なんかおもしろそうなものが?

七ツ釜

遊覧船は1000円。

(ネットで調べると呼子の港から出る「イカ丸」みたいな名前のやつがあるけど、それは1600円するうえに、海上区間が長い)

んで、乗ってみると、これが結構良かった。1000円にしては十分楽しめる。

出港場所自体も結構景色が良くて、 f:id:YusukeIwaki:20190812152303p:plain

象の鼻を横に見ながら、七ツ釜のあたりまでは風は爽快に。 f:id:YusukeIwaki:20190812152355p:plain

七ツ釜は結構接近して見せてもらえる。(ガイドの人は、呼子発のイカ丸よりも近くで見れるよと言っていたが本当かどうかは不明) f:id:YusukeIwaki:20190812151534p:plain

一つだけ、穴が奥まで貫通してるのがあるんだとか。 f:id:YusukeIwaki:20190812152421p:plain

で、戻る。20分くらいのプチクルーズなんだけど、ちょうどよかった。

呼子は人が多い

その後、呼子波戸岬をまわって帰ったんだけど、呼子は有名になりすぎなのか、やたら人が多かった。

歩いて回ったわけじゃないので、実は楽しめる場所なのかもしれないけど、今回のドライブではスルー。行くなら、自家用車じゃなくてバス旅行かなー。

あと、「呼子イカ」って有名だけど、たぶん呼子じゃなくてもうまいイカは食えると思った。

海中レストラン?!

www.manbou.co.jp

今回はまったく下調べしないで適当にいったので、ここには行けてない。観光で誰か来た時に一緒に行こうかなと思った。


ということで、福岡から片道1時間半で結構いい場所あるなー、と再認識したのでした。

歯医者さんは、歯を良くしたいのではなく、歯を削りたい人が多い

まえおき

「ヤブ医者」っていう言葉はかなり昔からある。

なんだけど「そんなの、100人お医者さんが居たら1人か2人くらいでしょ?」となんの根拠もなく思って少年時代からいままで過ごした自分であった。

けど、最近になって、医者の存在意義を考え直し、わりと世の中は微妙な医者(ヤブ医者と断言はできないが、少なくとも良い医者ではない)にあふれてるんじゃないかって思い始めた。

医者の役割ってなんだ?

昔は、インターネットも何もなかったから、医者が言っていることが全てだった。 医者が「この風邪はこの薬をのまないと絶対に治らない」と言えば、みんな薬を飲んだはずだ。

でも今はインターネットでいろいろ調べることができるので、医者の評判だって病気のメカニズムだってざっくりと調べることができる。

そんななかで医者に求められることは何か?

「説明」だ。

弟子を何人も持つような専門医は別として、多くの町医者で求められるのは、間違いなく「説明」だ。このご時世、「この風邪はこの薬をのまないと絶対に治らない」なんて言った日には、もうそんな医者はつぶれるしかない。

現状がどうで、何を改善する必要があって、そのために最も使われている薬がこれだ。みたいな「説明」が合理的にされることを患者も期待しているわけだ。極端な話、説明が筋の通っていれば必ずしもその医者で治療される必要はない。治療は専門医を紹介してもらえば良いわけである。

ところでその「説明」は本当に正しいのか?

だがしかし、医者はずるい。

誤診をしても、生命に関わるような病気でなければ、多少の診断ミスが有ったとしても「いやー、私が見たところはそうだとおもったんですけどねー」に毛が生えたような弁明で済まされることがほとんどだ。

つい先日、ちょっとリンパの腫れがおかしくて医者に行ったんだけど、そのときの対応があまりにも印象的すぎて、いまこの記事を書いている。ちょっと書かせて欲しい。

1軒目(とても忙しそうな町医者)

リンパの腫れを触診される。

→○菌が鼻から入ってきたのかも。ちょっと血液検査と、○○菌のマーカーの検査しますね

→○○菌が陽性なので、抗生物質を飲んでください。また1週間後に来てください。

(まて、○○菌はそもそも常在菌だぞ?リンパが腫れるって、多くの場合ウイルスじゃねーのか?)

1軒目。1週間後

抗生物質は結構おなかの調子が悪くなるし、菌が原因じゃなかったら無駄でしかないので、自分は飲まなかった。当然「抗生物質飲んでない?」と半ギレされた。

→ 患部はちょっとは良くなっているけど、まだおさまっていないですねー。大病院を紹介するので、そこでエコー検査受けてきてください。

2軒目(1件目から紹介された大病院)

「今日はどうされました?」

(・・・紹介状よめよ! という言葉を飲み込んで説明をする)

→とりあえず、あらためて血液検査と、○○菌のマーカーの検査と、エコー検査しますね。ウイルス性のものかどうかを気にされているようですので、その検査項目も追加しておきます。

→XXウイルスの可能性もありますが、やはり○○菌が陽性なので、抗生物質を飲んでください。ただ、 1件目のやつは破棄していただいて 、私が処方するやつを飲んでください。エコー検査した結果、かるく炎症が起きていますが膿などは心配ありません。

(ウイルスの可能性があるのはわかったが、そもそも○○菌が原因だったらもっと重症化するはずでは・・・?絶対におかしい。)

3軒目(おじいちゃん先生がやっている町医者)

いままでの結果をまずはみせてください。生活習慣をいろいろ聞かせてください。・・・(略)

→白血球の数値を見ると、2軒めでウイルスかもしれないっていうのはそうだ。ただ○○菌が原因だから抗生物質飲めというのはちょっと違う。1週間も抗生物質飲まずに喉とか鼻に症状が出てないなら、今の生活習慣で今後もそれで症状は悪化しないはず。

→まずはウイルスなくなってから再度様子見しましょう。薬もいいけど、あなた健康志向でしょ?△△茶とか飲みなさい。多分それでよくなるから。あと、喉の膿は無いって話だったけど、それ耳鼻科の診断じゃないでしょ?耳鼻科でしっかり見てもらいなさい。そこは私は専門じゃなくてよくわからんので。


で、最終的に耳鼻科にも行き異常はなく、発症から10日目(3軒目の医者に行った3日後)くらいにはおさまり今に至る。抗生物質は飲まず、(期間は長かったが)自然治癒した。

耳鼻科は除き、今回は3人の医者がいる。おそらく一番正しい診断をしていたのは3人目の先生だ。1人目と2人目の診断は、「菌を殺さないと治らない」というスタンスだったが、実際にそうではなかった。

では、一番お金を儲けたのはどの先生だろう?

1人目:

  • 再診料
  • 問診、触診
  • 血液検査
  • マーカー検査
  • 投薬(医者は、抗生物質を処方する、というだけでお金がもらえるのだ)

→保険適用で3500円くらい。

1人目(2回め):

  • 再診料
  • 問診
  • 紹介状

→保険適用分が500円くらいと、紹介状が3500円。

2人目:

  • 初診料
  • 問診、触診
  • 血液検査
  • マーカー検査
  • 投薬

→保険適用で5000円くらい。

3人目:

  • 初診料
  • 問診、触診

→保険適用で1200円くらい。

言うまでもなく、最初の2人だ。

べつに「おまえら金儲け目的でやってるだろ!」とか言うつもりはない。最初の2人も自分なりの「説明」はしてくれている。なんだけど、3人目の診断のやり方を見ると、最初の2人(とくに2人目)の診断は、しっかり患者と向き合っていない結果とも思える。

 

"コンビニよりも多い" 歯医者はもっとヤバイと思う

タイトルの話。

自分は大学時代の不摂生のせいで、とても口内環境が悪い。あと、歯磨きが結構下手みたいで、定期的に歯医者に通っていないと虫歯になりやすい。

福岡に引っ越して、しばらく歯医者を行かずにいると、やっぱり歯の調子が悪くなってしまった。

評判な良さそうな近所の歯医者に行ったところ・・・

とりあえず親切そうな近所の歯医者に行った結果、2回めで虫歯治療といって歯を少し削って3回目で銀歯を入れることになった。

治療の説明などは比較的親切だったのだけど、通っているうちに歯医者のおっさんがあまりに短気すぎて不安になってきた。

患者に対してはめちゃくちゃ優しいのだけど、ただただ独り言が多くて、看護師にはかなりきつくあたっていて、その激しく表裏あることに不安を覚えた。なので、ある日突然行くのをやめて、別の歯医者にした。

(福岡市内では)信頼と実績の北欧歯科に行くことにした

www.hokuohshika.com

ここが、さっきの町医者の3人目のようなやりかたで、最初に生活習慣を聞くところから始まり、虫歯はあるけどそんなにすぐに進行しないというスタンスのもと、ひたすら歯磨き指導をされて今に至っている。控えめに言って、北欧歯科はめちゃくちゃおすすめである

あ、ちなみに、ここからが大事なところで、1軒目の短気な歯医者が入れた銀歯のところはレントゲンをとると全然治療がされていなくて、銀歯外して改めて治療して、詰め物(レジン)で埋め戻す、っていうのをやった

まじかよって思うだろうけど、まじです。

完全に蛇足だけど、札幌の三好プリベント歯科の話

5年前まで札幌に居たときにも、白石の 三好プリベント歯科 ってところに通っていた。ここもかなり予防に力を入れている医者だとは思う。

ただ、残念ながらここに通っていても、潜在的な虫歯の発見が遅れ、その治療をすることになった。治療してもらったのだが歯の削り方がとても雑で、2年後に再治療することになった。

治療をする段階で、別の歯医者を紹介してもらえばよかったと後悔している。

(といいつつも、三好プリベント歯科は、福岡の北欧歯科には劣るが、世の歯医者に比べるとおそらくかなり良い歯医者だとは思うので、誤解なきよう・・!)

 

結局、微妙な医者というのは・・・

これは完全に自分の偏見だけど、 生活習慣にフォーカスしてない 医者は基本的にダメである。

患部をみて、患部に効く薬を処方するだけなら、それは医療ではなくお金儲けだ。

エンジニアでもそうだろう。バグ解析で「ここのif文に条件が足りてなかった」と言ってif文をさらっと追加するようなエンジニアでは失格である。

患部をみて、生活習慣を聞いて、そのメカニズムを的確に説明できるのが、本当に信頼できる医者だ。薬はあくまで手段。歯を削ることもあくまで手段。薬を飲まなくても歯を削らなくても、生活習慣を正すほうが圧倒的に症状を改善できることは多い。

 

生活習慣第一

忙しいとどうしても薬にも頼りたくなるし、ささっと歯を削ってスッキリしたいという気にもなってしまう。でもそれで老後を迎えるとどうなるだろう?薬漬けで歯のない生活はしたいだろうか?

いや、俺はそんなのはいやだ。できるかぎり医者の世話になることなく健康で暮らしたい。

そんなわけで俺は今日も玄米を喰う

f:id:YusukeIwaki:20190810163453p:plain https://www.instagram.com/p/B0yXvEygWWa/