書籍
書籍
犯罪捜査技術を活用したソフトウェア開発手法 フォレンジックアプローチによるソースコード分析
★★★★★
★★★★★
0.0

在庫状況 について

・各種前払い決済は、お支払い確認後の発送となります(Q&A)

商品の情報

フォーマット

書籍

構成数

1

国内/輸入

国内

パッケージ仕様

-

発売日

2024年09月27日

規格品番

-

レーベル

ISBN

9784798071756

版型

B5変形

ページ数

344

商品の説明

「切り裂きジャック(Jack the Ripper)」とプログラムのソースコードには、実は共通点がたくさんあります。本書では、科学的犯罪捜査の手法を活用し、犯罪の地理的プロファイルを使ってコミットログからコードベースを視覚化し、開発のホットスポット(不具合が発生している可能性が高いところ)を見つけ、技術的負債に優先順位を付け、隠れた依存関係を明らかにします。それにより、リファクタリングの方向性を評価したり、チームがソフトウェア アーキテクチャにどのように影響するかを理解したりといった戦略を立てることが可能になります。また、これらの分析や戦略は、プログラミング言語、あるいは、コードベースの規模を問いません。
本書は、大きく3つの部に分かれています。「第1部 理解しにくいコードを特定する」では、ソフトウェアのソースコードを犯罪現場のように分析し、問題点を特定・解決することで、よりよいソフトウェアを開発する方法論を紹介します。「第2部 支援的なソフトウェアアーキテクチャの構築」では、ソースコードの特定の問題だけでなく、システム全体を俯瞰し、設計と実装の整合性を検証する方法を解説します。ソースコードの履歴を分析することで、開発者の意図やシステムの進化を理解し、リファクタリングやモダナイゼーションに役立つ情報を引き出します。「第3部 コードの社会的側面」では、チームの組織化とソフトウェアアーキテクチャのミスマッチが、コードの品質低下やコミュニケーション問題を引き起こすことを解説します。社会的バイアスやチームの決定過程がソフトウェア開発に与える影響も分析し、よりよいチーム開発を実現するためのヒントを提供します。また、付録には、各章の章末にある練習問題の解答を掲載しています。

○ 目次
第1部 理解しにくいコードを特定する
第1章 理解するための最適化
第2章 コードを犯罪現場として扱う
第3章 ホットスポットの検出:コードの犯罪者プロファイルを作成する
第4章 ホットスポットの応用:人の視点に立ってコードを可視化する
第5章 劣化している構造を突き止める
第6章 複雑なコードを修正する
第7章 技術的負債のビジネスへの影響を伝える
第2部 支援的なソフトウェアアーキテクチャの構築
第8章 コードは協力的な目撃者
第9章 アーキテクチャのレビュー:データに基づく設計の見直し
第10章 従うべきは美しさ
第11章 隠れたボトルネックを明らかにする:デリバリーと自動化
第3部 コードの社会的側面
第12章 社会的バイアス、グループ、偽の連続殺人犯
第13章 コードベースで組織的な指標を発見する
第14章 技術的な問題が組織的な問題を引き起こすとき
第15章 システムの知識マップを作成する
第16章 未来に向かって
付録
付録A 練習問題の解答
付録B エンクロージャの可視化

作品の情報
メイン
著者
監修
収録内容

構成数 | 1枚

