シ-ツ

更新投稿先 https://twitter.com/_shi_tsu_

感想: 世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

https://www.amazon.co.jp/dp/4839960100

積んでいたのでそろそろやるかと思いチャレンジ。

中級編上級編未着手なのと、後半の取り組みが雑になってしまったが一応一通りやってみた。

序盤はビックテックの面接はどういうものなのか、裏側はどうなっているかについて書かれており、ビックテックを受けるとしたら参考になりそう。加えて、面接での行動についても触れられており、こちらはビックテックに関係なく面接前に読み返したい内容だった。

そして肝心の問題はコンピュータサイエンスの授業でやったものや、競技プログラミングに近いものも多く、懐かしい気持ちで取り組むことができた。とはいえしばらくやっていないと全然解けなくて、「自分はこんなのもすぐに解けないのか…」と気が落ち込みがち。

競技プログラミングと違い、Howまで指定されることもあるのに慣れる必要があった。(「◯◯を使ってor使わずに△△を実装せよ」のような)

また、競技プログラミングとの違いという観点だと、与えられた問題に曖昧さが残るものも多数あり、これは面接中に対話で明らかにする必要があるんだろうなと推測できた。*1

内容は全体的に良い本ではあるが、ときおり誤植が見られたり、問題文の理解が文章構造上難しかったり、kindleだと目次はあまり機能しておらず、問題・ヒント・解法を往復するのに時間がかかるなど細かい部分の難点が勿体ないと感じる本でもあった。

そしてビックテックを受けるなら、英語の原著を読んだほうが良いと思われる。日本語・英語の技術用語のマッピングができず、英語の面接で混乱するのが目に見えるようだ...

*1:スケーラビリティとシステムデザイン、オブジェクト指向設計の部分の曖昧さはそのように推測できるのだが、データ構造に関する問題においても文章が一意に読み解け無いものがいくつかあり少々辛かった。面接ならその場で対話で明らかにできるが、本だとそうは行かないので…

感想: データ指向アプリケーションデザイン

https://www.oreilly.co.jp/books/9784873118703/

データに大きく関わる仕事をしている以上、読んでおいたほうが良いと思い購入。電子で買うと厚さがわからない分気軽に読めるがなんせ長い。

さすがに長すぎるので今回は下記の手順で読んだ。

  1. 目次と本全体を流し読み
  2. 再度流し読みして、本に対する質問を作る
    • 「CAP定理が有益でないのはなんで?」とか
  3. 質問を作った部分は読書メモを取りながら、全体を改めて読む。

正直完璧に理解できたとは全く言えないが、とても学びがある本だった。

個人的に好きだったのは「第2部 分散データ」のあたり。

これまではなんとなく理解していたパーティショニング・レプリケーショントランザクションあたりが言語化された感覚がある。多少でもRDBや他のデータストアに関わっている人なら楽しく読めそう。

「8章 分散システムの問題」「9章 一貫性と合意」もとても面白かった。これまで「Elasticsearchはnノードにしようか。replica数はいくつで〜」という会話をよくしてきた。しかしその設定の裏にあるこれらの問題と苦労までは意識できておらず、これらを隠蔽してくれている数多の製品・サービスには本当に頭が下がる気持ちになった。

ここを読むのに合わせて、こちらのスライド資料も非常に参考になった。この本の中で「2相コミットは問題が多い」という記述は多々みたが、実際にはどのような問題があるのかという理解の助けになった。

また、この本を読むのにあわせて、MySQLのドキュメントの確認 + 手元での設定を試してみたがなかなか良かった。本ではこう言っているが実際はどうやるの?みたいなところがクリアになる。

改めて、本で語られていることのうち実際に吸収できたのは半分にも満たない気がするが、とても学びのある本だった。第二版や後継となる本が出たら是非買いたい。

感想: ロバストPython

もっとも使用している言語がPythonである以上読んでおいたほうが良さそうだと思い購入。

既に知っていたり、実務で活用している内容も多々あったが、「そんなのもあったんだ」と発見がある良い本だった。特に、プロパティベーステストは名前だけ知っている状態で、ミューテーションテストは名前すら知らなかったので是非試してみたいと思えた。

