プロダクトのための技術力をどう上げるか: ⓪なぜ技術力は必要とされるのか

イントロ

自分は「どうやったら技術力を上げられるかな」という点に興味があり、また最近では「組織から継続的に"成長"を与え続けられるのだろうか」という点に興味がある。
まずは自分の中の認識や仮説みたいなものを形式知としてみようと、取り留めなく散文を吐き出していたのだが、その中で幾つか重要なエッセンスがある事に気付いた。

「取り留めなく」と書いたが、実際に気づいた事や感じた事を1つの文書に纏めようとすると、実際かなり散らかってしまっている(し読むのも書くのも疲れる)。なので、ポイントを絞りながらそれぞれを複数の文書に分け、現在の観点・思考を表して見ようと思った。
この記事がその第1段である。

あくまで「自身の内にあるこんがらがった思考を解きほぐしておきたい」というのが大きな狙いであり、セルフ壁打ちのような効果を期待して取り組むもの。

記事の作成のためのメモ

  • ビジネス対する要求は複雑化し続ける
  • ゆえにソフトウェアも必然的に複雑化し続ける
  • 要求に応えるためには「リスク」が避けられない
    • このリスクをミニマムにしていく事が重要
  • 何がリスクを増大化させるか
    • 本質的な命題の難しさ。「答えのない問い」であること
    • 打手の少なさ。
  • 何がリスクを最小化させるか
    • 仮説を築き、世に問うまでを短くする
  • 技術力の価値 = アジリティを高く保つ武器といえる

本論

まずは「そもそも技術力とは何のために求められるのか」という所を考えてみたい。

勤めている会社などにおいて、「組織の技術力を高める」という命題が標榜されたとする。以下の疑問が湧く。

  • 「技術力」という言葉を安易に使いすぎなのでは、という嫌いがある
    • 自分もそうだし、恐らく他人もそう
  • そもそも「技術力」というのが何であろうか?っていうのが曖昧なままで過ごされている気がするし、あるいは「目的」なき「手段」として存在が許されていないか?とすら思う

この中核にある「技術力」という概念、これに対する「なぜなのか」「なにであるのか」を真正面から捉えることなしに、「それを高める」という夢は叶えられないのではないか。つまり空中分解しかねない。
今回のテーマは、そうした問題意識を下地として思考を試みたものだ。

以下、先に社内向けに書いた文章が先に公開するに至ったので、そちらをベースに転記。
(・・・なかなか主語がでかい話であり不安はあるけど。。)

「目的」から考える技術力

技術力が開発に何をもたらすのか?おおよそ、これらの3つの価値を提供するものと考えている。

  1. スピード
  2. 品質
  3. 妥当性

この3つを兼ね備えると「アジリティ」っていう価値がもたらされ始めるはず。何故アジリティとやらが必要なのか?どう良いのか?は、noteのマガジンで秀逸なのものがある。是非読んでみてください。

note.com

これらのパラメーターが強化されることから、「技術力が高まることは勝ちにつながる」ものといえる。

スピード

開発するスピードが「良さ」なのは特に説明いらないと思う。ソフトウェアやシステムを進化させるのが我々の仕事なのだから、同じ仕事が10時間を必要とするよりも2時間で終わった方が良い。

品質

品質は、例えば「バグを生まない」とか「拡張性が高い」とか「読みやすい」とか。ざっくりいうと「良いコード」というのは「品質」って言葉に代替可能だと思う。もっと言うと、結構「品質の高いコードとはどんなものか?」に対しての回答は人それぞれかもしれない。1つの示唆として、品質という話であればマーティンファウラーの記事に気付きが多い。

martinfowler.com

「どう良いのか」は語れる。が、「何であるか」は難しいかも知れない。むしろ、「良いコードとは」という問いに対する答えを、個々人が持っていると良いと思う。(自分の場合、長らく「リファクタビリティ」が良いコードを言い表すものだと思ってたけど、最近はもう少し広い意味で「書き換えやすさ」かなーって感じ)

妥当性

(コレが1番分かりにくいかな?)
例えば「RDBにするか検索エンジンを使うか」みたいな選択はあるし、ECSかGKEかみたいな選択もある。そこを失敗すると、サービスのスケーラビリティの問題だったり(非)機能要件への適合が難しくなったり。ソフトウェアで言っても、例えばよりミクロな話、外部ライブラリを使うか自前で薄いコンポーネントを使うかみたいな選択とか。オーバーエンジニアリンクになるか、腐敗臭のするデザインになるか?という所にも繋がる。

そしてアジリティ

この3つが満たされれば持続的な成長を維持し続けられるようになるでしょ、それを保証するのが「技術力」だよ、と。
アジリティとは「機敏さ」という意味で、これがあると「柔軟さ」が獲得される。
この「柔軟さ」がビジネスの価値を高める、成功の確度を上げるための強力な武器になる。

anti複雑さ

なぜ「ビジネスの進化には柔軟さが必要」か?

そもそもの大前提として、「ビジネス」は複雑であり、ビジネスを微分したものである「ソフトウェア」や「ソフトウェア開発」も複雑なものである。
何がマーケットに受け入れられるか?自社、競合を取り巻く環境は?顧客や潜在的なターゲット層の「気分」は?
それらは正確に「計測」することも難しければ、正解を教え導いてくれる師範もおらず、更に悪いことに「次の瞬間には状況が変わっている」ということが常である・・・という、複雑さ。

そんな複雑な問題に、どう対処していくか? 1つのアプローチが「実際のマーケットに、1回でも多く問い、フィードバックを回収し、また次の一手を打つ」というもの。

アジリティを得ることで、「素早く・小さく失敗し、地に足のついたフィードバックを元にして、要改善点を克服し、また素早く世に問う」というループを回せるようになる。
「1発の大振りで成功するかわからないから、100回打席に立ち、その度にフォームをチェックし、修正し、珠に当てにいく」というもの。その逆に、「大振りをするための準備が整うまで、打席に立たないでいる」となれば、フィードバックを得ながら改善をするための(あったはずの!!)機会が損なわれいてく。必然的に、失敗へのリスクが高まる。

