Skip to content

Instantly share code, notes, and snippets.

問題解決のしかたを本で読んで、実際にやっていくときにどう使っていくのかのイメージがつかない人が多そうなので書いてみる。 理解が深いほどある程度解決のための型があって、フレームワークの評価から実行へ移したくなったりもするけれど、過程で関わる人の理解がそろっていくのも大切なのでそこをどんなスピードとプロセスで進めていけるかが実地の問題解決者としてのアートな部分でもある。

  1. なにはなくとも現地現物。一次情報を聞きに行く
  2. 解決志向的な質問を立てる
  3. 分析をして確度を上げていく
  4. 解決をしていく

の順で説明をしていく。

@sunaot
sunaot / exception.md
Created August 2, 2013 09:13
例外設計の話

例外設計の話。

こんな指針がいいのかなー 2013 夏 ver.

例外の目的とは?

.NET の「例外のデザインのガイドライン」にもこう書いてある。

@sunaot
sunaot / intention_reveiling_names.md
Last active September 23, 2023 11:01
実装に名前をつけるのでなく意図に名前をつける

名前は使われる場面で使い方を指示したり制約したりするような意味合いを名前で表現できるとよい名前になります。

表現しているクラスだったり変数の実装を見ながらつけると名前をつけるもの自体を中心においてそれを説明する名前になります。良い名前にしたいなら、そのオブジェクトやメソッド、変数が使われる場面で、どのように使うと読みやすいか、ミスしやすい部分をミスしないように導けるかを気にしながら、使う人へメッセージとなるような名前をつけます。

これを実装ではなく意図に名前をつけると呼んでいます。CODE COMPLETE 上巻の 11.1.2 に『問題指向の名前』という半ページくらいの文章があり、 How でなく What に名前をつけるという主旨のことが書いてあるのが元ネタ (の一つ) です[^1]。

意図 というすばらしい語彙は Kent Beck が Smalltalk Best Practice Patterns というこれまたすばらしい本に Intention Revealing Names という話を書いているということを以前一緒に働いた Java エンジニアに教えてもらって以来、気に入って大事に使っています[^2]。

何が起こっているのでしょうか? それはコミュニケーションです。最も重要なのは、一行だけのメソッドでも、意図を伝えるために存在する価値があるということです。

@sunaot
sunaot / gist:946062
Last active June 23, 2022 00:07
DB 設計勉強会 / タワーズクエスト社 和田省二さんを先生にむかえた勉強会のメモ。文責は sunaot です。

DB設計勉強会

全体のテーマ

データモデリング

  • データと情報
  • エンティティとリレーションシップ
  • リソースエンティティとイベントエンティティ
  • リレーションシップと多重度(カージナリティ)
  • PK と AK と FK
@sunaot
sunaot / thor.md
Created March 4, 2016 08:13
CLI アプリケーションを書くときのアーキテクチャ

どこの層まで Thor であることを意識させるかというのはポイントになりそうな気がします。 database は Thor 以外からはけして呼ばれないでしょうか? たとえば、Web インターフェイスをかぶせた場合。bot を呼出し元として使い始めた場合。 実際にそれらを作り始めて不都合が出てから変えてもいいのですが、今の時点で

+--------------+ +-----------+
|  dispatcher  | |   view    |
+--------------+ +-----------+
+----------------------------+
@sunaot
sunaot / spec_file.rb
Last active April 26, 2022 05:23
Ruby で Groovy の Spock ぽい spec を書きたいという遊び。assert を書かないと power_assert できないのがかっこ悪い。
class Foo
extend Ruby::Spock
spec 'maximum of two numbers', ->(*) {
expect {
assert { [a, b].max == c }
}
where [
[ :a, :b, :c ],
[ 1, 3, 3 ], #=> .
@sunaot
sunaot / writing_unit_test.md
Last active February 20, 2022 06:57
テストを書くか書かないかの判断の話

ユニットテストでテストを書くか書かないかの判断の話

お題

メソッドの出力の結果が、true か false のどちらでも返ってくる可能性がある場合、assert 文を書く時は true の場合だけで良いのだろうか

テストとは

まず、基本の考えとしてなぜテストをするのか?というのがあります。

ユニットテストのガイドライン

  • 一つのテストに一つのアサーション (論理的なアサーション)。
    • 一つのテストで確認する意図は一つにすること。
    • アサーションの機能が弱いために、一つのことを確認するためにいくつかの実装上のアサーション (物理的なアサーション) を書かざるをえないケースはありえる。
  • よいユニットテストは一瞬で実行を終えなければならない (そうじゃないとコードの変更のたびに実行するのが面倒になる)。
  • 書くべきテストとは、同値分割と境界値分析を考慮して、モジュールの外面的な振舞いを検証するテストで、エラーを見つけられそうなもの。
    • 「テストとは、エラーを見つけようとしながら、プログラムを実行する過程である。」
    • 「良いテスト・ケースとは、まだ発見されていないエラーを検出する確率の高いものである。」
  • ホワイトボックスでの同値分割と境界値分析によって導かれるすべてのケースを網羅すること、ではないのがポイント。それによって外面的な振舞いに影響を与えるものが基本的な検証すべきケース。
@sunaot
sunaot / excalidraw-room.rb
Created March 11, 2021 14:48
excalidraw の部屋の URL をつくるときの支援スクリプト
require 'digest/sha1'
def room_id(name)
digest = Digest::SHA1.new
digest.update(name)
digest.hexdigest.slice(0,20)
end
def encryption_key(seed)
alphabets = ('a'..'z')