【レガシーコードからの脱却】を読んでみた

はじめに

 今日は、こちらの本を読みましたので簡単に重要なところを残しておきたいと思います。

 

レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

 

 この本は、第1部と第2部に分かれています。特に第2部に焦点を当てて見ていこうと思います。

 

第1部 : レガシーコードの危機

第2部 : ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

 

 

ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

 

① やり方より先に目的、理由、誰のためかを伝える

 

実装の詳細の前に、目的や制約を説明するために、やり方の前に、目的、理由、誰のためかを口に出す。どうやって作るかを言わなくて良いので、何を作るかを口に出す。開発者にやり方を発見させ、やり方になってしまっているものは目的で抽象化する。これによって実装の詳細は隠れ、コードはシンプルで、拡張するためのコストも低いものになる。

 

  • ソフトウェアがどう作られるよりも何をすべきかに注目することにより、開発者は自由に最良の実装を発見できる。
  • 目的、理由、誰のためかを表現するために、実装の詳細を説明することを捨て、機能を定義するための極めて重要な会話に代えていくことで、開発が発見のプロセスになる
  • 効率的に機能を作って、開発に当てる時間を全体の1/3までにする

 

* 実装を詳細に説明して要求をドキュメント化するのはやめる。機能の目的、理由、誰のためにかを口に出す。そうやって機能を定義する方法を変え、プロダクトオーナーと開発チームとの間で想像的に協調する。

 

② 小さなミニバッチで作る

 

小さなミニバッチを作る。そうすれば全てのタスクは短い時間(理想的には4時間)で終わるようになる。タスクが受入基準を満たすようにするか、最低限、観察可能な結果が見えるようにしよう。そうすれば、タスクがシンプルなものになり、見積もるのも、完成させるのも、評価するのも簡単になる。

 

  • 納期がソフトウェア開発プロセスを決定すること
  • 自分の時間をもっとコントロールするにはどうしたら良いか
  • 小さなタスクほど、見積もりもテストも簡単で、扱いやすいこと
  • 機能を観察可能な振る舞いに分割する方法
  • タイムボックスで進められるようになったら、スコープボックスを習得すること。スコープボックスとは、タスクを小さくて扱いやすいものに分割すること

 

* リリースサイクルのリズムがプロセスを制御する。リリース可能なソフトウェアを作る間隔が短ければ短いほど、ソフトウェア開発プロセスは効率上がる。小さく作ることで、タスクは扱いやすくなり、オーバーヘッドが劇的に減る。

 

 

③ 継続的に統合する

 

継続的に統合すること。ストーリーは完了の完了の完了になるまで完了しない。ストーリーを可能なかぎり早く完成させることがゴール。そのためには、健全なプロジェクトの鼓動である自動ビルドが必要。

 

  • コードを書くたびに統合することで、ソフトウェア開発に伴うリスクを軽減
  • 統合が苦痛になるため、ウォーターフォールでは統合を延期し、リスクと変更のコストが増大する
  • リリース候補の検証を自動化することで、リリース直前の変更にかかるコストを無視できる
  • フィードバックサイクルを短くする事で、開発者の行動の結果がすぐに把握できるようにする
  • 継続的にデプロイできることの重要性を理解すれば、タスクの自動化方法を探し、機能の相互作用について即座にフィードバックを得るために継続的インテグレーションを活用することになる

* コードを書くたびに統合することで、ソフトウェア開発に伴うリスクが減り、開発者が豊富なフィードバックサイクルが短縮されて、システムがいつもデプロイ可能な状態になる。

 

④ 協力しあう

 

質の高いコミュニケーションを作り上げ、知識をグループに広げるために一緒に協力しよう。

 

  • 質の高いコミュニケーションとチームへの知識拡散のために、適切なテクニックをすぐに使う
  • ペアリング、スパイク、スウォーミング、モブなどの様々な協働スキルを使う
  • 未知の探究、学習の増幅、知識の伝搬に、協働スキルは役立つ
  • コードレビューとレトロスペクティブからフィードバックを受け、フィードバックを活かして行動しよう
  • 常にメンターであり、メンティーであれ。自分とチームのスキルを上げていこう

 

* 私たちの最大のリソースはお互いである。一緒に働くためのテクニックや構成を知っておくと、協働を最大化するのに役立つ。

 

⑤ 「CLEAN」コードを作る

 

「CLEAN」なコードを書こう。凝集性があり、疎結合で、カプセル化されており、断定的で、非冗長なコードだ。CLEANコードは高品質なコードだ。

 

  • 凝集性のあるコードは副作用を減らす
  • 疎結合なコードはテストが容易である
  • カプセル化されたコードは保守の問題を減らす

 

⑥ まずテストを書く

 

最初にテストを書き、次にテストに合格するのに必要なコードだけ書く。これによって、開発するソフトェアの焦点を絞り、テスト可能にする。テストは安全にリファクタリングするのを助ける。テストコードはプロダクションコードと同じように「CLEAN」に保つ。

 

 