アジリティと、スピード・品質・妥当性

とにかく「打席に立つ回数」が必要、ということで「スピードが重要になる」。
スピードが遅いと、打席に立てる回数が減り、「失敗した時に取り返しがつかない」という硬直性も高まる。また、少ない打数で上手くやるには、非常に綿密で高度で正確な「予測」が必要になる。・・・市場はあんなにも気まぐれな生き物だというのに!

品質はどうだろうか?
これは、先に上げたファウラーの記事に詳しい。「内部品質の低下は、速さの逓減をもたらす」というもの。付け加えるのであれば、外部品質だって、低下すれば顧客の離反を招く・・・すなわち「得られるフィードバックの量が減る」という結果をもたらすはず。

最後に妥当性。
「適切な選択」というのは、そもそものスピード(初速)に大きな影響をもたらす。あるいは、「初期の誤った選択」は、後に取り返しのつかない致命的な「負債」となるかもしれない。これも、やはり硬直性を生じさせる。

結局、スピード・品質・妥当性はそれぞれ不可分であり、また高いアジリティを実現し維持し続けるためには、これらを突き詰め続ける必要があるのだ。

「複雑さ」に対する補足

「ソフトウェア開発は本質的に複雑さを伴うものである」という点について。
「変更しやすい」ことを以て「ソフト」な資産、と称される。裏を返せば、「変更されること」が存在価値として織り込まれている、とでも言うべきか。そうやって、次々に「進化していく」ことが宿命付けられている。

「なぜソフトウェアは進化する(させられ続ける)のか」という論点について、論文があるという。