本書に寄せて
謝辞
犯罪現場へようこそ
第2版の日本語版へのまえがき
監訳者まえがき
第1部 理解しにくいコードを特定する
第1章 理解するための最適化
1.1 コーディングがプログラミングのボトルネックではないことを理解する
1.1.1 アジャイルの世界でメンテナンスを理解する
1.2 規模の課題に対処する
1.2.1 デジタルの干し草の山から針を見つける
1.3 複雑さの指標の誘惑にご用心
1.3.1 振る舞いの観点からコードにアプローチする
第2章 コードを犯罪現場として扱う
2.1 速習:犯罪者プロファイリング
2.1.1 犯罪の地理的プロファイリングを学ぶ
2.1.2 犯行パターンを見つける
2.1.3 切り裂きジャックのプロファイル
2.2 地理的犯罪者プロファイリングをコードに応用する
2.2.1 コードを地理的に探索する
2.3 捜索範囲を絞り込む:コードの空間的パターン
2.3.1 変更頻度を捜査の指針にする
2.3.2 複雑さと関連性を組み合わせてホットスポットを特定する
2.3.3 ホットスポットは欠陥の予兆となる
2.4 ホットスポットは確率を反映する
第3章 ホットスポットの検出:コードの犯罪者プロファイルを作成する
3.1 コードの進化を掘り出す
3.1.1 Gitログに慣れる
3.1.2 Code Maat用のGitログを作成する
3.1.3 コミットアクティビティを調べる
3.1.4 影響の分析:コードの変更頻度を計算する
3.2 複雑さの次元を調べる
3.2.1 コードの行数から複雑さを把握する
3.2.2 clocで行数を調べる
3.3 複雑さと作業量が交差する場所
3.4 空間的確率分布によるリファクタリング
3.4.1 技術的負債をすべて返済しなくてもよいのはなぜか
3.5 練習問題
3.5.1 ホットスポット分析をコードベースの一部に限定する
第4章 ホットスポットの応用:人の視点に立ってコードを可視化する
4.1 ソースコードを可視化する
4.1.1 可視化を比較する
4.1.2 コードベースのメンタルモデルを構築する
4.1.3 コードを可視化する
4.1.4 可視化空間を探索する
4.2 言語に依存しない分析:言語の壁を打ち破る
4.3 ホットスポットの温度を確認する
4.3.1 分析の期間を選択する
4.3.2 コミットのスタイルを統一する
4.4 バグがバグを生む
4.4.1 ホットスポットと欠陥の関係
4.5 情報は使ってこそ価値がある
4.6 練習問題
4.6.1 言語に依存しない分析を試してみる
4.6.2 Vue.js:もう1つの選択肢
4.6.3 Kubernetesの技術的負債を特定する
第5章 劣化している構造を突き止める
5.1 コードの形状から複雑さの傾向を判断する
5.1.1 複雑さをひと目で判断する
5.2 コードのネガティブスペースを調べる
5.2.1 複雑さに関するホワイトスペース分析
5.3 絶対値よりも傾向を優先する
5.3.1 ある範囲のリビジョンを分析する
5.3.2 傾向を突き止める
5.3.3 複雑さの傾向を可視化する
5.4 成長のパターンを評価する
5.4.1 複雑なコードから学ぶ
5.4.2 スタイルの変化に注意する
5.4.3 複雑さを理解する
5.5 練習問題
5.5.1 Kubernetesの主な容疑者を調べる
5.5.2 傾向をコードの複雑さのカナリアとして使う
第6章 複雑なコードを修正する
6.1 コードを通して脳を科学する
6.1.1 コードを脳に合わせて調整する
6.1.2 凝集性を考慮した設計
6.1.3 関数名に基づいてホットスポットをリファクタリングする
6.1.4 形式分析を使って凝集性を計測する
6.1.5 変更を切り離す設計
6.2 ワーキングメモリに負担をかける入れ子のロジックを突き止める
6.2.1 でこぼこ道には近寄らない
6.3 複雑なコードのリファクタリング:シンプルな手順
6.3.1 不適切な名前を見分ける
6.3.2 指標ではなく脳に合わせて最適化する
6.4 オブジェクト指向から逸脱しない
6.4.1 プリミティブ型に執着しない
6.4.2 デメテルの法則に従う
6.5 思考ツールとして抽象化を使う
6.6 練習問題
6.6.1 ハリウッドからの電話
6.6.2 シンプルなボタンを単純化する
第7章 技術的負債のビジネスへの影響を伝える
7.1 技術的負債のコストと結果を知る
7.1.1 持続可能なソリューションよりも短期的な利益が優先される理由
7.2 作業の半分に2倍の時間がかかる理由
7.2.1 結果1:機能を2倍の速さで実装できる
7.2.2 結果2:機能の実装に桁違いに時間がかかることがある
7.2.3 結果3:Redコード<...
    • 1.
      [書籍]
カスタマーズボイス
    評価する:
ニュース & 記事
還元ポイント
33pt
販売価格(税込)
¥ 3,630
販売中
在庫わずか
発送までの目安:当日~翌日
cartIcon カートに入れる

欲しい物リストに追加