* テストファースト開発を正しく行えば、開発者が保守可能でテスト可能なコードを作成する助けになる。やり方が良くないと、テスト駆動開発は資産よりも負担になる。

 

 

⑦ テストで振る舞いを明示する

 

生きた仕様を作るには、テストに振る舞いを記述する。開発者がテストファースト開発を行う利点を理解すれば、テストの魅力に取り憑かれ、全ての開発をテストファーストで行うたいと考えるはずだ。

 

  • テストスイートを使用して、振る舞いを記述し確認する方法
  • テストを活用することで、目的を明確に説明できるようになるとともに、それらが生きた仕様になること
  • ふるまいのテストを書くことで、書くべきテストの種類と数を常時把握できること

⑧ 設計は最後に行う

 

 設計を最後にして、意図を示すプログラミングを行うことで、複雑さを減らし、変更を容易にできる。

 

  • 品質は保証できない。品質は作り出すものだ。品質を検証するのではなく、作り込むことに集中しよう
  • 読みやすく理解しやすいコードが、柔軟で、変更しやすい
  • 意図を示すプログラミングは観点の凝集につながる。抽象のレベルがそろい、読みやすく、理解しやすくなる
  • オブジェクトの生成と利用を分離することで、テスト容易性を改善し、依存性を下げよう

 

⑨ レガシーコードをリファクタリングする

 

 コードを変更する場合は、必要に応じてレガシーコードをリファクタリングする。

 

  • 機能追加の前準備と、実際の機能の追加を切り離すことで、作業が大幅に単純化され、バグ発生リスクが減ること
  • リファクタリングが上手くなれば、クリーンなコードを自然に書き始めるようになる

*リファクタリングとそれをするスキルは、レガシーコードをクリーンアップする上で重要だ。既存のレガシーコードを変更する前に、最初にやるべきステップはリファクタリングだ。そして、新しいコードも、レガシーコードにならないようにクリーンアップする。リファクタリングは、既存のコードベースを学ぶための、非常に効率的な方法である。

 

 

今後の目標

機械学習をメインに勉強しているM1です。

2021年卒ですが、第1志望の企業から内定をいただき就活終了です。

これから何を勉強しようかなっと今は考えているところです。

今回は、今思っていることを気ままに書いていこうかなと思います。

 

 

就活はどのくらいしたか?

 

 

ぶっちゃけ1社しか就活をしてない、エコな就活生です。笑

研究は機械学習(画像)をしていて、将来的には機械学習エンジニアかデータサイエンティストあたりの職につきたいなと学部4年あたりの頃から思っていました。今までやってきたこととしては、画像分類(CNN)、セグメンテーション、GAN、異常検知みたいなことはやってきました。幅広くいろんなところに手を出してきた感じです。

 

 

それで内定まで至った経緯ですがポイントなるのが以下のことです。

まず、第一志望の企業で奨学生制度があり応募したのが始まりでした。それから逆求人に参加した際にもお会いでき、高い評価をいただきました。8月の中旬からは1ヶ月インターンをさせていただきました。とりあえず、そんな感じです。

 

就活については、あとでゆっくり書こうかなと思っているので今回はこのぐらいにして本題に入りましょう。

 

 

今後勉強すること

 

 

  1. docker
  2. kubernetes
  3. AWS & GCP
  4. Go / Scala
  5. 統計
  6. 英語

 

ざっとこんな感じかなと思います。まずは、優先的にdockerの勉強をしようと思っています。少しは使いこなせますが、ちゃんと勉強したことなかったのでこれを機に勉強して記事にでもまとめたいです。kubernetesについては、知識ゼロです。機械学習のデータ基盤とかのスライドを読んでいる時によく出ていたので気になってました。AWSGCPは使えて当たり前ですよね(現状、何もわかりません。笑)。あとは、pythonばっかり触っているので違う言語を勉強したいですね。それに統計。私自身、数学大好き人間なので統計は極めたいと思っています。ぶっちゃけコード書くより数学好きなんですよね。最後に、英語。英語はできて当たり前な世の中ですよね。就職したら海外出張とかもあるようなので英語はできるようにしといてと言われました。普段何でかわからないけど、日本人より中国人と話す時間が長いので英語を話せる環境下にいる自分はラッキーだと思います。前までは、TOEICの勉強もしてたけど最近英語に関してはあんまり勉強していなかったので計画的に勉強していこうと思います。

 

 

最後に

 

就活が終わってホットしてます。

あと1年半も大学院生活あるなんて幸せです。

内定もらってから2週間ぐらいボーっとしてたので12月にもなるので切り替えて頑張りたいと思います。

最後まで読んでくださりありがとうございました。

TOEIC 02/14/2019

TOEIC

 

[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

TOEIC

 

[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   安全策