いわく、「使われ続けると、利用者(やその代理人たるプロダクトオーナー)からの要求が生じ、それに応えることで進化を求められる」「ゆえにソフトウェアは進化し続ける(複雑さを増し続ける」ように考えられる。

ソフトウェア開発はとても複雑なものである。

アジリティを備えたプロダクト組織になる

何のために会社がありビジネスをやっているのか?といえば、経済的な価値を生み出すためだと思う。それは、顧客価値を中心に生み出される付加価値の総和である。
顧客価値は創るのが難しい。そのために、複雑な問題に挑む必要がある。
複雑な問題に立ち向かうための武器がアジリティ。
そして、(働く上での)技術力の目的・・「何のための力なのか?」という問いに対して、今の所の自分の見方が「プロダクト開発のアジリティを高めるため」である。

それって、我々に何かメリットありますか?

ここまでずっと「ビジネス」「組織」を主語において話をしてきたので、「なぜ良いのか」がピンと来にくい。
なんだか「正論」という感じで、それが「開発者1人1人にとって関係のあることなのか」については、説得力を持っていないような。

「高いアジリティを持つ組織」で働く、というのは開発者にとってどんな体験だろうか?
結論から言えば、恐らく「そこで働いていてワクワクしながら開発に携われるようになる」というものだと思う。

開発に対するモチベーションというのは人によってそれぞれだというのを前提としつつ、広く共通するのは「何かを良くしたい」という想いではないか。
例えば「ユーザーを喜ばせたい」とか「自分の納得が行くような綺麗なコードを書きたい」とか「より高いパフォーマンスを実現したい」とか。
そうした際に、組織がアジリティをもって開発できていたらどうなるか?恐らく、これらの前向きな気持ちを持った人たちには嬉しいと開発体験につながると思う。

「ユーザーを喜ばせたい」人たちにとっては、「開発コスト(時間、リスク)が高いから難しい」という理由で、望ましい機能の実装提案を却下される場面が減り、「良いと思えるものを作って、リリースする」ことに集中できている状態。或いは「新機能をデリバリーする」ことへの組織が持つコストが低く抑えられることで、リリースした後にユーザーの反応を観察し、取り入れながら更に良い機能を開発していく!というのに集中できる。
これらはスピードが低ければ難しいし、品質が低いようだと「保守に当てるリソース」によってエンハンスメントやアイディア出しのための力が逼迫されることになる。

「良いコードを書きたい」という人たちにとっては、実践的なツールやサービスの導入も、しっかりリスクをコントロールした上で試してみることも出来る。
開発者というのは、『ソースコートを通じて活動する」のだから、ある側面では「自分たちのプロダクトのユーザー」でもある。自分たち自身を「ユーザー」として、開発体験についてのフィードバックとそれを踏まえた改善のサイクルをクルクルと回しながら「より良い開発」を獲得できる事が重要。
プロダクトと一緒に開発チーム自体が進化のペースを保ちやすい状態だ。「高い生産性を生む」という価値実現に向けて、不確実性を制御しながらの前進がもたらされる。

そして深く広い見識と自信から来る「妥当性」は、品質・スピードを安定的に支えるために欠かせない。もし妥当性に関する意識が低いようであれば、「なんでもやってみる」の後の棚卸しが実現せず、負債が貯まり続け硬直性の増加を招く。

「どんな願望もアジリティによって叶えられる」・・・などと言えば眉唾物になるが、しかしながら、実際問題として「前を向き本質的な”コト”に意識を向ける」ための基礎力として「アジリティ」というのは非常に重大な価値を持つ。その獲得のために、やはり技術力というのは重要な下地となる。

—✁—切り取り線—✁—
なんか偉そうな文体で書き始めてしまったばかりに!!
あまり気持ちが籠もらないのですが!!

「技術力つけるときっと楽しい事をたくさんやりやすくなるぜ〜〜!!」って思っています!!!!という事!!!

あ〜〜〜〜楽しいことやりたくない!?!?
楽しいことって、どうやったら出来るんだろうね!!

??? 「 アジリティです、アジリティについて考えてみるのです・・・

って感じ
—✁—切り取り線—✁—

結び

結局の所、組織人としての観点から考えれば、働く上での「何が目的か」というのを平たく言えば「ビジネスを成功させるため」となる。
しかし、ビジネスやプロダクト開発は複雑で大変に難しい。成功の確度を上げる必要がある。その為には「いかに柔軟に動けるか」、「高速にフィードバックループを回せるか、すなわち『問う・観察する・学ぶ・活かす』のステップを繰り返せるか」に拘る必要がる。それがアジリティという言葉で表せる。
そのアジリティを実現する事こそが、開発組織にとっての『技術力の価値」ではないか?と、自分は考えている。
ざっくりと「技術力」というと余りにも大味な表現になるが、「スピード」「品質」「妥当性」という、それぞれが相互に密接に関わりつつも個々が重要な意味を持つエッセンスに着目し、拘り、磨きたい所。

「ビジネスを上手くやる」のに集中できている状況において、人は「コト」へ集中し、本質的な価値創造に取り組めるようになる。
すると、それが「ワクワク出来る開発業務」へと至るはずだ。

その辺りを追求することで、「ビジネス的な価値」「自身の欲求に対する回答」の折り合いがつく場所に到達できるのではないか?と考えている。

「\Throwableをcatchしないで」と伝えていく

「Throwbaleをcathcしない方が良いよ、って前に言われたことあるけどアレってソースある?」と言われまして。

f:id:o0h:20201128140525p:plain f:id:o0h:20201128175047p:plain

画像はイメージです

自分としては、どちらかというと「考えていったら自然とそう思えたので」という生き方をしており、確かにソースか〜探したことなかったなぁ。。。となり。即答できず。
「理屈はわかる」のと「毎度説明するのが面倒」は別物ですよね。
(寧ろ、折角PHPの本を書いたのだからそこで言及しても良かったかもな〜)

f:id:o0h:20201128140847p:plain

「話すの面倒くさいと説明のクオリティが毎回変わる」ので、あまり気持ちよくありません。
かといって、「毎回ちゃんと説明する」のは非常に骨も折れるので、それもやっぱり気持ちよくありません。

ということで、「Throwableってなに?Exceptionと何が違うの?調べてみました!」です。

  • tl;dr
  • いんとろ
  • 前提: ポケモンキャッチ
  • 改めて \Error とは
    • なぜ Error(throwable) が必要だったのか?
    • 捕捉・復帰ができない
    • エラーハンドラとの兼ね合い
    • finally, __destructとの兼ね合い
    • RECOVERABLEであってもRECOVERするには扱いづらい
  • Error が何か?を理解すると、catchしたくなくなる(はず)
  • まとめ

・・・書いていたら思いの外長くなったので、tl;drをつけます😌

tl;dr

これらの文献のうち、特に顕著な表現としてtrowski氏とThrowbaleのRFCの表現がわかりやすいです。これが「何かソースありますか?」に対する回答、ということで良いのではないか?

Error should be used to represent coding issues that require the attention of a programmer. Error objects thrown from the PHP engine fall into this category, as they generally result from coding errors such as providing a parameter of the wrong type to a function or a parse error in a file. Exception should be used for conditions that can be safely handled at runtime where another action can be taken and execution can continue.
Since Error objects should not be handled at runtime, catching Error objects should be uncommon. In general, Error objects should only be caught for logging, performing any necessary cleanup, and display an error message to the user.

https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7

また、ThrowableのRFCでも「キャッチすべきではない」と端的に説明されとります

catch (Error $e) and catch (Throwable $e) may be used to catch respectively Error objects or any Throwable (current or future) object. Users should generally be discouraged from catching Error objects except for logging or cleanup purposes as Error objects represent coding problems that should be fixed rather than runtime conditions that may be handled.

PHP: rfc:throwable-interface

この辺りが、「ちょっと調べてみよ&ブログに残しておこ」と思ったきっかけに対する答えとなっております!

以下本編。

続きを読む

プロダクトマネジメント ――ビルドトラップを避け顧客に価値を届けるを読んだ

プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける

プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける

  • 作者:Melissa Perri
  • 発売日: 2020/10/26
  • メディア: 単行本(ソフトカバー)

Amazonでも予約注文のタイミング?によっては発売日にちゃんと届く」という事を知った、というのが本書に関する収穫の1つとなりました。
お急ぎ便使えることもあるのか・・ f:id:o0h:20201028134310p:plain

ということで、一昨日にかけてババーっと読んで、読了しました。
いや〜読みやすかった面白かった。すごい希望に溢れてて「なるほど、こうありたいな!」とワクワクしながら読み終わった。

どんな本?

  • プロダクトマネジメントとは」「プロダクトマネージャーの仕事とは」という切り口で、顧客に価値を届けるためのマインドセット、組織の姿、戦略フレームワークについて書かれた本
  • リリース数などのアウトプットに着目することで陥る「ビルドトラップ」の症例と、そこから脱却するには?というのが主題
  • 必要なのは、アウトプットではなく顧客に届ける価値 = アウトカムに注目した、プロダクト主導の組織に代わることだと解く
    • 「作ること」が目的になっていないか?「何を解決するか・どんな価値を提供できているか」に集中できているか?
  • 架空の企業の物語をとりあげながら、著者自身の経験してきたエピソードやNetflixAmazonといった「プロダクト主導」「顧客中心」で成功している企業の話も織り交ぜながら解説していく
  • 全体的に平易な表現で文章も読みやすかったです。ボリュームも少なめ(224ページ)

ざっくり感想

  • いまいち「プロダクトマネージャー」ってどんな仕事なの?どういう姿であるべき?というのが分かってなかったのですが、知れてよかったです
    • 「何故作るのか」「どんなアウトカムを提供するのか」というのをチームにリマインドし導く仕事
    • 「「何を作るのか」「どう作るのか」については、PdMではなくチームが考えるもの
      • 「何を作るのか」にばかり集中して、「自分のアイディアを他人に押し付ける」のは良いPdMではない(アンチパターン: ビジョナリー、ミニCEO)
      • ユーザーにとっての価値、ビジネスにとっての価値を上手く抽出・定義・実現するための方向づけを行う役割
    • 「プロジェクトマネージャーは「いつ」に責任を持つ」「プロダクトマネージャーは「なぜ」に責任を持つ」みたいな話、なるほど〜
  • 言うは易し行うは難し系だな〜と思いますが、いわゆる「全員をハッピーにする方法論」ではあったので、ここに近づくために少しでも出来ることはあるかな?みたいな気持ちを持っておくのは良さそう
  • 「成功指標」を明確にする。そのうえで、「実験」を素早く繰り返して進んでいく
    • =時間的、金銭的コストが最小限な時点でフィードバックを得られるようにする
    • "重要なのは、自分たちのアイデアだけが良いアイデアなわけではないことを理解することです。"
    • "根本も原因を見つける前に問題を解決しようとする落とし穴にはまるのは簡単です。私達は問題が何なのかがわからなくても、問題を解決しようとしがちです"
  • 企業の「ビジョン」から始まり、どのレイヤーにも「なぜ」をつなげていくべきだ〜という視点が面白かった!
    • レイヤー=ビジョン > 戦略的意図 > プロダクトイニシアティブ > オプション
      • ビジョン = 企業がどこに向かっていくのかを説明するもの
      • 戦略的意図 = "現在の状況を踏まえて、ビジョンを実現するために自分たちが出来るいちばん重要なことは何か?"
      • プロダクトイニシアティブ = プロダクトの観点で課題に取り組みにはどんな問題を扱えばよいかを説明するもの
      • オプション = プロダクトイニシアティブの実現のための手段
  • アジャイル開発が嫌いなん・・?ってくらいの雰囲気を感じましたが、批判というより「アジャイル”開発手法”で足りていない部分(そもそもスコープ外の部分)がある」というのを忘れて盲目的になってんじゃねーぞ!みたいな意思なんだと思います
  • 一方で、「学習から学ぶ」「小さく素早く失敗してリスクを最小化する」みたいなところは、アジャイルと同じ方向を見ている気はする(↓に書いたClean Agileの一節とか)

アジャイルは速く進むことだと思っている人もいる。だが、そうではない。これまでそうだったこともない。アジャイルとは、どれだけうまくいっていないかをできるだけ早く知ることだ。できるだけ早く知りたいのは、そうすれば状況をマネジメントできるからだ。

Clean Agile 43

ライト、ついてますか―問題発見の人間学を読んだ

大変に面白かった。個人的には、色々な啓蒙に富んでいるし今日からぜひ使っていきたい!と思える視点に満ちているという点で、「アイディアの作り方」に通ずるものを感じる。

自分は以前から「思考の枠を外す」と呼んで大事にしている視点がある。意識的に、色々な「もしooだったら」を、極端なくらいに脳内で入れ替えた上で今目の前にある問題を眺めてみる〜というものだ。
この本は、まさに「枠」を俯瞰して眺めてみようという取り組みが大量だった。

全体的には(本当であれば)難しいことを語っているように思う。しかし非常にユーモアの聞いた語り口と、思わず笑ってしまうようなスパイスの効いた(時に効きすぎた)イラストによって、この本の存在を「芯の強い”教授”」から「分け隔てない友達」のようにしていると感じる。
高度な問題をバシバシとやっつけていくような本も良いものだけど、こうやって気軽に頭を使ってみたくなるようなものも良いもの。

読書メモ

以下、実際に読みながら作っていたメモから。
琴線に触れた部分なんかの感想が中心。

(ただ、寝る前にベッドの中で読み進めた部分についてはメモがなかったりする😇)

第1部

P27
ユーモアのセンスのない人のために問題を解こうとするな。

個人的にも「ユーモアって大事よね」というのは常日頃思っていて、ブレスト何かをした時には「ギリギリふざけてないか少しふざけている」ような案を序盤で出せるように、という意識をしてさえいる。それがあってこの一文はグッと来た。

「ふざけたことを言っている」として発言を遠ざけたり蓋をしないで、「そんな馬鹿な!」というくだらない話も一旦受け止めて乗っかってみて、それが柔軟で豊かな視点の獲得につながる〜みたいな話かな。ブレストを「大喜利」のような感覚でやってみる、というのもそれに繋がる話かもしれない。
この文言自体が「おいおい本気で言ってるのか?」みたいなある種のナンセンスさを感じるような部分もあり(ユーモアを持ち合わせているかどうかで手助けしない相手を選ぶの?)、見事な再帰構造だなーって思う。

第3部

P60
たいていの不適合は、認識さえすれば容易に解ける。(中略)たいていはその不適合と付き合わなければならないものの方から処理できるものだ。人間というものは実に適応力に飛んだものだから、ほとんどどんな種類の不適合にも身を合わせてしまう。ただしそれは、当人たちが実はそうでなくてもいいのだ、ということに気づくまでのことである。そのとき、トラブルが起こる。

「トラブルが起こる」なんてネガティブな表現をしてるからビクッとしたけど、これは「問題が問題と認識されて、問題となる」って話だよな。
これはとても「そうだよな」と思うし大事にしたい部分。「思考の枠を外す」なんて言葉が個人的に好きなのだけど、まさに「いま目の前にある当たり前を、当たり前じゃないかも知れないという視点で眺められるか」というのは大きなヒントになるように思う。それが「実はそうでなくても良いのだ、ということに気づくまでのことである」という言葉で描かれている。

P62
どんな新しい「解決策」も、問題の定義が間違っていた時にそれと気づくのは、もとの設計者よりは利用者の方である。だがひとたびはじめに感じた親しみのなさが薄れると、人の適応性ゆえに不適合は目に見えなくなる。このことから、次の規則がどんなに重要かは、分かるわけだ。

結論に飛びつくな、 だが第一印象を無視するな

この後に続く「視点の新鮮さ」と合わせて、重要な示唆だなーと感じる。「なにか変だよね」「どうも使いにくいな」というのは、教育されていくと薄れるものだから、それに対しては「素人」の持つ新鮮な目線がいるよねーという風に思った。

ちょっと思ったのが、例えば「精神的にエネルギーが減っている時に、部屋が散らかっていてもそのまま過ごしてしまう」みたいなやつ。これは「部屋を片付ける気力がない」というのが問題なのだけど、もしかしたら「現状に適合する(抵抗をしない、新しい刺激を求めない)」みたいな力が大きく働いている状態なのかな・・・?「疲れている時はクリエイティブなアイディアが出てこない」みたいなのは馴染みのあるパターンだと思うんだけど、それと同じような事が同じような原因で生まれているのかもな、なんて気がした。

P69
こうなっていれば、答えを何か考え出すのに困難を覚える人はほとんどいない。コチラは「正解」を求めているのではなくて、彼らの意見を求めているのだ、という風に見えるので、威嚇的雰囲気の大部分が消滅するのである。意見なら誰でも、またはほとんど誰でも持っている。そして自分の個人的意見ということになったら、誰でも大家なのだ。

「何を求められているのか」というのを、言外のニュアンスまで含めて見極めようとしがち。
他人への問いかけはそういうとこを意識しながら行いたいし、逆に自分が解答者になっている場合は、そういう無意識なフィルタに邪魔されていないか?は意識しておいたほうが良さそう。

P70
われわれは、可能な場合にはいつでも、問題をまず自分たちにとって最大の快適さをもたらすような意味的レベルに置いてみるものだ。

暗黙的に、問題を大げさに考えすぎたり、その逆に余り単純化して硬直したりする・・・ていうのは、「求められている意味的レベルがズレている」ことによるのかも知れないな。知っている人からしたら「そんなやり方しなくてもここをこうするだけでさ」みたいなやつとか。

P75
10 意味に気をつけよう

※ 章全体に対する感想

なにかの問題を言語化する際に、書き手もしくは読み手が「言外の意味」を補完してしまう、それが極度に問題そのものを難しくしてしまう場面がある・・・みたいな話。
(なので、「明らかに他の解釈が仕様のないような表現を心がけよう」みたいな話だと思うのだが。)

これは凄い難しいよなぁ、そうだよなあ、と思いながら読んだ。頭が痛くなりそうなくらいだ。「そこに少女がいます」といった場合に「その時以外はいなかったのか」「少女以外、例えば少年以外はいないということか」みたいな。教習所の問題文がそんな感じなんだっけ?というのは、SNS等でもよく流れてくる。
でも、実際、気分や相手との関係地によって「教習所」になってしまうことはあるし、或いはそれを意識していないと問題文を書く人が読み手に対して「ここが教習所であることを期待する」ようになっちゃう・・って事はよくあるかも知れない。
で、章のタイトル、「意味に気をつけよう」だ。

第4部

P89
他人が自分の問題を自分で完全に解ける時に、それを解いてやろうとするな

「同じ課題設定でもそれを私(たち)の問題であるとされることで全力で解くようになる」みたいな話、面白いな。
「もしその解決方法を教師が提案していたら、受け入れられたとしても熱意を持って実行されなかっただろう」みたいな。あるいは、「これは彼の問題である」という視点で(他人が)解決策を出そうとすると、また変わる・・とか。

問題の持ち主が「彼」の場合は「タバコを吸うのを禁じる」という「彼が解決するように求める」、「私達」の場合は「みんなでタバコを辞める」とでもいうような(そこにいる90%以上の人はタバコ吸ってないのに!!)、「毎週1人ずつ、タバコより感じの良い楽しくなるやつを持ってくる」っていう。言ってみれば、そもそも「タバコが害」なのではなくて、喫煙者の彼も「楽しむための手段としてタバコを採用した」ってわけで、この「楽しむための集団は何があるか」という課題を共有した感じかな?だから「取り上げる」じゃなくて「皆で享受する・与える」みたいな方向性に変わっている、っていうように見える・・・

第5部

P110
第2の理由は「自然」の無関心さである。もし問題の原因を、人、または現実の事物ないし動作に求めることが出来るのであれば、解決の可能性に関する足がかりが得られる。問題の源泉に手が届くことによって、または問題を作り出した張本人の動機を理解することによって、われわれは問題を解消したり、それを軽減する道を見つけたりすることが出来る。

「変えられる部分」が原因だと考えたら初めてそれが「問題」になる、という感じか。どうしようもない部分に原因を求めると無力さに繋がるし、「公理」として逃れられないものになりそう。
第4部の「それは誰の問題か」同様、「どこに属する問題か」という視点はめちゃくちゃ大事なんだな・・・

P118
問題の出どころはもっとしばしば我々自身の中にある

ややこしいイザコザが発生してしまい、事態が硬直しかけたが、相手を1にの人間として誠意を持って接する(まず名前を聞いて、侮蔑的なあだなではなくて固有名詞で語りかけるようにする!)ことで氷解・好転してどうにかなった・・・という話。誠実さを持って接することで、あちらも「この問題をどうにかしよう」という知恵と力(小銭)を出してくれた、と。

ここまで読んで、「あぁなるほど、そうやって自体がいい方向にガラッと変わる、転回することもあるか。気をつけたいね」と思う反面で、「しかし今まで読んできた他のエッセイと違って、理知的と言うよりは道徳的な話だなぁ」なんて感じていたら「追って書き」である。

P119
追って書き この章は、本書の中でも失望感を与えることの、もっとも多い章の一つである。(中略)悪玉が善玉で、善玉─つまり読者自身─が実は悪玉だったと知るのは、がっくりとくる経験である。

こっちの気持ちを見透かされているのか!?と思って笑ってしまった。
この「実は自分が悪玉」問題、肝に命じておきたい話ではある。あの「自分が老害になっていやしないか」と気づかされ、頬をぶん殴られたような気持ちになった瞬間が思い出される。

オブジェクト指向の考え方 5th Editionを読んだ

新しくオブジェクト指向の本の翻訳本が出るみたい、という情報が流れてきたので購入。

オブジェクト指向の考え方 5th Edition (impress top gear)

オブジェクト指向の考え方 5th Edition (impress top gear)

  • 作者:Matt Weisfeld
  • 発売日: 2020/10/23
  • メディア: 単行本(ソフトカバー)

全体所感とかレベル感とか

読み終わっての全体的な所感としては、「思ったよりサクサクと読める内容だったな」というもの。高度な議論を扱った本なのかな〜って思ってたけど、寧ろ逆で、プログラミングを初めて少し経って「オブジェクト指向ってどんなものなんだろう?」と気になり始めた人などに良いのではないか、と感じた。(何も調べないで買うから!)
実際、こういった話題を扱ったものにしては本書中に具体的なコードが少ないような印象。・・・これはつまり「コードで考える方が自然」でない層への配慮なのではないか、という気がする。
12章、SOLID原則の段に至るまでは「極力、オブジェクト指向とは"現実にある物質(オブジェクト)をモデリングするような考え方"であるかのように扱おうとしている」ような印象すら覚えるほどに、「リアルワールドのモノで喩える」試みが見られた。 *1 そういう点をとっても、「オブジェクト指向ってどんなものなのか」に触れる人に向けた本なのかな〜と感じる所存。

前書きの「対象読者」を確認すると、

  • 本書は、オブジェクト指向プログラミングの概念を広く紹介することを目的としている
  • 本書を学ぶことによって、より高度なトピックについての書籍に進むための基礎が構築できるはずである

と述べられているので、やはり「入り口」的な性格が強いかな?と。

あと、「新しい本な感じがする」っていうのも読み易さに繋がるんじゃないかな〜と何となく。
本文中に「Swift」とかって言葉が出てくると、「あ、結構新しいやつだ」って感じがするw

自分は「オブジェクト指向を初めて知る」という目的だとオブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)が大好きなのだけど、その手前で読んでみても良いかも知れない。(あちらは、デザインパターンにまで突っ込んでいくので)