'; html += '
'; html += '
' + value.wantlist_name + '
'; if (value.public_tp_yn == "y") { html += '
公開
'; } else { html += '
非公開
' } html += '
'; html += '
'; html += ''; }) // 入荷通知 if (arrivalNotice == 0) $("#arrivalNotice").hide(); else $("#arrivalNotice").show(); InfoLog("欲しい物リストポップアップ表示!"); $("#WantlistListList").html(html); $("#AddWantlistModal").modal({ showClose: false }); } } else { InfoLog("欲しい物リストが存在しないので1件新規作成する。"); MakeNewWantlistInner(); } }).catch(function (error) { // handle error WarnLog("欲しい物リスト一覧取得処理失敗。 " + error); }).finally(function () { // always executed InfoLog("欲しい物リスト一覧取得処理 END"); DisplayWantlistListFlg = false; }); }; var AddWantlistDetailProcesing = false; function AddWantlistDetail(id, flg, itemId, price) { InfoLog("欲しい物リスト商品追加処理 START。 欲しい物ID = " + id + ", バッジの表示フラグ = " + flg); InfoLog("商品ID = " + itemId + ", 価格 = " + price); if (!AddWantlistDetailProcesing) { AddWantlistDetailProcesing = true; var token = $('input[name="__RequestVerificationToken"]').val(); const params = new FormData(); params.append('__RequestVerificationToken', token); params.append('wantlistId', id); if (itemId == null) { params.append('itemId', 6424758); } else { params.append('itemId', itemId); } if (price == null) { params.append('itemPrice', 3630); } else { params.append('itemPrice', price); } if ($('#checkArrivalNotice').prop('checked')) { params.append('arrivalNotice', 'y'); } else { params.append('arrivalNotice', 'n'); } axios.post('/ec/Wantlist/AddWantlistDetail', params, { withCredentials: true, timeout: 20000 }).then(function (response) { if (response.data == "OK") { InfoLog("欲しい物リスト商品追加、成功"); $("#WantlistListAddDone_" + id).show(); setTimeout(function () { $("#WantlistListAddDone_" + id).hide(); }, 3000); if ("iteminfo" == "iteminfo") { InfoLog("欲しい物リスト追加、バッジ更新"); var count = Number($("#WantlistAddBtn3").attr("data-badge")); if (isNaN(count)) { count = 0; } count++; $("#WantlistAddBtn3").attr("data-badge", count); } } else if (response.data == "DuplicationError") { WarnLog("欲しい物リスト商品追加、登録済エラー"); $("#PopupAlertW").html("登録済の商品です。"); $("#PopupAlertW").show(); $("#ItemInfoWantlistDuplicAlert").show(); setTimeout(function () { $("#PopupAlertW").hide(); $("#ItemInfoWantlistDuplicAlert").hide(); }, 2500); } else { $("#PopupAlertW").html("商品追加時にエラーが発生しました。"); $("#PopupAlertW").show(); setTimeout(function () { $("#PopupAlertW").hide(); }, 2500); } }).catch(function (error) { // handle error WarnLog("欲しい物リスト商品追加処理失敗。 " + error); $("#PopupAlertW").html("商品追加時にエラーが発生しました。"); $("#PopupAlertW").show(); setTimeout(function () { $("#PopupAlertW").hide(); }, 2500); return false; }).finally(function () { // always executed InfoLog("欲しい物リスト商品追加処理 END"); AddWantlistDetailProcesing = false; }); } }; var AddWantlistProcesing = false; function MakeNewWantlist() { InfoLog("欲しい物リスト追加処理 START"); $("#InputNewWantlistName").val(""); $('#WantlistNameInput').modal({ closeExisting: false, showClose: false }); InfoLog("欲しい物リスト追加処理 END"); }; function MakeNewWantlistInner(){ InfoLog("欲しい物リスト追加処理 「実」 START"); if (!AddWantlistProcesing) { AddWantlistProcesing = true; var token = $('input[name="__RequestVerificationToken"]').val(); const params = new FormData(); params.append('__RequestVerificationToken', token); params.append('newWantlistName', $("#InputNewWantlistName").val()); axios.post('/ec/Wantlist/AddWantlist', params, { withCredentials: true, timeout: 20000 }).then(function (response) { InfoLog("欲しい物リスト商品追加、成功。 欲しい物リストを再描画します。"); DisplayWantlistList(); }).catch(function (error) { // handle error WarnLog("欲しい物リスト追加処理失敗。 " + error); $("#PopupAlertW").html("欲しい物リスト追加時にエラーが発生しました。"); $("#PopupAlertW").show(); setTimeout(function () { $("#PopupAlertW").hide(); }, 2500); }).finally(function () { // always executed InfoLog("欲しい物リスト追加処理 「実」 END"); AddWantlistProcesing = false; }); } };

コレクションに追加

