ちゃんなるぶろぐ

社会人1年生が、日々の学びをアウトプット〜読書・遊び・プログラミング〜

5分でわかる!「プログラマが知るべき97のこと」その③②

読み終えるまで約5分

 

 

どうも、ちゃんなるです! 

今日も”デキる”プログラマになるべく勉強していきましょう!

 

今回は、次の書籍の一部を要約します。

プログラマが知るべき97のこと』

 

下の記事の続編です↓↓

chan-naru.hatenablog.com

今回選択した3+1つのテーマ

本書はタイトル通り97のことについて書かれています。

今回は、94~97番目の項目についてまとめます。

  1. リンカは魔法のプログラムではない(No. 94)
  2. ペアプログラミングと「フロー」(No. 95)
  3. テストは正確に、具体的に(No. 96)
  4. ステートに注目する(No. 97)
①リンカは魔法のプログラムではない

このテーマで述べられていたことは、

「リンカは決められた単純作業をしているだけ。決して不思議なものではない!」

ということです。

 

以下、要約です。

コンパイルが必要な言語において、ソースコードを静的にリンクされた実行ファイルに変換するプロセスがあります。

驚くことに、このプロセスについて理解できてないプログラマが多いのです。

下記のような認識をしてはいませんか?

  1. ソースコードを編集する
  2. コンパイルすると、オブジェクトファイルができる
  3. なにやら不思議な処理が行われる
  4. 実行ファイルができる

ステップ3で行われるのはリンクです。

『リンカ』がこれを担います。

 

『リンカ』の仕事は、オブジェクトファイルのコードセクション、データセクションを連結し、定義されているシンボルと参照を接続し、ライブラリから未解決シンボルを抽出し、実行ファイルを書き出す、以上です。

ペアプログラミングと「フロー」

このテーマで述べられていたことは、

ペアプログラミングは「フロー」状態を作るのに役立つ!」

ということです。

 

以下、要約です。

何かに完全に没頭してる時、すなわちフロー状態は素晴らしい時間です。

しかしフロー状態は壊れやすく、例えば誰かに話しかけられたり電話がかかってきたりして、それに返事をすればすぐに集中力が切れて終わります。

 

実は、このフロー状態の維持には、ペアプログラミングが非常に役立ちます。

(自分より経験が浅い人と組む場合は忍耐強く接すること、自分より経験が深い人と組む場合は気後れすることなく接することが大事)

それは下記の理由からです。

  • 予期せぬ事態の影響を最小限に抑えれるペアプログラミングによってチームで知識やタスクを共有することで、滞りなく引き継ぎができます。もし急に誰かが欠けることになっても大丈夫です。
  • 問題解決が容易:詰まった時にすぐにその場で解決できる可能性があります。
  • 統合がスムーズ:コーディングにおいて、他人の書いたコードを呼び出すことがよく起きます。この時、他人のコードがわかりにくいと思った場合は、パートナーと相談してネーミング、ドキュメント、テストなどの改善を図ることができます。
  • 割り込みの影響を緩和できる:話しかけられたりメール、電話、ミーティングなどによって作業が中断することがあります。しかし、ペアに作業を一時的に引き継ぐことができ、再度合流することで滞りなく作業を再開できる可能性があります。
  • 新人が早くプロジェクトに馴染む:新たなメンバーがチームメンバーとソースコードになれることができます。

フロー状態は生産性を高めますが、維持が困難です。

いかにフロー状態に入るか、またそれを維持するか、あらゆる手段を講じましょう!

③テストは正確に、具体的に

このテーマで述べられていたことは、

ユニットテスト時の判定条件は、ただ正確なだけではなく、それに加えて誤解の余地のないものにするべき。」

ということです。

 

以下、要約です。

ユニットテストにおいて、コードの動きが本来の要求に合ってるかを確認することが大切です。

しかし、そのためのテストの条件設定に漏れがある場合が多いです。

 

例えば、ソート処理のコードをテストする場合、処理が正しい条件をどうやって表現しますか?

「処理の以前と以後で、シーケンスの長さが同じになっていること。」と言う人もいるでしょう。

 

下記のようなシーケンスがあるとします。

3, 1, 4, 1, 5, 9

ソートした結果、仮に

3, 3, 3, 3, 3, 3

という結果が得られたとしましょう。

もし条件が「処理の以前と以後で、シーケンスの長さが同じになっていること。」であれば、この結果でも条件を満たしてしまいます。

正しいとみなす条件は先のものに加え、「シーケンスが、ソート前と同じ値で構成されている」も必要でしょう。

 

「空の配列に項目を1つ追加する」処理のテスト条件を、ただ単に「配列が空になっていない」と表現しては不十分です。

「配列には項目が1つあり、その値は追加した値と同値である」が正しい条件です。

 

「テーブルに1行追加する」処理の場合は、「処理の以後、テーブルが1行分大きくなる」だけでは不十分で、「増えた行のキーを用いて増やした行を取得できる」条件も追加すべきです。

 

テストの条件は、ただ動作を正確に記述しただけでは不十分であり、誤解のないように設定するべきです。

④ステートに注目する

このテーマで述べられていたことは、

「バグのないプログラムを作る方法の1つとして、ステートを厳密に定めよう。」

ということです。

 

以下、要約です。

プログラマの中に、ステートを厳密に扱わない、という人がいます。

これは問題です。

例えば、あるネットショップがあり、そのショップのOrderクラスに次のようなメソッドがあるとします。

public boolean isComplete() {

    return isPaid() && hasShipped();

}

 

「これでいいじゃないか。」

と思ったあなたは、ステートを意識できていません。

決済処理が終わる前に商品を発送することなどあり得ないからです。

isPaid()trueにならない限り、hasShipped()trueにならないのです。

キャンセルや払い戻しを考慮すると、さらにステート管理が複雑になるでしょう。

上の例の場合、注文のステートは次の3つに分かれます。

  1. 進行中:注文の追加、削除ができず、商品の発送もできない
  2. 決済済み:注文の追加、削除はできないが、商品の発送は可能
  3. 発送済み:注文処理が全て完了。変更は不可。

 

ステートは非常に重要です。

何か操作をしようとすれば、今どのステートにいるのかを確認する必要があります。

その時々のステートによってできる操作とできない操作があるからです。

常にステートに合った操作をし、オブジェクトを保護するのです。

ステートが不適切になる時があるなら、それはバグです。

処理を中断しなければオブジェクトが壊れてしまいます。

 

ステートを意識しましょう!

まとめ

ソースコードと翻訳された機械語を適切に結びつけて実行できるようにするのが『リンカ』です!

ペアプログラミングはメリットが多く、チーム全体として『フロー状態』(集中して作業に取り組める状態)になることができる!

③テストの条件は、ただ正確に動作を記述しただけでは不十分。しっかり抜け漏れなくテストできるように条件設定しよう。

ステートの管理を徹底すべし。

 

*より深く知りたい方は、ぜひ本書を手にとってみてください!

書籍情報

プログラマが知るべき97のこと [ ケブリン・ヘニー ]

価格:2,090円
(2021/5/13 11:12時点)
感想(1件)

【中古】 プログラマが知るべき97のこと /ケブリンヘニー【編】,和田卓人【監修】,夏目大【訳】 【中古】afb

価格:825円
(2021/5/13 11:12時点)
感想(0件)

【書籍名】プログラマが知るべき97のこと

【著者名】ケブリン・へニー、夏目大(訳)

【出版社】オーム社

【出版日】2010年12月

【ページ数】243ページ