主張について・特徴的な所

とりわけ「振る舞いと実装の分離 / インターフェイス*2」について強調しているような雰囲気を感じる。
オブジェクト指向プログラミング、つまりオブジェクト同士がメッセージのやり取りを介してつながる・・と言った時に「どのメソッドに、何を渡せば、どんなものが返ってくるのか」という抽象的な情報がインターフェイス。そして「インターフェイスだけに注目しておけばいい」という点が、オブジェクト指向プログラミングを価値のあるものにしているよね!というところか。(もちろん、そこから「カプセル化」の価値が導き出されるし、「ポリモーフィズム」についても同様)。

また、「継承の問題点」や「コンポジションの重要性」について強調しているのが興味深かった。
「Chapter1 オブジェクト指向概念への招待 / 1.1 基本概念」から引用すると、

歴史的には、オブジェクト指向言語は、次のようなものによって定義されてきた。すなわちカプセル化、継承、そしてポリモーフィズムである(これを「古典的」オブジェクト指向と呼ぶ)。 (中略) これらの3つに加えて、著者は、コンポジション(合成)も含めたい。 (P2)

とさえ述べている。

大体は「古典的オブジェクト指向」の3要素で終わってしまうと思うので・・・そこから踏み込んで「継承か、コンポジションか」という議論にまで持っていってるのは個人的には本書で1番のお気に入りポイント。
「やっぱり継承って難しいよね」みたいな話は、特にgolangの人気が出てきてから良く目にするようになっていない?と個人的に思っているのだけど、その「危うさ」と提案としての「コンポジション 正しく使おう」という説明は、良い話。
「Chapter 7 継承とコンポジションをマスターする」や、特にその中の「7.4.1 継承はどのようにカプセル化を損なうか」に詳しい。

