読書メモ 珠玉のプログラミング

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

CleanCodeなど今までの技術書とは毛色が異なり、特定の言語に限らない、アルゴリズムとデータ構造について論じている。 第1部から第3部の全15のコラムに分かれている。

  • 第1部 コラム1~5 プログラミングの基礎である、問題定義、アルゴリズム、データ構造、プログラムの検証とテスト
  • 第2部 効率に関するコラム
  • 第3部 今までのテクニックをソート、探索、文字列などの重要な問題に応用

コラム1 真珠貝を開いて

重複のない単純なデータのソートを、ビット列というデータ構造を用いて実現する。

例題

入力ファイルには、重複のない7桁の正の整数が記録されている。
入力された整数を昇順にソートした一覧を出力したい。
ただし、メモリには1MB程度の余裕しかない。

ビット列で実現!

原則

正しい問題
問題定義をきちんとする。アルゴリズム、データ構造を考える上で、問題の前提条件などきちんと整理する。
ビット列というデータ構造

ビット列は、「限られた範囲内にあり、密で、重複が無く、付随する情報もないようなデータのセット」を表すのに有効です。

例えば、20より小さい整数を、20個のビット列で表すことができる(整数nが存在する場合、ビット列のn番目のフラグを立てる)

コラム2 「ああ(そうか)!」アルゴリズム

ひらめきが大事。

例題

例題1
最大40億個の32ビット整数がでたらめな順に入っているファイルから、このファイルに含まれていない整数を探し出す。
例題2
要素がn個の配列を左方向にi要素分回転させる。
例題3
英語の辞書が与えられたときに、すべてのアナグラムを見つける。

2分探索、(まとめるための)ソート、印付け(値を同値クラスに振り分ける)

原則

ソート
ソートの用途は、整列された出力を作るだけではない。
2分探索
ソートされたデータの探索方法として非常に有効。あらゆる場面で使われる。
印(シグネチャ、署名)
ある値を決まったルールでグループにわけ、印をつけておく。その印で、ソートするなどして効率的に処理できる。
ここでは、アナグラムの検索を実現している。

読書メモ EffectiveJava

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)

Javaやるなら必読。誰もが絶賛する。ただ、Java初心者には敷居が高い気がする。自称中級者くらいからが対象?(自分には難しめ。。)

Effective Java 読書会 4 日目「最近はあまり継承とか使わないらしい」 - IT戦記

まとめ方が超的確ですごい。さらに面白い。

第4章 クラスとインタフェース

項目13 クラスとメンバーへのアクセス可能性を最小限にする

ソフトウェアの適切な機能と矛盾しない最も低いアクセスレベルを使用すべきです。

最初は、とりあえず全部privateでいくぐらいの気持ちでいいと思う。

もし、トップレベルのパッケージプライベートのクラス(あるいはインタフェース)を、1つのクラスだけが使用しているのであれば、その使用している唯一のクラスのprivateのネストしたクラスにすることを検討してください(項目22)

見られる範囲がパッケージ内の全クラスから、自クラスだけに!!

読書メモ 良いコードを書く技術

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

はじめて身の丈に合った本っぽい。

第10章メタプログラミング

本書の中では一段難しい。応用編。

コードを自動生成するプログラムをプログラミングすること。 JSPDSLと言える。

読書メモ Junit実践入門

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

具体的な使い方だけでなく、テスト駆動開発についてなどもカバーしている。

テストのコンテキスト

Enclosedによるテストクラスの構造化

これは取り入れたい。テストメソッドを並列に並べるんじゃなく、グループ化した単位でネストクラス作ってく。

読書メモ Java並行処理プログラミング

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

第1章 はじめに

割愛。今後出てくる用語だけメモ。

競り合い状態 race condition

複数のスレッドからアクセスされ不正な状態となること

生存の危機

プログラムがハングして進まなくなること。(デッドロックとか)

追記

業務でマルチスレッドの試験をする必要になり久しぶりに取り出してみた。以前は読み飛ばしてた試験についての章に目を通す。

第12章 並行プログラムを試験する

まとめ

並行プログラムの正しさの試験は、とても困難です。 これに尽きる。バグもタイミングに依存することが多いし。なのでバグ摘出の確率をあげる努力をしようということ。

従来的な試験テクニックに加えて、コードレビューと自動分析ツールを併用してください。 これは実体験からも重要。まずはfindbugus流すことから。(検出したバグパターンをちゃんと理解して修正すること。その場しのぎで治しがち。)

12-1 正しさを試験する

並行プログラムのユニットテスト書く上でのテクニックなど。JSR166のテストコードへのリンクと解説が必読!

ツールメモ GoogleChrome

主にextention(拡張アドアイン)のまとめ。

Vichrome

chromeをviライクに操作できる。 必須。f-modeが超便利。(元ネタとしてhit-a-hintというのがある??)

AutoPager Chrome

自動で頁送りなどしてくれる。例えばgoogleの次へリンクを自分で押下する必要がなくなる。

Auto-Translate

翻訳拡張。ctrl押下+選択範囲の内容がポップアップで表示される。

Gestures for Google Chrome

マウスジェスチャ

LastPass

パスワード管理ソフトのchrome拡張

ato-ichinen

google検索結果を1年以内のものにフィルタリングできる。

読書メモ 知識ゼロから学ぶソフトウェアテスト

知識ゼロから学ぶソフトウェアテスト 【改訂版】

知識ゼロから学ぶソフトウェアテスト 【改訂版】

ソフトウェアテストの入門書。入門書だけあって極めて平易な文体で書かれている。が、内容は以下の通りテストについての諸々を網羅してる。

  • テストの種類
  • 探索的テスト
  • 非機能要求のテスト
  • テストの運用
  • テストの自動化

まとめ

  • ブラックボックステストが最重要
    • 入力ダイアログがあれば、境界値テスト
    • 複数の入力ダイアログがあれば、ディシジョンテーブルテスト
    • ダイアログの遷移があれば、状態遷移テスト
  • 要求仕様のバグ、設計のバグ、コーティングのバグのうち、コーティングのバグは比率が低い
  • 組み合わせテストは往々にしてやりすぎ

2章 ホワイトボックステスト

  • 仕様不良は検出不可!
  • カバレッジはあくまで目安として考えよう

3章 ブラックボックステスト

  • ソフトウェアはつまるところ、入力、出力、計算、保存の4つの振る舞いをテストすれば良い(大意)
  • 基本は、同値分割と境界値分析
  • ゼロは常にバグになりやすい数
  • 複雑な入出力には、ディシジョンテーブルテスト
  • ブラックボックステストは、もっとも重要であり、もっとも多くバグが出る!