Chapter 6. While You Are Coding【The Pragmatic Programmer】

The Pragmatic Programmer の Chapter6. While You Are Coding を読んだ。 内容は次の通り。 31 Programming by Coincidence 32 Algorithm Speed 33 Refactoring 34 Code That’s Easy to Test 35 Evil Wizards 印象に残る章がいくつかあったので書き残してお…

『サピエンス全史』を読んで

ちょっと前、と言っても数ヶ月は経ったけど『サピエンス全史』を読んだ。 サピエンス全史(上)文明の構造と人類の幸福作者: ユヴァル・ノア・ハラリ,柴田裕之出版社/メーカー: 河出書房新社発売日: 2016/09/08メディア: 単行本この商品を含むブログ (34件) を…

Chapter 5. Bend, or Break【The Pragmatic Programmer】

The Pragmatic Programmer の Chapter 5. Bend, or Break を読んだ。 内容は次の通り。 26 Decoupling and the Law of Demeter 27 Metaprogramming 28 Temporal Coupling 29 It’s Just a View 30 Blackboards 一通り読んだけど、あまり印象に残る話題がなか…

Chapter 4. Pragmatic Paranoia【The Pragmatic Programmer】

Pragmatic Programmer の Chapter 4. Pragmatic Paranoia を読んだ。 内容は次の通り。 21 Design by Contract 22 Dead Programs Tell No Lies 23 Assertive Programming 24 When to Use Exceptions 25 How to Balance Resources 契約によるプログラミングと…

Chapter3. The Basic Tools【The Pragmatic Programmer】

Pragmatic Programmer の Chapter 3. The Basic Tools を読んだ。 内容は次の通り。 14 The Power of Plain Text 15 Shell Games 16 Power Editing 17 Source Code Control 18 Debugging 19 Text Manipulation 20 Code Generators この章はツールの紹介とか…

Chapter2. A Pragmatic Approach【The Pragmatic Programmer】

Pragmatic Programmer の Chapter 2. A Pragmatic Approach を読んだ。 内容は次の通り。 7 The Evils of Duplication 8 Orthogonality 9 Reversibility 10 Tracer Bullets 11 Prototypes and Post-it Notes 12 Domain Languages 13 Estimating 曳光弾開発と…

第 218 回 TOEIC の結果

そういえばもう一ヶ月くらい前になるけど、第 218 回 TOEIC の結果が返ってきた。 Listening Reading Total 430 415 845 結果として前回から100点くらい伸びた。Listening も Reading も前回の TOEIC よりはきちんと理解して解けたところが多かった。理解で…

『基礎からしっかり学ぶ C++ の教科書』を読んで

『基礎からしっかり学ぶ C+の教科書』という本を読んだ。 基礎からしっかり学ぶC++の教科書 C++14対応 (マイクロソフト関連書)作者: 矢吹太朗,WINGSプロジェクト山田祥寛出版社/メーカー: 日経BP社発売日: 2017/02/16メディア: 単行本この商品を含むブログを…

『ディープワーク』を読んで

ディープワークを読んだ(邦訳のタイトルは『大事なことに集中する』)。 大事なことに集中する―――気が散るものだらけの世界で生産性を最大化する科学的方法作者: カル・ニューポート,門田美鈴出版社/メーカー: ダイヤモンド社発売日: 2016/12/09メディア: …

『ファスト&スロー』を読んで

『ファスト&スロー』を読んだ。 ファスト&スロー (上)作者: ダニエルカーネマン,村井章子出版社/メーカー: 早川書房発売日: 2012/12/28メディア: Kindle版購入: 2人 クリック: 34回この商品を含むブログ (7件) を見る ファスト&スロー (下)作者: ダニ…

Communicate!【The Pragmatic Programmer】

エンジニアとしてコミュニケーションは非常に重要だ。 エンジニアはコミュニケーションをとる必要があるし、上手にコミュニケーションできれば得るものも大きい。この章ではよいコミュニケーションを取るための心がけが挙げられている。 何が言いたいかを知…

Your Knowledge Portfolio【The Pragmatic Programmer】

知識ポートフォリオを構築して適切に管理しよう。 知識ポートフォリオは投資におけるポートフォリオと同じような視点で管理するとよい。各アイテムの間でバランスを取り、リスクの高いアイテムと低いアイテムを組み合わせよう。 ただし、もっとも重要なのは…