扱っている話題の広さ

目次を見ると、扱っている話題の範囲の広さを感じると思う。(公式サイトに載っている)

book.impress.co.jp

「基本的な概念」に始まり、「クラス設計のガイドライン」「フレームワーク」「デザインパターン」「SOLID原則」にまで進む。 (「フレームワーク」の話は、期待しすぎると内容のあっさりさを少し残念に感じるかも知れない。あくまで「再利用性を高めることとオブジェクト指向」という文脈で「フレームワークというアイディアの詳解」という話かな、という感じ) これを250ページちょっとでやる。

オブジェクト指向とはなにか」から「実際の開発の現場にどう影響しているか」みたいな視点でいくと、このくらいまでが守備範囲に含まれてくるのか〜という印象。

「設計のガイドライン」はオブジェクト指向を覚えたての人でも明日から仕事で活かせる感じするし、SOLID原則とか分かるとアーキテクチャっぽい話にもつながっていくし、と。

まとめ

サクサクと読めた!!ので、積ん読にしないでザッと読んだの良かったな。昨日届いた(というか、発売日が2020/10/23でその日に届いた)のを今日読んだ感じ。 出てきくるコードは難しくない(雰囲気で読める)、そもそも少ない、UMLもゴクゴク簡単なクラス図に限定して使われているのでアレルギー少なそう。
文章も平易だったように感じる。

