カメヲラボ

主にプログラミングとお勉強全般について書いてます

世界で闘うプログラミング力を鍛える本

前著『世界で闘うプログラミング力を鍛える150問』から4年、米国ベストセラーの"Cracking the Coding Interview"の新版(第6版)の邦訳『世界で闘うプログラミング力を鍛える本 〜コーディング面接189問とその解法〜』が完成しました!2月27日発売予定です!!

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

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

発売記念プレゼント問題!

CodeIQから発売記念プレゼント問題を出題しています!(3月7日AM10:00まで)
不正解でも挑戦していただければ抽選対象になりますので、プログラミングに自信のない方も是非チャレンジしてみてください!

超ボリューム!もはや別本!!

第5版と比べ、問題の追加・解法の全体的な修正を行いました。特に計算量に関しては、各問題の解法に計算量に関する記述を追加しただけではなく具体的な例をたくさん含んだ解説や練習問題が追加されています。189問の面接問題にはすべてヒントが与えられ、できるだけ自分の頭を使って取り組むための工夫がされています。
300頁以上を追記し、既存の内容も半分近くを修正した結果、もはや前著とは別の本と言ってもよい程の仕上がりになりました。単にページ数が増えただけではなく、前述の計算量に加え、木・グラフ・探索に関する記述が大幅に増え、プログラミング技術書として非常にバランスが良くなりました。

これは原著の第5版(右)と第6版(左)です。本を開かなくても、そのボリュームの差を感じることができると思います。

スリムボデー

鈍器のような第6版ではありますが、翻訳版は非常にスリムボデーとなっております。

前著(右)と比較して、ほとんど厚みに差がないことがわかると思います。

原著と比較するとよくわかりますね。

競技プログラミングとの違い

1つ注意点としていただきたいのは、本書は競技プログラミング向けの書籍ではないということです。あくまで『採用面接の攻略本』というスタンスであることに注意してください。競技プログラミングの勉強がしたければ、『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』や『プログラミングコンテストチャレンジブック』をお勧めします。

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

採用面接の問題は、議論の『種』としてあいまいな要素が含まれることが多くなっています。また、面接官と対話的に進めることが前提であるため、必ず最初から最適解を答えなければならないというわけでもありません。問題の範囲を自分で(あるいは対話的に)定義し、どのようにアプローチするか、どのように改良するかを説明する能力を養うことが目的です。
競技プログラミングの経験をそれなりにお持ちの場合は、競技プログラミングで必要なスキルと本書の内容との間に、どの程度ギャップがあるのか調べてみるのも面白いかもしれません。たとえば、ダイクストラ法やトポロジカルソートは、本書では『より高度の話題』に分類されており、必ずしも知っている必要はないという位置付けです。

目次

  • I. 面接の流れ
    • 「なぜ?」
    • 問題はどう選ばれるか
    • すべては相対的
    • FAQ:よくある質問
  • II. 面接試験の舞台裏
  • III. 特殊な状況
    • 職歴の長い候補者
    • テスターとSDET
    • プロダクト/プログラム・マネージャ
    • 開発リーダー/マネージャ
    • スタートアップ企業
    • 合併や買収による人材獲得
    • 面接官に向けたアドバイス
  • IV. 面接の前に
    • 良い経験を得る
    • 履歴書の書き方
    • 準備表
  • V. 行動に関する質問
    • 面接準備の表
    • 技術的プロジェクトについて整理する
    • 行動に関する質問への対応
    • 「では、あなた自身のことについて聞かせてください……」
  • VI. ビッグ・オー記法(Big O)
    • 簡単な例
    • 時間計算量
    • 空間計算量
    • 定数を捨てる
    • 影響の少ない項を捨てる
    • 複数パートから成るアルゴリズムの計算時間: 足すべきか掛けるべきか
    • 償却計算量
    • Log N 実行時間
    • 再帰の実行時間
    • 例題と練習
  • VII. 技術的な質問
    • どうやって準備するか
    • 知っておくべきこと
    • 問題攻略ガイド
    • 最適化と解答テクニックその1:BUDをさがそう
    • 最適化と解答テクニックその2:DIYの精神で
    • 最適化と解答テクニックその3: 単純化と一般化
    • 最適化と解答テクニックその4: 初期状態からの積み上げ
    • 最適化と解答テクニックその5: データ構造総当たり
    • BCR
    • 正しくない解答の扱い
    • 問題を以前に聞いたことがあるとき
    • 面接の「最強」言語
    • 良い、きれいなコードとは
    • あきらめないで!
  • VIII. オファーとその後
    • オファーと不採用の取り扱い
    • オファーの評価
    • 交渉
    • 仕事をしていく上で
  • IX. 問題

