【レガシーコードからの脱却】を読んでみた
はじめに
今日は、こちらの本を読みましたので簡単に重要なところを残しておきたいと思います。
レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス
- 作者: David Scott Bernstein,吉羽龍太郎,永瀬美穂,原田騎郎,有野雅士
- 出版社/メーカー: オライリージャパン
- 発売日: 2019/09/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
この本は、第1部と第2部に分かれています。特に第2部に焦点を当てて見ていこうと思います。
第1部 : レガシーコードの危機
第2部 : ソフトウェアの寿命を延ばし価値を高める9つのプラクティス
ソフトウェアの寿命を延ばし価値を高める9つのプラクティス
① やり方より先に目的、理由、誰のためかを伝える
実装の詳細の前に、目的や制約を説明するために、やり方の前に、目的、理由、誰のためかを口に出す。どうやって作るかを言わなくて良いので、何を作るかを口に出す。開発者にやり方を発見させ、やり方になってしまっているものは目的で抽象化する。これによって実装の詳細は隠れ、コードはシンプルで、拡張するためのコストも低いものになる。
- ソフトウェアがどう作られるよりも何をすべきかに注目することにより、開発者は自由に最良の実装を発見できる。
- 目的、理由、誰のためかを表現するために、実装の詳細を説明することを捨て、機能を定義するための極めて重要な会話に代えていくことで、開発が発見のプロセスになる
- 効率的に機能を作って、開発に当てる時間を全体の1/3までにする
* 実装を詳細に説明して要求をドキュメント化するのはやめる。機能の目的、理由、誰のためにかを口に出す。そうやって機能を定義する方法を変え、プロダクトオーナーと開発チームとの間で想像的に協調する。
② 小さなミニバッチで作る
小さなミニバッチを作る。そうすれば全てのタスクは短い時間(理想的には4時間)で終わるようになる。タスクが受入基準を満たすようにするか、最低限、観察可能な結果が見えるようにしよう。そうすれば、タスクがシンプルなものになり、見積もるのも、完成させるのも、評価するのも簡単になる。
- 納期がソフトウェア開発プロセスを決定すること
- 自分の時間をもっとコントロールするにはどうしたら良いか
- 小さなタスクほど、見積もりもテストも簡単で、扱いやすいこと
- 機能を観察可能な振る舞いに分割する方法
- タイムボックスで進められるようになったら、スコープボックスを習得すること。スコープボックスとは、タスクを小さくて扱いやすいものに分割すること
* リリースサイクルのリズムがプロセスを制御する。リリース可能なソフトウェアを作る間隔が短ければ短いほど、ソフトウェア開発プロセスは効率上がる。小さく作ることで、タスクは扱いやすくなり、オーバーヘッドが劇的に減る。
③ 継続的に統合する
継続的に統合すること。ストーリーは完了の完了の完了になるまで完了しない。ストーリーを可能なかぎり早く完成させることがゴール。そのためには、健全なプロジェクトの鼓動である自動ビルドが必要。
- コードを書くたびに統合することで、ソフトウェア開発に伴うリスクを軽減
- 統合が苦痛になるため、ウォーターフォールでは統合を延期し、リスクと変更のコストが増大する
- リリース候補の検証を自動化することで、リリース直前の変更にかかるコストを無視できる
- フィードバックサイクルを短くする事で、開発者の行動の結果がすぐに把握できるようにする
- 継続的にデプロイできることの重要性を理解すれば、タスクの自動化方法を探し、機能の相互作用について即座にフィードバックを得るために継続的インテグレーションを活用することになる
* コードを書くたびに統合することで、ソフトウェア開発に伴うリスクが減り、開発者が豊富なフィードバックサイクルが短縮されて、システムがいつもデプロイ可能な状態になる。
④ 協力しあう
質の高いコミュニケーションを作り上げ、知識をグループに広げるために一緒に協力しよう。
- 質の高いコミュニケーションとチームへの知識拡散のために、適切なテクニックをすぐに使う
- ペアリング、スパイク、スウォーミング、モブなどの様々な協働スキルを使う
- 未知の探究、学習の増幅、知識の伝搬に、協働スキルは役立つ
- コードレビューとレトロスペクティブからフィードバックを受け、フィードバックを活かして行動しよう
- 常にメンターであり、メンティーであれ。自分とチームのスキルを上げていこう
* 私たちの最大のリソースはお互いである。一緒に働くためのテクニックや構成を知っておくと、協働を最大化するのに役立つ。
⑤ 「CLEAN」コードを作る
「CLEAN」なコードを書こう。凝集性があり、疎結合で、カプセル化されており、断定的で、非冗長なコードだ。CLEANコードは高品質なコードだ。
⑥ まずテストを書く
最初にテストを書き、次にテストに合格するのに必要なコードだけ書く。これによって、開発するソフトェアの焦点を絞り、テスト可能にする。テストは安全にリファクタリングするのを助ける。テストコードはプロダクションコードと同じように「CLEAN」に保つ。
- テストファースト開発の方法と、それをする理由
- あまりにも多くのテストを書いたり、実装依存のテストを書いたりすると、テストファーストの開発は簡単に失敗する
- テストはコードのリファクタリングをサポートする必要があり、振る舞いを表す必要なテストだけ記述する
- テストファースト開発はQAに役立つが、QAに変わるものではない
- テストファースト開発は失敗するテストを作成し、合格するのに十分なコードを書くことで機能を作る。そのあと、必要に応じてリファクタリングし、失敗する別のテストを書くことを繰り返す
* テストファースト開発を正しく行えば、開発者が保守可能でテスト可能なコードを作成する助けになる。やり方が良くないと、テスト駆動開発は資産よりも負担になる。
⑦ テストで振る舞いを明示する
生きた仕様を作るには、テストに振る舞いを記述する。開発者がテストファースト開発を行う利点を理解すれば、テストの魅力に取り憑かれ、全ての開発をテストファーストで行うたいと考えるはずだ。
- テストスイートを使用して、振る舞いを記述し確認する方法
- テストを活用することで、目的を明確に説明できるようになるとともに、それらが生きた仕様になること
- ふるまいのテストを書くことで、書くべきテストの種類と数を常時把握できること
⑧ 設計は最後に行う
設計を最後にして、意図を示すプログラミングを行うことで、複雑さを減らし、変更を容易にできる。
- 品質は保証できない。品質は作り出すものだ。品質を検証するのではなく、作り込むことに集中しよう
- 読みやすく理解しやすいコードが、柔軟で、変更しやすい
- 意図を示すプログラミングは観点の凝集につながる。抽象のレベルがそろい、読みやすく、理解しやすくなる
- オブジェクトの生成と利用を分離することで、テスト容易性を改善し、依存性を下げよう
⑨ レガシーコードをリファクタリングする
コードを変更する場合は、必要に応じてレガシーコードをリファクタリングする。
*リファクタリングとそれをするスキルは、レガシーコードをクリーンアップする上で重要だ。既存のレガシーコードを変更する前に、最初にやるべきステップはリファクタリングだ。そして、新しいコードも、レガシーコードにならないようにクリーンアップする。リファクタリングは、既存のコードベースを学ぶための、非常に効率的な方法である。
今後の目標
機械学習をメインに勉強しているM1です。
2021年卒ですが、第1志望の企業から内定をいただき就活終了です。
これから何を勉強しようかなっと今は考えているところです。
今回は、今思っていることを気ままに書いていこうかなと思います。
就活はどのくらいしたか?
ぶっちゃけ1社しか就活をしてない、エコな就活生です。笑
研究は機械学習(画像)をしていて、将来的には機械学習エンジニアかデータサイエンティストあたりの職につきたいなと学部4年あたりの頃から思っていました。今までやってきたこととしては、画像分類(CNN)、セグメンテーション、GAN、異常検知みたいなことはやってきました。幅広くいろんなところに手を出してきた感じです。
それで内定まで至った経緯ですがポイントなるのが以下のことです。
- 奨学生
- 逆求人
- インターン参加
まず、第一志望の企業で奨学生制度があり応募したのが始まりでした。それから逆求人に参加した際にもお会いでき、高い評価をいただきました。8月の中旬からは1ヶ月インターンをさせていただきました。とりあえず、そんな感じです。
就活については、あとでゆっくり書こうかなと思っているので今回はこのぐらいにして本題に入りましょう。
今後勉強すること
- docker
- kubernetes
- AWS & GCP
- Go / Scala
- 統計
- 英語
ざっとこんな感じかなと思います。まずは、優先的にdockerの勉強をしようと思っています。少しは使いこなせますが、ちゃんと勉強したことなかったのでこれを機に勉強して記事にでもまとめたいです。kubernetesについては、知識ゼロです。機械学習のデータ基盤とかのスライドを読んでいる時によく出ていたので気になってました。AWS・GCPは使えて当たり前ですよね(現状、何もわかりません。笑)。あとは、pythonばっかり触っているので違う言語を勉強したいですね。それに統計。私自身、数学大好き人間なので統計は極めたいと思っています。ぶっちゃけコード書くより数学好きなんですよね。最後に、英語。英語はできて当たり前な世の中ですよね。就職したら海外出張とかもあるようなので英語はできるようにしといてと言われました。普段何でかわからないけど、日本人より中国人と話す時間が長いので英語を話せる環境下にいる自分はラッキーだと思います。前までは、TOEICの勉強もしてたけど最近英語に関してはあんまり勉強していなかったので計画的に勉強していこうと思います。
最後に
就活が終わってホットしてます。
あと1年半も大学院生活あるなんて幸せです。
内定もらってから2週間ぐらいボーっとしてたので12月にもなるので切り替えて頑張りたいと思います。
最後まで読んでくださりありがとうございました。
TOEIC 02/14/2019
[1]
職業の occupational
professional
vocational
[2]
異常な exceptional
unusual
singular
[3]
名目上は nominally
in name only
[4]
go get it = go and get it
I'll go get you a tour reservation form.
[5]
have A in stock Aの在庫がある
[6]
pertinent to ~ ~に関すること
pertinent information 関連情報 (relevant information)
share patinent information with
[7]
n. apprentice 見習い (trainee, probationer)
初心者(novice, beginner)
[8]
n. constraint 強制、圧迫
under constraint 強制されて
due to {time/budget} constraints
[9]
run low 残り少ない
run out なくなる
[10]
n. appointment 人に会う約束
n. reservation 場所や空間、施設に対する約束・予約
TOEIC 02/13/2019
[1]
in bulk 大量に
I buy my rice in bulk to save money.
the bulk of 大部分、大半
[2]
n. correspondence 通信、文通、手段、一致すること
take a correspondence course 通信講座を受ける
[3]
switch jobs, job-hop 転職する
job opening, vacancy 仕事の空き
[4]
v. certify 証明する、保証する
adj. certified 資格を持っている
He is a certified doctor.
certified under (認定されている)
certificate 証明書
certification 証明、認定、資格
permit 許可書
permission 許可
[5]
v. qualify (主語の人が)条件を満たす、十分な能力がある
v. disqualify ~を不適格とみなす
unqualified 十分な経験がない
underqualified 十分ではない、下回っている
[6]
v. commence 開始する、始める、学位を受ける
(≒begin, start)
n. commencement 開始、はじめ、卒業式
[7]
n. revenue 収入 (会社)
n. income 収入 (個人)
[8]
understaffed 人手不足
short-staffed 人手不足
[9]
be eligible to do ~する資格がある
be eligible for A Aの資格がある
[10]
contentious 争い好きの、議論を呼び起こす、訟訴の
highly contentious issue 大いに議論のある問題
contentious people 喧嘩好きの人々
contentious language ケンカ言葉
TOEIC 交渉・取引系 単語
【TOEIC】交渉・取引 単語まとめ
n. quotation , estimate 見積もり、見積書
quotation : 最終的な見積もり。quote と省略することある。
estimate : 概算のイメージ
v. specify 明確に説明する、仕様を定める
He specified the reasons for the failure.
n. purchase order 注文書
n. price per unit 単価
n. quantity 数量
n. bargainig 交渉、取引
a bargaining table 交渉のテーブル
n. contact person 交渉担当者、連絡窓口
come to terms 合意に達する
close the deal 取引をまとめる
done deal 完了した取引
: 話がまとまった際に"Done deal.(これで決まりだ)"と使う
adj. tentative 仮の、一時的な
walk away 交渉をやめる
willingness 意志
key interests 主要な利害
land [strike / make] a deal 交渉をまとめる
v. confirm 確認する(間違いのないことまではっきりさせる)
v. check 確認する (ただ、確認しただけ)
*I'm calling to confirm my reservation.
リスニングでありそうな例文ですね
*What is the current situation with the project?
Let me check and get back to you asap.
TOEIC 02/12/2019
【TOEIC】
今日のメモです!
[1]
n. courtesy 礼儀正しさ
adj. courteous 礼儀正しい
adv. courteously 礼儀正しく
[2]
adj. prestigious 名声のある
a prestigious school 有名校
a prestigious university 一流大学
[3]
the following day , the subsequent day その次の日
[4]
v. occupy 占領する
n. occupancy 占有
n. occuoation 職業
occupational 職業上の
No occupancy 空室なし、 a single occupancy room 1人部屋
[5]
dismiss, lay off, discharge, fire 解雇する
(解雇通知)
pink slip
notice of termination
[6]
crucial, essential, pivotal, vital 非常に重要な
[7]
v. culminate 最高点に達する
culminate in ~ 末端が~になる
culminate in a heart attack 心臓発作に至る
n. culmination 最高点、頂上、南中
culmination altitude 南中高度
[8]
company ≒ firm
firm はプロ集団としての性質
law firm, accounting firm, consulting firm,
[9]
adj. immediate 直接の、即座の、すぐ隣の
adv. immediately ≒ instantly ≒ promptly すぐに
[10]
v. undermine 〜の土台を壊す
〜を徐々に弱らせる
undermine a beautiful relationship
+α
stuck in traffic 渋滞にはまって
within walking distance 徒歩圏内
in the event of ~ ~の場合は
keep in mind that ~ ~を念頭におく
take precations 予防策を講じる
TOEIC 02/11/2019
【TOEIC】目指せ900!!
学んだとを10個程度毎日まとめていきたいと思います。
[1]
v. initiate (〜を開始する)
n. initiative (計画、戦略)
n. initial (頭文字)
adv. initially (当初 )
public relations initiative (広告戦略)
[2]
as part of its {initiative} ({xxx}の一環として)
{strategy}
{plan}
{project}
{effort}
[3].
disclose X to 人 ( X を人に明かす)
reveal X to 人
[4].
significantly , considerably , substantially , a lot (かなり)
[5].
duly , properly (適切に)
[6].
in a timely fashion, in a timely manner (迅速に)
[7].
n. property 物体、不動産
adv. properly 適切に
[8].
employee 従業員
employment 仕事
employer 雇用者
[9]
adj. impromptu (準備なしに行われる)
an impromptu meeting 緊急会議
an impromptu speech 即興スピーチ
[10]
advance notice 事前告知
the late notice 遅い告知
on short notice 急な告知
+α
at regular intervals 定期的に
precaution 安全策