OOPとかに興味持ってきた〜って人にオススメしやすそうな1冊なのかな、って印象!

*1:12章に入った途端に、”オブジェクト指向が人間の考え方に近いというアイデアは、単なるマーケティングである。オブジェクト指向が人間の考え方に近いということはない”というボブおじさんの言葉が紹介されている

*2:書籍中だと「インターフェース」という記述になっていたけど、自分はこっちのほうが慣れているので

SQLパフォーマンス詳解を読んだ

仕事で回ってきたタスクで「はぁ〜〜SQL真面目にわからないとだな〜〜」という熱が高まったので、積ん読の順位を入れ替えて読んだ。

を見て f:id:o0h:20201013031330p:plain ってなってたやつです。

4月か、もうずっと前な感じあるぅ。

結論としてめちゃくちゃおもしろかったな、ずっと雰囲気でやっていたインデックスの管理について、雰囲気をつかめたような気がする・・・

「カーディナリティが低いカラムにインデックス張っても意味ないよ」みたいな話とか、理屈で掴めたのがめっちゃ良い。目が覚めるような感覚を覚える。
また、「もしかしたらインデックスヒントやったらワンチャン・・?」みたいなノリで試して→「やっぱ駄目ですよね!アハ!!」とかいう戯れをこれまでに何度も繰り返してきたのについては、少し勘所を掴めそうな気がする。(これはMySQL8以降で変わる部分もありそう、下位バージョンにおいては、機械がよしなにやってくれなそうな部分〜を人力で支援するぞ!!という機会がありそう。みたいなイメージ)