Good-Enough Software【The Pragmatic Programmer】

完璧でバグのないソフトウェアはありえない。 だからといって悲観する必要はない。 ユーザーにとって、経営者にとって、そして私たちの心の平穏にとって、充分なクオリティというものが存在する。完璧でなくても充分よければそれでいい。 ユーザーは明日の完…

Stone Soup and Boiled Frogs【The Pragmatic Prigrammer】

石のスープ 戦争から帰ってきた兵士が村に帰ってきた。しかし、彼らは食料を恵んでもらえない。そこで彼らは湧いたお湯に石を入れ『あとは人参があれば美味しいスープができるのになぁ』とつぶやく。すると村人たちが興味を持ち、人参だけでなく様々な食材を…

Software Entropy【The Pragmatic Programmer】

二つ目は "Software Entropy"。 割れ窓理論 ソフトウェアは物理世界とは隔離されているが、エントロピー増大の法則からは逃げられない。 どんなに素晴らしいソフトウェアであっても時間と共に朽ちていく。こういう状況を錆びに例えて "Software Rot" という…

The Cat Ate My Source Code【The Pragmatic Programmer】

明けましておめでとうございます。 2017年もすでに10日ほど経過してますが…。 一年半くらい書いてきた Effective Java シリーズが終わってしまって、イマイチ継続的にブログを書く感じにならない。 やっぱり、何かをシリーズ化してノルマにすることがブログ…

見積もりのずれ

