成果物の評価を公開するということ


わからないということをわかるや、全く駄目な成果物と人格否定についてを読んだ。


人格否定されている感じになるのは、成果物じゃなくてそれを生み出すプロセスを否定されている(と受け取った or 受け取られるようなやりとりがあった)ときだと思う。


自分でもよく、部分的にダメなところがあっただけで、全体に対する評価もダメだと判断してしまうことがある。
つまり、部分を生み出す手順がダメなのだから、それに従って生み出されている他の部分もどうせダメだろうという思い込み。
これでは受け手から人格否定されてると思われても仕方ない。悪い例。


成果物の評価を公開ときは、純粋に成果物だけの評価になるようにしないと、いろんな人の心がざわざわしてしまうので気をつけよう。
注目を浴びたいだけならともかく、成果物をより良くしたいという思いがあるはずなのに、自分の考えを押し付けるだけではただの暴力だ。

ビヨンド ソフトウェアアーキテクチャを翻訳しました

はじめに


ビヨンド ソフトウェア アーキテクチャ (Object Oriented Selection Classics)

ビヨンド ソフトウェア アーキテクチャ (Object Oriented Selection Classics)


共著者の id:ditigalsoul。言葉使いや翻訳の技術や作法について学ばせていただきました。また一緒に何かやりましょう。


陳列状況


池袋ジュンク堂で先行販売(!)とかやってて見てきました。ちゃんと陳列されてて素敵。


原著について


内容
ターキテクト(テクノロジーを担当するアーキテクト)とマーケテクト(マーケティングを担当するアーキテクト)が協力して課題を取りこぼすことがないように進めていきましょう、どちらが欠けても成功することはできませんよ、というものでした。
ブランディングや販売管理(のためのSKU)、インストールプロセスなどが、どれだけアーキテクチャに影響するものなのか、改めて考えさせられました。

著者
当時はコンサルティングや講師業をしていたようですが、今はチーム内のコラボレーションを高めるためのサービスやツールを提供する会社(Contentneo)を運営している模様。
Slideshareにもいろいろとプレゼン資料が公開されています。
本書の付録Bで紹介しているプロダクトマネジメントパターンを発展させているようです。

ツール

翻訳をするのに欠かせなかったツールです。
今回もありがとうございました。

統計データ

2014/05/30くらいに開始して、2015/09/30で完了しました。
仕事の都合でしばらく中断させてもらっていた時期がありますが、1年半か…

総コミット数は1832で、私のコミット数は1025でした。

規模はこんな感じです。Re:VIEW のツールで数えることができます。
約1MB、12347行、結構な量になりました。

$ review-vol  | tail -n 2
=============================
    1064KB 395381C 12347L 1064P
感想

翻訳をやるだけの英語力があるのかどうか不安に思っていた時期もありました。
ですが、訳す、読む、直すのサイクルを何度も回して行く中で、そんなことを気にしているのはもったいないと思うようになりました。
他にも、英文を読む量を増やしたり、実際に訳してみたり、とにかく反復し続けていたらなんとかなった感じです。

特に身についたと思えるのが、知らない言い回しが出てきた時の対応です。
そのまま訳するとすごくおかしな日本語になってしまいます。
訳す前にまずその言葉自体を調べて、そこから日本語としてどういう形式になるといいのか考えられるようになりました。

翻訳したからといって、本の内容の全てを自分のものにできるはずはありません。
自分には不足している領域の内容を扱っているのだからなおさらです。
今後とも精進していきたいと思います。

謝罪

id:digitalsoul とは同じ職場、同じチームとして過ごしてきました。
彼と一緒に過ごした時間がこの1年半の大部分を占めているのではないか…

仕事の考え方の違いにより、言い争いになりかけたこともありました。
挑発めいた言葉を言ってしまったこともありました。
口頭では自然解決した風を装っていますが、実はちゃんと謝ってません。今度会ったときに誤ります。