以下自分が良いと感じた部分。

  • Annotated型は現在コミュニケーション目的でしか使えない
  • LiteralとEnumの使い分け
    • まずはLiteralをためす。イテレーションや実行時チェック、名前に対応する値の指定が必要ならEnum
  • enum.Flagでビット演算ができる
  • TypedDictとDataclassの使い分け
    • 基本はdataclass推奨。振る舞いを足したり、イミュータブル性や等価・大小比較ができるのが嬉しい
    • 上のメリットが必要なく、元から辞書を使ってる箇所はTypedDict良さそう
  • namedtupleを使う必要はなくなってきている (dataclassで代用できる)
  • クラスが抱える不変式の維持を、パフォーマンスなどの観点により外だしする場合、保守性の低下を認識した上で他の手段(厳格なlint、厳格なレビュー)で補う必要がある
  • typing.Protocolでダックタイピングの支援
  • pydanticによるdataclass(pydantic.dataclasses.dataclass)を利用した実行時型チェック
  • 独自Pylintプラグインを実装してプロジェクト独自のチェック
  • dodgyによる機密情報探索目的の静的解析
  • Hypothesisによるプロパティベーステスト
  • mutmutによるミューテーションテスト

    • ミューテーションテスト
      • バグを発生させることを目的にソースコードを書き換える手法
      • テストがどれれだけ優れているかをテストとする意味でメタテストの一種
    • 導入の難点
      • ミューテーションテストそのものと、メリットが有ることがあまり知られていない
      • ミューテーションテストが役立つほど、コードベースのテストが成熟していない
      • コストパフォーマンスが悪い
    • ミューテーションテストはコードカバレッジに関する間違った思い込みからコードベースを守る方法でもある
  • 以下話の本筋ではないが紹介されたライブラリとその目的

    • backoffによるデコレータを使った再試行
    • pypubsubによるイベント駆動アーキテクチャ
    • rxによるリアクティブプログラミング
    • stevedoreによるプラグイン管理

感想: 天穂のサクナヒメ

良すぎてサントラも買ってしまった。

前評判から「米作りのゲーム」という観点で期待して買ったが、「戦闘」「キャラクター」「ストーリー」「音楽」が期待を遥かに上回った。 なお自分は米作りは廃人の皆様ほどやり込めなかった...

戦闘

想像以上に戦闘が楽しいゲームだった。 少し前にやった有名どころのゲームいくつかでは「これただAボタンとBボタンを押してるだけだな...」みたいな気持ちになってしまい※途中で投げてしまったが、このゲームは妙に楽しかった。 羽衣・武技が豊富なのと、行動にキレがあるからだろうか。

※他のゲームでも実際は魔法などがあって弱・強攻撃だけではないのだが...

キャラクター・ストーリー

サクナがとても良いキャラをしている。声も好き。 ストーリーも期待以上だった。進むに連れてうかがえるサクナの成長がとても良い。

音楽

あまりに良すぎてサントラを別で買ってしまった。サブスクじゃないところで音楽を買ったのは数年ぶり。 コミカルな曲から田舎を彷彿とさせるまったりとした曲まで。特にまったりとした曲を晴れているときに聞くと最高である。ここは東京ジャングルだけど...

感想: 推薦システム実践入門

末端検索エンジニアとして生活しているが、日々の業務で「自分の好きなものをちゃんと理解して、対象のデータセットの性質を理解して、検索の方法を理解して、検索ができるユーザーはそうそういないな」という気持ちがあり、そろそろ推薦も本腰入れて学び始めてみるかと思って読んだ。

全体としてとても学びがある内容だった。読書メモは本のコピペ並に書いてしまったので割愛。

自分自身、情報検索を多少+機械学習をうっすら勉強していたので、聞いたこと・見たことののある内容もそこそこあった。

個人的にとても嬉しかったのが以下の点 (内容)

「推薦アルゴリズムの詳細」にある「各アルゴリズムの比較」の表

前に 推薦システム: 統計的機械学習の理論と実践 に手を伸ばしたときは「実際に実務ではどれがよく使われているんだ…?」「もう今は全部機械学習で置き換えられていたりしないのかな..?」と気になってしまった (まだ完読できていない…)

この本では各アルゴリズムの強み・弱みや、実務で使う場合どのように取り組んでいくべきかという話に触れられており、実体感を持って読みやすかった。

この本を読んだ後なら推薦システム: 統計的機械学習の理論と実践も完読できる…かもしれない

「推薦システムの評価」