最近、見積もりをしてから仕事に取り掛かるようにしている。プロのソフトウェアエンジニアとして見積もり能力は重要だと思う(たぶん)。「それ、簡単にできますよ(どやぁ」と放言して、できたのは半年後なんてのはプロとはいえない。 ちゃんと見積もって実…

【Effective Java】各項目のまとめ

Effective Java シリーズの各項目の一覧。 第1章:はじめに 第1章:はじめに 第2章:オブジェクトの生成と消滅 項目1:コンストラクタの代わりに static ファクトリーメソッドを検討する 項目2:数多くのコンストラクタパラメータに直面した時にはビル…

『人を動かす』を読んだ

なるべく読んだ本の感想は書いておこう。今までは書いたり書かなかったりだったから。 最近、『人を動かす』を読んだ。 人を動かす 文庫版作者: D・カーネギー,山口博出版社/メーカー: 創元社発売日: 2016/01/26メディア: 文庫この商品を含むブログ (5件) を…

【Effective Java】項目78:シリアライズされたインスタンスの代わりに、シリアライズ・プロキシを検討する

Serializable を実装すると、バグやセキュリティ上の問題が発生する可能性が高くなります。 コンストラクタ以外でインスタンスが生成されるようになるからです。 これらの可能性を大幅に減らす技法が、シリアライズ・プロキシ・パターン(Serialization Prox…

子育てエンジニアの一日(朝)

いつもとは志向を変えて自分の一日について書いてみる。 自分はソフトウェアエンジニア。結婚していて子供がいる。子供は一歳で、奥さんは働いている。いわゆる共働き家庭だ。 そんな人間のある日の一日。 朝 07:00 起床する。子供はまだ寝ている。顔を洗い…

【Effective Java】項目77:インスタンス制御に対しては、readResolve より enum 型を選ぶ

シングルトンのクラスをシリアライズする場合、readResolve メソッドを使ってインスタンス制御するよりも enum 型による実装を選ぶべきです。 readResolve メソッド まず readResolve メソッドについて説明します。 例えば、次のようなシングルトンクラスを…

【Effective Java】項目76:防御的に readObject を書く

ストリームからオブジェクトをデシリアライズする readObject メソッドは実質的に public コンストラクタとして機能します。 そのため、クラスのコンストラクタで検査している正当性や不変式を readObject にも実装する必要があります。 Period クラスの例 …

【Coursera】Learning How To Learn を受講した

ひさしぶりに Coursera を受講した。 Learning How To Learn という講義。 https://www.coursera.org/learn/learning-how-to-learn 脳科学や心理学をもとにした学習のやり方を教えてくれる講義。 具体的には、 毎日少しづつ勉強した方が長期記憶に残りやすい…

【Effective Java】項目75:カスタムシリアライズ形式の使用を検討する(後半)

前回の記事ではデフォルトシリアライズとカスタムシリアライズの概要について説明しました。 hjm333.hatenablog.com 本記事では、カスタムシリアライズ実装の注意事項について説明します。 StringList のカスタムシリアライズ実装を再掲します。 public clas…

【Effective Java】項目75:カスタムシリアライズ形式の使用を検討する(前半)

シリアライズする方法には次の二つの種類があります。 デフォルトシリアライズ形式 カスタムシリアライズ形式 何の考慮もせずにデフォルトシリアライズ形式を用いることは、互換性やパフォーマンスの点で非常に危険です。 なるべくカスタムシリアライズ形式…

【Effective Java】項目74:Serializable を注意して実装する

項目74からはオブジェクトシリアライズ API について説明します オブジェクトをバイト列として符号化することをシリアライズ、バイト列からオブジェクトに復号化することをデシリアライズと呼びます。 シリアライズされたオブジェクトは仮想マシン間やネッ…

【Effective Java】項目73:スレッドグループを避ける

スレッドグループはもはや利用するべきではありません。 スレッドグループのスレッド一覧を取得するための enumerate メソッドは、スレッドを格納する十分な大きさの配列が渡されない場合、勝手に一部のスレッドを無視します。 また、スレッドの数を取得する…

【Effective Java】項目72:スレッドスケジューラに依存しない

プログラムの正しさやパフォーマンスをスレッドスケジューラーの動作に依存させてはいけません。 実行可能なスレッド数はプロセッサの数と比べて非常に大きくならないようにするべきです。 そうしておけば、スレッドスケジューラーがどのようなアルゴリズム…

【Effective Java】項目71:遅延初期化を注意して使用する

遅延初期化(lazy initialization)は、フィールドの値が必要になるまで初期化を遅らせる手法です。 static フィールドとインスタンスフィールドの両方に利用できます。 まず、第一に、通常は遅延初期化を使うべきではありません。 初期化を遅らせる仕組みに…

【Effective Java】項目70:スレッド安全性を文書化する

開発者は、クラスがマルチスレッド環境で利用された場合にどのように振る舞うかを文書化しなければなりません。 マルチスレッド環境における振る舞いを文書化しない場合、クラスの利用者は十分な同期を行わない(項目66)かもしれませんし、逆に過度な同期…

【Effective Java】項目69:wait と notify よりコンカレンシーユティリティを選ぶ(後半)

固有のロック Java は相互排他ロックを言語固有の機能として持っています。 このロックを利用するためには synchronzied ブロックを使います。 固有のロックは次のような仕組みで動作します。 synchronized ブロックに入る時、スレッドは指定されたオブジェ…

自分を使い切る

元陸上選手の為末さんがこんなことを書いていた。 http://tamesue.jp/blog/archives/think/20160924 幸福というのは自分はどこまでいったかというよりも、自分という存在をどこまで使い切れたか、能力を引き出し切れたかによるのではないかと思うようになっ…

【Effective Java】項目69:wait と notify よりコンカレンシーユティリティを選ぶ(前半)

Java のスレッド操作 API として Object.wait() と Object.notify() があります。 しかし、Java 1.5 からはより高いレベルのユティリティが導入されたので wait() と notify() は使うべきではありません。 追加されたのは java.util.concurrent ユティリティ…

【Effective Java】項目68:スレッドよりエグゼキューターとタスクを選ぶ

Java 1.5 から、エグゼキューターフレームワークが利用できるようになりました。 このフレームワークを使うと、スレッドで実行するためのワークキューを簡単に作成することができます。 // スレッドで実行するためのエグゼキューターサービスの生成 Executor…

【Effective Java】項目67:過剰な同期は避ける

前回の記事では、同期が不十分な場合にはマルチスレッド環境において予期しないエラーが発生する可能性を説明しました。 hjm333.hatenablog.com hjm333.hatenablog.com 今回は前回とは逆の視点です。 過剰に同期することによって発生する問題について取り上…

Java の同期化とは何か(2)(【EffectiveJava】項目66:共有された可変データへのアクセスを同期する-後半-)

前回の記事では Java の同期化(synchronized)について説明してきました。 hjm333.hatenablog.com 今回の記事では「volatile」と「同期化が必要ない場合」について説明します。 volatile Java の同期化(synchronized)は次の性質を保証するものでした。 ア…

Java の同期化とは何か(1)(【EffectiveJava】項目66:共有された可変データへのアクセスを同期する-前半-)

複数のスレッドで可変データを共有する場合にはそれぞれのスレッドを同期化(synchronized)する必要があります。 Java の同期化は次の二つの性質を保証します。 アトミック性(処理の排他制御) メモリの可視性 アトミック性 異なるスレッドが共通のデータ…

【Effective Java】項目65:例外を無視しない

空の catch ブロックを使って例外を無視してはいけません。 // 空の catch ブロック try { ... } catch (Exception e) { } 例外を無視するとエラーがあるという事実が隠蔽されてしまいます。 それによって、他の場所で別の形でエラーが再現する可能性もあり…

【Effective Java】項目64:エラーアトミック性につとめる

オブジェクトのメソッドが例外をスローしたあとは、そのメソッドを呼び出す前の状態になっているべきです。 この性質を「エラーアトミックである」といいます。 「エラーアトミック」を達成する方法はいくつかあります。 不変オブジェクト エラーアトミック…

【Effective Java】項目63:詳細メッセージにエラー記録情報を含める

システムがキャッチされない例外で終了すると次の情報が出力されます。 スタックトレース 例外の文字列表現 例外の詳細メッセージ 最後の「例外の詳細メッセージ」はエラーの原因を調査するための唯一の手がかりであることが多いです。 そのため、例外の詳細…

Productivity Hack 2

朝一に1日のタスクリストを作るのではなく、お昼にその日の午後と次の日の午前のタスクリストを作ることで Productivity を改善しましたよ、というお話。 (僕が今使ってる Productivity 系の話は次の記事からどうぞ。) hjm333.hatenablog.com 詳細 『エン…

【Effective Java】項目62:各メソッドがスローするすべての例外を文書化する

チェックされる例外は個別に宣言するべきです。 そして、それぞれの例外の発生条件を Javadoc の @throws に必ず文書化するべきです。 throws Exception や throws Throwable というように、複数の例外をまとめて throws 宣言してはいけません。 扱うべき例…

【Effective Java】項目61:抽象概念に適した例外をスローする

例外翻訳 メソッドの内部で発生した下位レイヤの例外は、外側に伝播させないほうがいい場合があります。 下位レイヤで発生した例外をそのままスローすると、利用者が混乱したり API を実装の詳細で汚染する場合があります。 そのレイヤの概念と合わない例外…

【Effective Java】項目60:標準例外を使用する

Java ではほとんどの場面で必要となる基本的な例外が標準ライブラリに含まれています。 すでに用意されている標準の例外を再利用することには次のような利点があります。 コードを確立されている慣例と一致させることができる 見慣れた例外によってコードの…

【Effective Java】項目59:チェックされる例外を不必要に使用するのを避ける

チェックされる例外はプログラマに例外の処理を強制させることができるので、プログラムの信頼性を大きく向上させることができます。 ただし、これを過剰に利用すると API が使いにくいものになってしまいます。 次の条件がすべて満たされる場合のみ、チェッ…

【Effective Java】項目58:回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する

例外の種類 Java には次のような種類の例外があります。 チェックされる例外(checked exception) チェックされない例外(unchecked exception) 実行時例外(runtime exception) エラー(error) チェックされる例外 チェックされる例外がスローされると…

『CODE COMPLETE (上)』を読んで

CODE COMPLETE 上巻を読み終えた。 Code Complete 第2版 上 完全なプログラミングを目指して作者: スティーブマコネル出版社/メーカー: 日経BP社発売日: 2014/04/02メディア: Kindle版この商品を含むブログ (12件) を見る 平日のお昼休みに10ページずつ読ん…

【Effective Java】項目57:例外的状態にだけ例外を使用する

例外は例外的な状況に対してのみ利用するべきです。 正常なパスで例外を利用するべきではありません。 よいパフォーマンスを得ようとして、次のようなコードを書く人達がいます。 try { int i = 0; while (true) range[i++].climb(); } catch (ArrayIndexOut…

【Effective Java】項目56:一般的に受け入れられている命名規約を守る

Java には命名規約(naming convention)があります。 命名規約は2種類に分類されていて、活字的(typographical)と文法的(grammatical)に分けられています。 活字的命名規約はパッケージ、クラス、インタフェース、メソッド、フィールド、型変数を扱っ…