'; html += '
'; html += '
' + value.collection_name + '
'; if (value.public_tp_yn == "y") { html += '
公開
'; } else { html += '
非公開
' } html += '
'; html += '
'; html += ''; }) InfoLog("コレクションポップアップ表示!"); $("#CollectionListList").html(html); $("#AddCollectionModal").modal({ showClose: false }); if ("iteminfo" == "wantlist") { $('#AddCollectionModal').on($.modal.CLOSE, function (event, modal) { onCloseCollection(); }); } else if ("iteminfo" == "orderdetail") { $('#AddCollectionModal').on($.modal.CLOSE, function (event, modal) { $('.canselExit').find('.blueTxt').click(); }); } } } else { InfoLog("欲しい物リストが存在しないので1件新規作成"); MakeNewCollectionInner(); } }).catch(function (error) { // handle error WarnLog("コレクションリスト一覧取得処理失敗。 " + error); }).finally(function () { // always executed InfoLog("コレクションリスト一覧取得処理 END"); }); }; var itemIds = [6424758]; var ColectionListAddFlg = false; function ColectionListAdd(id, flg) { InfoLog("コレクションアイテム追加処理START 商品ID = " + itemIds + ", バッジ表示フラグ = " + flg); var addItems = new Array(); for(let v of itemIds) { addItems.push(v); } if (!ColectionListAddFlg) { ColectionListAddFlg = true; var token = $('input[name="__RequestVerificationToken"]').val(); InfoLog("処理画面 = iteminfo"); $.ajax({ url: '/ec/Collection/AddCollectionItem', type: 'POST', data: { __RequestVerificationToken: token, collectionId: id, itemIds: addItems, isWantlist: "iteminfo" == "wantlist", releaseId : null }, timeout: 20000, traditional: true, xhrFields: { withCredentials: true }, }).done(function (data) { InfoLog("res = " + data); if (data = "OK") { $("#CollectionListAddDone_" + id).show(); setTimeout(function () { $("#CollectionListAddDone_" + id).hide(); }, 3000); if ("iteminfo" == "iteminfo") { var count = Number($("#CollectionAddBtn3").attr("data-badge")); if (isNaN(count)) { count = 0; } count++; $("#CollectionAddBtn3").attr("data-badge", count); if (count > 999) { $("#CollectionAddBtn3").addClass("add-Collection-item999"); } else if (count > 99) { $("#CollectionAddBtn3").addClass("add-Collection-item99"); } } if ("iteminfo" == "wantlist") { deleteWantlistItem(); } } else { WarnLog("コレクション追加処理失敗。 " + data); $("#PopupAlert").html("商品追加時にエラーが発生しました。"); $("#PopupAlert").show(); setTimeout(function () { $("#PopupAlert").hide(); }, 2500); } ColectionListAddFlg = false; }).fail(function (XMLHttpRequest, textStatus, errorThrown) { WarnLog("コレクションアイテム追加処理失敗 " + errorThrown); $("#PopupAlert").html("商品追加時にエラーが発生しました。"); $("#PopupAlert").show(); setTimeout(function () { $("#PopupAlert").hide(); }, 2500); ColectionListAddFlg = false; }) } }; MakeNewCollectionFlg = false; function MakeNewCollection() { InfoLog("コレクション追加処理 START"); $("#InputNewCollectionName").val(""); $('#CollectionNameInput').modal({ closeExisting: false, showClose: false }); InfoLog("コレクション追加処理 END"); }; function MakeNewCollectionInner() { InfoLog("コレクション追加処理 「実」 START"); if (!MakeNewCollectionFlg) { MakeNewCollectionFlg = true; $.modal.close(); InfoLog("新しいコレクションの名前 = " + $("#InputNewCollectionName").val()); var token = $('input[name="__RequestVerificationToken"]').val(); const params = new FormData(); params.append('__RequestVerificationToken', token); params.append('newCollectionName', $("#InputNewCollectionName").val()); axios.post('/ec/Collection/AddCollection', params, { withCredentials: true, timeout: 20000 }).then(function (response) { if (response.data == "OK") { DisplayCollectionList(); InfoLog("コレクションリスト追加成功"); } else { WarnLog("コレクション追加処理失敗。 " + response.data); $("#PopupAlert").html("コレクション追加時にエラーが発生しました。"); $("#PopupAlert").show(); setTimeout(function () { $("#PopupAlertW").hide(); }, 2500); } }).catch(function (error) { // handle error WarnLog("コレクション追加処理失敗。 " + error); $("#PopupAlert").html("コレクション追加時にエラーが発生しました。"); $("#PopupAlert").show(); setTimeout(function () { $("#PopupAlertW").hide(); }, 2500); }).finally(function () { // always executed InfoLog("コレクション追加処理 「実」 END"); MakeNewCollectionFlg = false; }); } };
この商品のコレクション情報を確認する

サマリー/統計情報

欲しい物リスト登録者
0
(公開: 0 人)
コレクション登録者
0
(公開: 0 人)
フラゲ対象の詳細を表示するポップアップ
北海道・鳥取県・島根県・岡山県・広島県・
山口県・四国・九州・沖縄県

フラゲ注文受付期間は地域によって異なります。
お住まいの地域をご確認ください。

北海道・山口県・九州・沖縄県

フラゲ注文受付期間は地域によって異なります。
お住まいの地域をご確認ください。