検索システム周りでも触れられる指標や評価方法が多くあり、自分にとっての真新しさがとてもあったわけではないが※、きれいに整理されているため都度見直したいを思える章だった。

※知識としては知っていても実務に導入できていないので頑張っていきたい…

「発展的なトピック」

特に良かったのが「バイアス」「相互推薦システム」「Uplift Modeling」

バイアスについては「言われてみるとそうだよね」というものではあるが、実際に名前がついて明示されると明確に意識が向いて良いと感じた。おそらくはここに載っているもの以外にも多数のバイアスがあると思われるので、自分でも調べて見る必要がありそう。

全体を通して、更に詳しく知りたい人への本の推薦があること

「実践入門」とタイトルにあるだけあって、実務で推薦システムを実装するに当たり必要な部分に広く触れていただいている印象があった。一方で「もっと詳しく知りたい方は~」のように他の本への参照が多数あるのが嬉しい。実務で困ったり、もっと知識を得たいと感じたときの道筋を教えてもらえるのは非常に助かると感じた。


総合して非常に良い本だった。

まだMovieLensのデータセットを使った例も試せていないので少しずつ試していきつつ、自分の業務に適用できる範囲はどこかを考えていきたい。


2023-05 追記

「5章 推薦アルゴリズムの詳細」の写経が終わった。

当初は本で定義されているBaseRecommenderを利用して一気に書く→実行の流れで写経しようと思ったものの、データの理解が追いつかない部分が出てきたため、Jupyter Notebookで逐一データの中身を確認しながらやるようにした。

写経をやる前と比べて当然理解は深まったものの、実務において悩む部分がまだ残る。 特に、似たような特性を持つアルゴリズムはどれから試すべきか、という点が気になっている。 また、実際に推薦機能を導入するときのオフライン評価の基準もどうしたもんかな、とも思ったが、人気度順や過去見た動画とのmore like thisでの評価値を基準に置くのがやりやすそうな気がした。

このあたりは機械学習の推薦系コンペなどで素振りしていると肌感覚が身につく気もしているので、いくつか過去問をやってみるのもいいのかもしれない。

感想: 単体テストの考え方/使い方

「アプリケーションをどのようにテストすべきか?」という書籍は過去に読んだことがあったが、テストそのもののメンテナンスなどに関する本は初めて読んだ。

これまでの経験則からわかっていたことが言語化された面もありつつ、自分が考えたこともなかった側面も明らかになり非常に良い本だった。 加えてこの本が出版される直前に、同僚が書いたテストコードの粒度があまりにも細かくて苦労したために恐ろしく納得感があった。(実装の詳細を細かくテストしていたためにリファクタリングへの耐性がなかった)

一方でこの本が提示している単体テストのあるべき姿を適用しようとするとプロダクションコードをテストしやすい形にする必要があるため、一朝一夕でこの本通りにやるというのは無理そう。

またこの本に限ったことではないが、コード上の表現と実際の概念の違いを意識するのはかなり大事だと再認識した。

たとえば、あるクラスAのメソッドaがpublic(公開)であるとして、クラスAを含む複数のクラスがまとまって1つの振る舞いを提供するモジュールを考えると、メソッドaは「公開されている振る舞い」ではなく「実装の詳細」であるとか。 interface や抽象クラスだから「抽象」なのではなく、「重要ではない詳細を除いた単純化されたエンティティのビュー」が「抽象」だとか... (よって関数のシグネチャも抽象化の一つであるという話)

以前どこかで見かけた「一番変わらないと自信があるインターフェースに対してテストを書く」という案は結構納得感があったなと思い出していた。

感想: 機動戦士ガンダムSEED

最近ガンダムに入門してひたすら見続けている。 水星→ファースト→Z→逆襲→ポケ戦→SEED→SEED DESTINY→00 と見ていてSEEDが一番おもしろいと感じた。2番目はポケ戦。 (ZZは飛ばしてしまった...)

機体のカッコよさでいうと一番新しい水星がやっぱり一番だったけれど、SEEDは主人公以外のキャラの心情の変化がとても良かった。特にディアッカが捕虜になって殺されそうになる回。あと「舞い降りる剣」は順当にカッコいい。

水星見て勢いで人生初ガンプラとしてHGエアリアルを買ったが、「舞い降りる剣」視聴直後にRGフリーダムをポチった。届いてあまりのシールの多さにビビった。いつ組み立てられるんだコレ。