オープンデザイン

ソフトウェアエンジニアにとっては、

オープンソースの考え方が、その後他分野にどのような影響を与えているかが読み取れる本。
3Dプリンターの活動背景なども書いてある。

ユーザ参加型やユーザ主導型の共創も含まれる。
ものづくりのあり方がだいぶ変わってきているんだね。



オープンデザイン ―参加と共創から生まれる「つくりかたの未来」 (Make: Japan Books)

オープンデザイン ―参加と共創から生まれる「つくりかたの未来」 (Make: Japan Books)


追記:読んでるうちにだんだんわからなくなってきた。

カバレッジの危ない使われ方

良かれと思って頑張ってカバレッジ率を上げていたら、逆にテストを書かなくなってしまう事態に陥ることがあるようだ。

カバレッジ率のレポート結果の傾向から学習し、テストを書くまではいい。やった方が良い。

問題は次だ。不慣れだとテスト対象の期待する振る舞いを明らかにすること、良いコードや設計を導くためにテストを書くことよりも、ユニット&モックでカバレッジ率を機械的にあげていくことへ過度に熱を上げてしまうことがある。

するとどうなるか。内容が理解できない意図が不明確なテスト、ちょっとした変更でテストが多数失敗してしまうのが大量にできてしまう。後でメンテ不能なテストが大量にできてしまう。カバレッジをあげようとがんばったのに。

その後何が起きるか。新しく修正や追加しようとしたら、大量レッドでメンテできねー、読んでも理解できねー糞テストの壁がプログラマーの前に立ち現れる。本当ならAll Testは、セーフティネットであって欲しいのに、邪魔な壁として。
これダメなんじゃねと判断してテストの自動化をやめてしまい、逆戻り。あらら。。。

注意されたし。

追記:無駄にテスト書いたために、スローテストや、不要なメソッドを見つけるのがめんどうになるなども発生!!らしい。

「時間がない」問題の原因候補

コーチの仕事柄「時間がない」問題のチームに出くわすことがある。

途中は端折るが、原因を辿って行くと次が大きいんじゃなかろうか

見積りと計画づくりの不在
  • フィーチャー実装の やる・やらないの取捨選択の不在
  • 「ターゲット」「見積り」「コミットメント」の区別の不在( 過去の実績の仕事量を大きく上回る量をコミットする。)
「(開発の)規律の不在」の不在
  • レビューなし、テストなしの「できました」の嘘の進捗
  • 人やチーム間の仕事の引き渡しの際に、「お仕事に着手可能な条件」「お仕事の完了DONEの条件」の基準が曖昧。
  • 泥沼化したコードで難読化。修正範囲の拡大。 応急処置の修正によってさらなるバグ混入


他にも、自分が不要な会議への参加とか。

49 見積りとは何か(97きのこ本より)

プログラマが知るべき97のこと

プログラマが知るべき97のこと

とあるチームで読書会をおすすめしたら、49は印象に残ったらしい。<見積り:事実に基づく推量>と<ターゲット:ビジネス上の実現したい目標>と<コミットメント:何を何時までにの約束>を区別すること、それぞれのロールが協力して、3つをいい感じに近づけていくことこそ、見積りと計画づくりのキモの活動になる。


ふらっと、下鴨納涼古本まつりに行って、著者に惹かれて購入。存在と時間〈上〉 (ちくま学芸文庫)存在と時間〈下〉 (ちくま学芸文庫) を2,3 回読んでもさっぱりで攻めあぐねていたが、この本が幾つかヒントをくれた感がある。

「時間と存在」のその後が追える本。「ヒューマニズム」賛美の本ではない。
形而上学メタフィジカルヒューマニズム批判を展開し、ヒューマニズムを捉え直そうとしている。)


訳者の補足や丁寧である。ハイデッカーとジャン・ボーフレの2人についてや補足や解説を合わせると本文よりも長い。
(長いのだが、訳者の自を出すのではなく、解説に徹底しているためくどさが感じられず、むしろ理解の助けになっている。)

買ってよかった。

読書中: コネクト

コネクト ―企業と顧客が相互接続された未来の働き方

コネクト ―企業と顧客が相互接続された未来の働き方

読書中。テーマはマネジメントになるのかなぁ。なんて言えばいいかわからない。有機的であることと、ピープルを重視していること、 顧客からのフィードバック・ループや相互作用を重視していること、実験と学習を重視していること、ゴール達成を重視していることなどが特徴的。テクノロジーは全く出てこないが、XPに似た匂いを感じている。

素振りメモ

帰り際の同僚との会話が混じりながら、メッセージ指向でと考えいたら、なんか変なのになった。
自動販売機との相互作用を確認したいのって、自動販売機の中身の要素のコラボレーションいうより自動販売機を観察している何者かってこと???

class VendingMachine
  def initialize
    @cach_register = CashRegister.new
  end

  def observer(ob)
    @observer = ob
  end

  def set_cash_register(cach_register)
    @cach_register = cach_register
  end

  def insert_billcoin(bill_coin)
    back_cash = @cach_register.add_cash(bill_coin)
    if back_cash
      @observer.receive_refund_billcoins back_cash
    end
    @observer.know_total "#{@cach_register.total}"
  end

  def refund
    @observer.receive_refund_billcoins @cach_register.refund
    @observer.know_total "#{@cach_register.total}"
  end
end

class CashRegister
  def initialize
    @current_cashs = []
  end

  def add_cash(cash)
    if [10.yen, 50.yen, 100.yen, 500.yen, 1000.yen].include?(cash)
      @current_cashs << cash
      return nil
    else
      return cash
    end
  end

  def total
    @current_cashs.map(&:value).reduce(:+) || 0
  end

  def refund
    begin
      return @current_cashs
    ensure
      @current_cashs = []
    end
  end
end

class BillCoin < Struct.new(:value)
end

class Fixnum
  def yen
    BillCoin.new(self)
  end
end

describe VendingMachine do
  let(:__allow_p) {
    d = double('person')
    allow(d).to receive(:know_total)
    d
  }

  let(:person) {
    d = double('person')
    subject.observer(d)
    d
  }

  subject {
    target = VendingMachine.new
    target.observer(__allow_p)
    target
  }

  describe "お金の投入と払い戻しについて" do
    specify "お金の投入すると、合計金額がわかる" do
      [10.yen, 50.yen, 100.yen, 500.yen].each{ |coin| subject.insert_billcoin(coin) }

      expect(person).to receive(:know_total).with('1660円')

      subject.insert_billcoin(1000.yen)
    end

    specify 'お金を投入してから払い戻しでお金を受け取る。合計金額は0円' do
      coins = [10.yen, 50.yen]
      coins.each{ |coin| subject.insert_billcoin(coin) }

      expect(person).to receive(:receive_refund_billcoins).with(coins)
      expect(person).to receive(:know_total).with("0円")

      subject.refund
    end
  end

  describe '扱えないお金について' do
    let(:invalid_billcoins) { [1.yen,  5000.yen, 10000.yen] }

    specify '想定外の投入金額の場合は、加算せず釣り銭を返す。合計金額は0円のまま' do
      invalid_billcoins.each do |c|
        expect(person).to receive(:receive_refund_billcoins).with(c)
        expect(person).to receive(:know_total).with("0円")
      end

      invalid_billcoins.each{ |coin| subject.insert_billcoin(coin) }
    end
  end
end