レガシーコード改善勉強会でした。 #wewlc_jp

レガシーコード改善勉強会

運営について

アークヒルズサウスタワーにある、Yahoo さんの会議室でした。

  • 広い!
    • だいたい100人くらいが座って余裕がある
    • 無線LANを使わせていただけた
    • スクリーンは6つのディスプレイで1面、それを左右に配置。観やすかった
  • タリーズのホットコーヒーが無料だった
  • 大手出版社からの参加者プレゼント!
    • 全部で20冊くらいあったような
  • 質問の時間や発表中の割り込みは無かった
    • 自分語りや糞コード自慢に興味は無いのですが、実践するにあたってのユースケースとかは興味があったのですけど、その辺の情報は得られず(ヽ´ω`)

オープニング

発起人?の方から、オープニングとして次のような話をうかがいました。

  • この集まりの目的は何?
    • 改善について議論できる下地を作ること
  • 今後どうしたいか
    • ITの力の最大化
    • レガシーコードを改善しなくてよくなる
    • レガシーコードの改善が当たり前に
    • 今回はウルシステムズさんと一緒にやらせていただいた、もっといろいろ広げたい
    • それ以上は分からない

アンケート用紙が配られていて、その集計結果次第で第二回、第三回があるかもしれない、とのこと。

セッション1

演者の稲葉さんが都合が悪くなってしまったとのことで、代役で訳者である平澤さんが書籍の内容をざっくりと説明するセッションになりました。
平澤さんはドメイン特化言語リファクタリングも訳されてる…大物感。

一番記憶に残ったのは、レガシーコード改善ガイドがすでに七刷にもなっていて、一定したペースで売れ続けているということでした。
息が長いっていいことですねぇ…

書籍の内容ですが、書かれているのはビルドできるコードのことが多い。
なので、よくわからない設定ファイルや、ビルドできないコードについても、同じような(場合によってはもっとヒドい)戦いの記録がありそうだなぁと思いました。

セッション2

kyon_mm による方法論の話。

何のために、どういうことをやればいいのか、積み上げていく感じで分かりやすいものでした。

  • 変更するなら、そのものを知らなければならない
  • 知るためには、役割、目的に応じて適切なツール(ものであったり技法であったり)を使うべき
  • ツールの使い方なんてもはや教養なので学べ

1 bleis 月とか 1 kyon_mm 月とかの人に特化した規模感がなんとなく危ういなぁとか思ったので、懇親会で会話してみたのですけど、
いまいち伝えられなかったのが残念でした。

kyon_mm 曰く「PO と QA を兼任してるけど、やっぱりコードが書けてテストもできる人がやるべきだよ!」(意訳)って言ってて、
それ巷で話題のフルスタックエンジニアですよねー、とツッコんでおきました…

セッション3

goyoki による心構えや振る舞いについての話。
以前見かけたときより健康そうな雰囲気でした。

大枠として次のような分類で課題と目標、実際のアプローチを説明していました。

  • 環境
  • アプローチ

保守性の話で、リスク分析して優先度を付けて要件にして、そのトレーサビリティを保つようにしていく、という話を聞いていて、
「で、誰が何をどうするから、誰がどう嬉しいんだろう」というのが分からず隙間時間(という名の休憩時間)に聞いてみましたけど、やっぱりよく分かりませんでした。

今度機会があったら聞いてみよう。

セッション4

ソニックガーデンの西見さんでした。

今回も Point of Sales と Point of Use のグラフが紹介されていたんですが、個人的に何か腑に落ちていなかったんですけどその理由が分かりました。
それぞれで、縦軸の縮尺が違うはずなんですよ。
納品時点での利益?が最大、という場合、利用者が要求したものが10入っているとする。
一方、使い始めたときから利益?が最大、という場合は、最初の時点では要求したものが1か2しか無いはず。
なのに、それらを同じ縮尺であるかのように見せている…これがグラフの魔術!!

今回も、組織的に技術基盤を揃えて、その効率を高める戦略は素敵だなぁと思いました。

セッション5

Jenkins Boot Camp の中の人でもある、NTT Data の佐藤さんでした。

継続的インテグレーションの話でした。

セッション6

Yahoo トップページ部隊としての佐藤さんでした。
組織内でコード改善をする機運を高めて、実際にやってきたという話。

namespace で関数名を隠蔽してスタブ関数を実行する、というトリッキーなテクニックとかを紹介されてました。

懇親会で、テストコードのサンプルを作りこんで「さあお前ら手を動かせ」的なアプローチを取らざるを得なかった、などの裏話をお聞きして、
見かけによらずパワーのある人だなぁと思いました。

セッション7

誤タイプを招く ID 体系を導入されている t_wada さん。
こちらも一番最近の記憶に比べて健康さが増しているように感じたのですが、実際はそうでもなかったっぽい。お大事に…

お話をまとめるとこんな感じでした。

  • 状況を具体的にして
  • 一番やばいところから
  • できることを一つずつ
  • 確実にやっていけ
  • 高望みするな

早速やろうと思って、話を聞きながらどうにかこうにか自動ビルドを復活させたりしてました。

エッセンシャルスクラムが出版されました。よかった。


初めてのなんとかです。




会社帰りに最寄りの書店で陳列されていることを確認しました。
発売日は7月7日だと思ってたんですが、書店によってぶれる模様。流通とか関係あるのかもしれない。



これがなんなのか、ということをここから書いていきます。

エッセンシャルスクラム

  • 紹介
    • スクラムガイドよりも長いスクラムの解説書
    • 私自身はスクラムと関係無く生活してるけど、そういう個人の趣味嗜好は窓から投げ捨てて読めば、いいことがたくさん書いてある
    • 筋が通ってるので、何かあるたびに「It depends」とありがたい助言をいただくよりもずっと納得感がある
私の関わり方
  • きっかけ
    • 隣から「タスケテ」って聞こえてきたのでのこのこ首をつっこんでみました
    • ところがそうそうたるメンバーですごい冷や汗
  • やったこと
    • 序盤のあの章とあの章を翻訳したり
    • 全体をレビューしたり
    • レビューアの方の指摘を取り込んだり
ありがとうございました


TDD の人としてテストに導かれた設計をする前に、id:digitalsoul に導かれて別のジョブ(翻訳者)の熟練度が上がってしまいました。
id:akon に見本出来をお見せしたら「この人(著者)と一緒に仕事したことあるよ」とかまるで親戚のことみたいに出てきたのは面白かった。
5年10年前には想像もつかない生活をしていて、自分が怖い。
なんで自分と同じたくさんの読み手の人たちと仲良くなるのを通り越して、書き手の人とのつながりが強くなってるんだろう。




今まで何度か翻訳のレビューをさせていただいた際、私は楽しかったのですが、書いた側としてはどうなんだろうな、と少し心残りがありました。
ですが、今回レビュー指摘をいただく側になってみて、「こっちも楽しい」と思えたのは発見でした。
なんというか、隙がなくなるというか、研ぎ澄まされていく感がよい。
もっとやりましょう。




あと、ソフトウェア開発をする人の役に立ちそうな本、自分でも買いそうな本を、まだ見ぬ誰かにお届けする手伝いができたのではないかと思います。
先代に受けた恩を次代に返すことができる機会はそうないので、自画自賛ではありますが、自分にとっては高評価な出来事です。




今回のお話(翻訳やろうZE!)の中で私が果たせた役割といったら、id:digitalsoul の懐刀どころか、せいぜいかばんに入ってる折りたたみナイフくらいのものだろうと思います(注:入ってません)。
悔しいので、今後もめげずに積み重ねていこうと思います。

[misc] 越えられない壁

スポートニュース眺めてて気がついた。
私はスポーツのプロ選手を見て「この動きは無理だろう…」と感じる。

これってプログラムの出来ない人がプログラマーのやってることを見て感じてることなんじゃないかしらん。
どんなところにも階層構造はできるんだなぁ、という納得感を得た。
(とはいえ実際はそんなに敷居は高くない、と思ってる。)


[cucumber] cucumber 1.3.14 が動かないなぁ…


https://github.com/yujiorama/atdd_airport_parking_lot

ナンデ?
rubypython ナンデ?

$ cat Gemfile
source "https://rubygems.org"

gem "cucumber"
gem "rspec"
gem "selenium-client"

# missing...
gem "ramaze"
gem "rack-test"
gem "webrat"
gem "rubypython"

$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]

$ bundle exec cucumber -r . -r etc -r step_definitions valet.feature
undefined method `find_hidden_method' for BasicObject:Class (NoMethodError)
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/builder-3.2.2/lib/blankslate.rb:61:in `find_hidden_method'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/builder-3.2.2/lib/blankslate.rb:61:in `find_hidden_method'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/builder-3.2.2/lib/blankslate.rb:61:in `find_hidden_method'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/builder-3.2.2/lib/blankslate.rb:67:in `reveal'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/rubypython-0.6.3/lib/rubypython/rubypyproxy.rb:103:in `<class:RubyPyProxy>'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/rubypython-0.6.3/lib/rubypython/rubypyproxy.rb:62:in `<module:RubyPython>'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/rubypython-0.6.3/lib/rubypython/rubypyproxy.rb:7:in `<top (required)>'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/rubypython-0.6.3/lib/rubypython.rb:26:in `require'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/rubypython-0.6.3/lib/rubypython.rb:26:in `<top (required)>'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/examples/ruby2python/features/support/env.rb:1:in `require'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/examples/ruby2python/features/support/env.rb:1:in `<top (required)>'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/rb_support/rb_language.rb:95:in `load'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/rb_support/rb_language.rb:95:in `load_code_file'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/runtime/support_code.rb:180:in `load_file'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/runtime/support_code.rb:83:in `block in load_files!'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/runtime/support_code.rb:82:in `each'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/runtime/support_code.rb:82:in `load_files!'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/runtime.rb:184:in `load_step_definitions'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/runtime.rb:42:in `run!'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/lib/cucumber/cli/main.rb:47:in `execute!'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/gems/cucumber-1.3.14/bin/cucumber:13:in `<top (required)>'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/bin/cucumber:23:in `load'
/tmp/atdd_airport_parking_lot/vendor/bundle/ruby/2.1.0/bin/cucumber:23:in `<main>'
FAIL: 1

DDD再読

今年で定年になってしまうので初心に立ち返って勉強し直すことにした。
まずはDDDを読み直します。

この辺にメモを書いてこうとしてます。
yujiorama / DomainDrivenDevelopment / wiki / Home — Bitbucket

毎週土曜日午後から、会社で自習していくつもり(3月22日現在)。

JJUGイベント 「祝☆Java 8 Launch」の感想

【東京】JJUGイベント 「祝☆Java 8 Launch」3/21(金/春分の日) - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper

@khasunuma さんによる「Brand new Date and Time API」のセッションが印象的でした。
APIの説明をするにはISO8601について説明する必要があり、そのためには日時の定義を説明する必要があり、そのためには日付の、そのためには時間の、そのためには秒の定義が必要で、、、

という感じでした。
それぞれの定義の説明が楽しい!
知っているもの(秒は原子時計で定義されてるとか)もあれば、まったく知らなかったもの(GMTからUTCに至るまでの経緯とか)もあったり。
肝心のAPIについてはサンプルコードをGithubで公開していただけてるので今度見る。
https://github.com/btnrouge/threetensamples

懇親会で @yusuke さんが「Chronon 超便利」とおっしゃっていたので、真に受けてIDEA13 を買ってしまいそうな気持ちです。
IntelliJ IDEA Ultimate 2018.2 – 株式会社サムライズム