もっと初歩的なことでいうと、「複合インデックス作る時は順序が大事だよ」とか、そういう部分まで含めて、あ〜なるほど〜〜〜って感じに。

いつも技術書等を読む時は、「おっ!」と思った部分は原文を抜き出して自分の感想を添える!という形にしているのだけど、この本は抜き出しが多すぎて比率的に引用って呼べる範囲を超えてそうだな・・・・・という感じすら覚える。

カバーリングインデックスの話も良かったなぁ。。


以下、読書メモ(の一部!!

  • 検索ツリー
    • ルートノード > ブランチノード > リーフノード
    • リーフノードは、ノード同士を双方向連結リストで相互参照している
    • 「リーフ」が、実際のテーブルの行データ情報(=ROWID)を持っている場所
    • 実際にテーブルのデータにアクセスするまでに、ツリーを走査し→リーフノードを手繰り→テーブルからデータを取る、という流れになる
      • この時に、「ツリーだけで済む」ようであれば、極めて低コストで済む。(リーフノードから先については、コストが嵩みやすい)
      • これは「ツリーの深さは増加しにくい」という性質のために、「ツリーだけなら走査しても試行回数がたかが知れている(数回レベル)」というもの
      • 逆に、「ひとつのリーフノードだけでも、数百のエントリを保持していることがある」(P6)
  • カバーリングインデックス
    • where/order/select等、「使う必要がある列(の値)」が全てインデックス上に含まれている場合、「インデックスの表」に載っているデータだけを使って「実際のテーブルのデータ」にアクセスしないで処理を完結させる
  • セカンダリインデックス、クラスタ化インデックスあたりの話
    • セカンダリインデックス = 主キーでないインデックス
    • 主キーはBツリーインデックス、索引構成表、クラスタ化インデックス。ROWIDに直接紐づく
    • セカンダリインデックスは、クラスタ化インデックスに保存された”元のデータ”を経由して、ヒープテーブルにアクセスする
    • 「物理的なポインタ(=ROWID)」をもたず、論理キーを扱う
      • クラスタインデックスのキーの値だけを保持
      • これを「クラスタリングキー」といい、多くの場合は索引構成表のプライマリーキーとなる • それによって、インデックスの順序を入れ替えることが可能になっている
    • 索引構成表を使うと、ROWIDを用いてヒープテーブルにアクセスができるため、テーブルアクセスのコストが低い
    • セカンダリインデックスを利用してテーブルにアクセスすると、まずセカンダリインデックスで検索し(INDEX RANGE SCAN)→クラスタインデックスを検索する(INDEX UNIQUE SCAN)という風に、2つのインデックスを検索することになる。
  • numericな値
    • WHERE numeric_string = 42はインデックスが効かないが WHERE numeric_number = ’42’はインデックスが効く
    • これは「文字列を数値にキャストする」か「数値を文字列にキャストするか」の違いで、前者については、例えば '042' '00042' といった値も数値にしたら42ではあるが、インデックスが作られているのはあくまで0042 といった値に対してなので、つまり「対応するインデックスが存在しない」状態になるため
  • 複合インデックス
    • (col1, col2, col3)というINDEXに対して WHERE col1 = ? AND col2 = ? はインデックスが効くが、 WHERE col2 = ?WHERE col1 = ? AND col3 = ?は効かないよ
    • 例えば「アーティスト名・アルバム名・曲名」という並び方で作られた索引に対して、「アーティスト名」だけで探す〜はできても、「曲名」を条件に探すっていうのは効率悪いでしょ(それなら全部スキャンしちゃうかもね)っていうイメージ
  • インデックスと順序
    • INDEX RANGE SCANはインデックスの順番で結果を返す
    • 複合INDEX(col1, col2)を作った場合、「col1で絞り込んでcol2でソートする」のようなwhere/order byを付けた場合でも、INDEXをスキャンした通りの結果をそのまま返せる = DBは明示的なSORT工程を踏む必要がない
    • ただ、これは「col1で絞り込んだ範囲であればcol2が順序よく並んでいる」といった場合に限るので、クエリの改修に注意が必要な感じ

あとはこの辺りをもう少しちゃんと読み込みたい

use-the-index-luke.com dev.mysql.com

Clean Agileを読んだ

最近になってようやく・少しずつ「アジャイル」なるものに興味が出てきたな・・・というタイミングで、「新しくClaen Agileっていう本が出るよ」というのを、翻訳者の1人である角さんのツイートで知った。
こんな良いタイミングで、こんな良さそうな本!!と購入。最近、書籍購入の財布がガバガバなこともある。

読後の感想としては、「アジャイル(未)入門」な自分が触れても充分に楽しめた!
内容も然ることながら、文章が凄い読みやすかったし面白かったな・・全体を通じて、(しばしば技術書や翻訳書にあるような)専門的・歴史的・横暴で権威的な眉間にシワを寄せながら付き合っていかなきゃいけない箇所みたいなのがなかった。文量的な軽さも相まって、読みやすいな〜って感じ。

アジャイルやXPについての具体的なやり方・プラクティス・ノウハウについては踏み込みすぎず、あくまで「アジャイルって(本来は!)こういうものなんだぜ・・」という部分を語っている本だな、と思う。理念というか初期衝動というか。
アジャイルって聞いたことあるし何となく存在は知ってるんだけど、計画期間を短くして回すやつ?それ以上の違いってどこなんだろ?」みたいな雑な認識をしてる人が読んでみると、「なるほど、その辺りが本質なのか」という輪郭が掴める気がする。

まさに副題の「基本に立ち戻れ」という通り、これは「この先、具体的にアジャイルやXPについて学んだり実践したりして、少しずつ自分なりに理解を深めていく中で、何度も帰ってくるべき故郷みたいな本になるかもな」という予感。
もっというと、「2章: アジャイルにする理由」と「6章: アジャイルになる」の前半、「7章: クラフトマンシップ」かなぁ。本質さえ抑えておけば道を誤らない、”実装論”や”プラクティス”は些細なことになるのではないか?という感覚がある。その点、これらの章が本書の中でも「なぜ」「どうすれば」に簡潔に答えてくれているような気がして。


以下、読みながらとっていた読書メモを見返しながら、特に気に入った部分とか。

P43

アジャイルは速く進むことだと思っている人もいる。だが、そうではない。これまでそうだったこともない。アジャイルとは、どれだけうまくいっていないかをできるだけ早く知ることだ。できるだけ早く知りたいのは、そうすれば状況をマネジメントできるからだ。(中略)アジャイルはデータを生成する。アジャイルは大量のデータを生成する。マネージャーはそれらのデータを使用して、プロジェクトの成果を可能な限り最高にする。

"アジャイルは速く進むことだと思っている人もいる。だが、そうではない。これまでそうだったこともない。" は、読んでて1番「おぉっ!」と思った箇所かも。
「フィードバックサイクルを短くして、現状をしっかり見つめて機敏にやる」みたいな話だもんな、そうだよな・・「成功確度を上げる」というのと「速くする」ってぜんぜん違うよな。それに加えて、「要求とは常に変化し続けるもの」となれば、より「細かく方向修正していく余地を持つ」ことが大事になる。そのためにフィードバックを集めるのか。
”プロジェクトの成果を 可能な限り最高に する"、なるほど。

この「データ」というのは、例えばストーリーポイントの消化状況だったり、バーンダウンチャートに現れている状況だったり(この前節のタイトルが「アジャイルが生成するデータ」)。「能動的に(積極的に)フィードバックを集められるようにモニタリングして、”適応的”にやっていく」っていうことか。

P44

プロジェクトの鉄十字に戻ろう。「品質」「速度」「費用」「完成」だ。マネージャーは、プロジェクトから生成されたデータをもとに、どれだけの品質、速度、費用、完成度のプロジェクトにするかを決める。 そのためにマネージャーは「スケジュール」「スタッフ」「クオリティ」「スコープ」を調整する。

可変変数はどれか、という話。この後に「(クオリティは)速く進みたければ上げるしか無い」って書かれていて、なるほど「クオリティも非可変か」と思った。
ラクタを作っても遅くなるだけ!

P59

しかし、その新メンバーのトレーニングは誰が担当するのだろうか?これまでコードベースを雑然とさせてきた人たちだ。新メンバーはすでに確立されているチームでの振る舞いに従うことになる。 さらにまずいのが、既存コードが強力な手本になることだ。新メンバーは現状のコードを見て、チームの仕事を推測する。そして、雑然とさせることに加担し、それを続けていくことになる。

そう!!!!コレ!!!!!!!!!って感じ、思わず膝を叩きそうになった・・。 「プロダクトの成長性を規定するのは既存コード」みたいな感覚。この辺り、前にカンファレンスで話した時にも触れた部分に近い。
あと「腐敗は侵食する」という。ただ、よくも悪くも「コードを書いている内にプログラマの腕や見識は高まる」ものなので、つまり「既存資産が良いコード」である確率はゼロになるんだよな。 普段から「今あるコードよりちょっといいコードを書こう」くらいの気持ちを強く持つことは必要かもしれない、或いは「未来の誰かのお手本を作っている」という緊張感が欲しい。全力を出さないで良いと考える合理的な訳がなくなる。

P122

シンプルな設計とは、必要とされるコードだけを書いて、最もシンプルで、最も小さく、最も表現力のある構造を維持するプラクティスである。

  1. 全てのテストをパスさせる
  2. 意図を明らかにする
  3. 重複を排除する
  4. 要素を減らす

1はTDD当たり前として、2〜4は個人的に考える「良いコード = 筋肉質なコード」に近いなー!「最もシンプルで、最も小さく、最も表現力のある構造」って良すぎる。
プログラマーの意図を明らかにする」 = 「表現力を高める」で、「表現力を豊かにしたあとで、重複を排除する」なのか。 「すべての重複を排除したら、クラス、関数、変数などの構造的な要素の数を減らすべきであることを示している」。これも「ローカル変数をなくす・メンバを減らす・・を意識して徹底するとコードの読みやすさを上げやすい」っていう自分の体感に適う。


アジャイル〜〜なトピックだと、次は「みんなでアジャイル」→「アジャイルサムライ」→「エクストリームプログラミング」か「SCRUM BOOT CAMP THE BOOK」辺りを読もうかなぁ〜って予定