[データ構造]

    • Chapter 1 | 配列と文字列
    • Chapter 2 | 連結リスト
    • Chapter 3 | スタックとキュー
    • Chapter 4 | 木とグラフ

[考え方とアルゴリズム

    • Chapter 5 | ビット操作
    • Chapter 6 | 数学と論理パズル
    • Chapter 7 | オブジェクト指向設計
    • Chapter 8 | 再帰動的計画法
    • Chapter 9 | スケーラビリティとシステムデザイン
    • Chapter 10 | ソートと探索
    • Chapter 11 | テスト

[知識ベース]

    • Chapter 12 | CとC++
    • Chapter 13 | Java
    • Chapter 14 | データベース
    • Chapter 15 | スレッドとロック

[追加練習問題]

    • Chapter 16 | 中級編
    • Chapter 17 | 上級編
  • X. 解法

[データ構造]

    • Chapter 1 | “ 配列と文字列”の解法
    • Chapter 2 | “ 連結リスト”の解法
    • Chapter 3 | “スタックとキュー”の解法
    • Chapter 4 | “ 木とグラフ”の解法

[考え方とアルゴリズム

    • Chapter 5 | “ビット操作”の解法
    • Chapter 6 | “ 数学と論理パズル”の解法
    • Chapter 7 | “オブジェクト指向設計”の解法
    • Chapter 8 | “ 再帰動的計画法”の解法
    • Chapter 9 | “スケーラビリティととシステムデザイン”の解法
    • Chapter 10 | “ソートと探索”の解法
    • Chapter 11 | “テスト”の解法

[知識ベース]

    • Chapter 12 | “CとC++”の解法
    • Chapter 13 | “Java”の解法
    • Chapter 14 | “データベース”の解法
    • Chapter 15 | “スレッドとロック”の解法

[追加練習問題]

    • Chapter 16 | “中級編”の解法
    • Chapter 17 | “ 上級編”の解法
  • XI. より高度な話題
    • 役に立つ数学
    • トポロジカルソート
    • ダイクストラ
    • ハッシュテーブルの衝突処理
    • ラビン-カープ文字列検索
    • AVL木
    • 赤黒木
    • マップリデュース
    • さらに学びたい人へ
  • XII. コードライブラリ
    • HashMapList
    • TreeNode(二分探索木)
    • LinkedListNode(連結リスト)
    • Trie & TrieNode(トライ木)
  • XIII. ヒント
    • [データ構造]のヒント
    • [考え方とアルゴリズム
    • [知識ベース]のヒント
    • [追加練習問題]のヒント
  • 索引
  • プロフィール

※BUDって何?

目次を見て気になった方もいらっしゃるかもしれませんので、簡単に説明しておきます。BUDとは、

  • Bottlenecks(ボトルネック
  • Unnecessary work(不必要な作業)
  • Duplicated work(重複する作業)

の頭文字で、これらは実行時間を無駄に消費する三大要素です。BUDを探し、修正するということを繰り返しながら、アルゴリズムの最適化を行うと良いですよという文脈で登場します。