話題の新刊、[プリンシプル オブ プログラミング]を、さっそく読みました。
サブタイトルは 3年目までに身につけたい一生役立つ101の原理原則 です。
ソフトウェアエンジニアリングの「正道」を知り、「良いコード」を書けるエンジニアに成長しましょうというものですね。
ソフトウェアエンジニアリングに有効な情報がぎっしり詰まっており、「自分も3年目くらいまでに読んでおきたかったわー」「そしたら もっと近道できたわー 」というのが率直な感想です。
良いコードを書く
プリンシプルとは
プリンシプルとは、プログラミングの指針となる「前提」「原則」「思想」「習慣」「視点」「手法」「法則」のことです。これらは、歴史の審査を受けて生き残った、よいプログラミングのためのエッセンス(「普遍的」「定説的」「本質的」な知識)です。
P.4 まえがき
プログラマの壁
プログラミングを勉強するにあたって、大きな壁がいくつかあると思います。
初心者の壁
- 意味不明の英語がたくさん出力される
- どのようにプログラムを組み立てていけばよいのか
- なぜ期待通りの結果が得られないのか
- バグばかりでまともに動かない
- そもそも、単語の意味が分からない
入門したてのプログラマはこんなものだと思います。
「プログラミングはできる、できないが両極端」とよく言われます。
例えば、「とりあえずif文で組み立てたコード」から「クラス化、関数化」を進めて行くためには、根気よく以下を繰り返さなくてはなりません。
- コンテクストを整理して前提条件を整える
- 抽象的に考え、コードを整理する
- デバッグして不具合を取り除く
こういった作業の耐性がないと、簡単に「プログラムわけわかんないからもういいや」となってしまう気がします。
脱初心者の壁
一通りコードを書くことができるようになっても、普通の人は業務を1年を経験してもまだまだ失敗も多いですし、まともな設計も難しい思います。
また、ある程度業務を経験して、コードの開発も保守も経験すると、初心者とは違った悩みが出てきます。
例えば、、、
- もっとコードを見やすくしたい
- 動いているコードにうかつに手を出すのが難しい
- 機能追加が難しく、書き直しになってしまう
- 機能を追加すると、関係ないところでバグが出る
本書は、こういった悩みに解決方法を示す情報を提示しています。
そう、情報です。
筆者の指摘通り、本書は「具体的なテクニックやコード例」が掲載されているのではなく、「 抽象度が高い情報 」を取り扱っています。
そのため、実務経験1年を過ぎたあたりから、実感、活用できる内容ではないと思います。
「自分自身」の壁
エンジニアは「 一生勉強 」です。
「答えを見て満足」せずに、「なぜその答えが導き出せるか」を突き詰めていくと、それが本人の血肉になると思っています。
(まるで小学校の先生みたいなこと言っていますね。)
自分で勉強する姿勢
プログラマとして成長しなければならない、成長したい、とその思いは強いけれども、その方法・指針が分からないのです。このような状況にある方は、たくさんおられるのではないかと思います。 かくいう私がその一人でした。この悩みを解決してもらうための描いたのが、本書になります。
P.3 まえがき
プログラムを勉強する、良いコードを書く知見は、環境によって影響されやすいものです。
「どのような先輩、どのような環境 勉強してきたか」は、「その人のスキル、思想」に影響してしまうものです。
十分な技術研修がないことも多々ありますし、教育担当者のスキルレベルが十分ではないということもあるでしょう。
良くありますが、「 背中を見て覚えろ 」
(つまり出来上がったコードを読んで推測しろ)
という教育は、指導者の怠慢です。
これは誰も幸せにしませんし、それで「活躍するエンジニアに成長」させることは困難でしょう。
そして、そもそもが「先輩エンジニア」だって何でも知っているわけでもないですよねー。
自分のキャリアは自分で設計するべきです。
「社内でデキるといわれる」とか、「先輩が頼りにならない」と嘆くよりは、ドンドン良い書籍を読んでドンドンコードを書けばいいと思います。
[プリンシプル オブ プログラミング]は、業界で有用な情報が詰まっているおり、エンジニアの気持ち、成長をサポートしてくれる内容になっています。
本書の内容
第1章 前提 プログラミングの変わらぬ真実
以下の3つが紹介されています。
- プログラミングに銀の弾丸はない
- コードは設計書である
- コードは必ず変更される
1つ目が銀の弾丸はない
であり、ここに筆者のメッセージがあると感じずにはいられませんでした。
第2章 原則 プログラミングのガイドライン
多くの場合に共通に適用されるべき、プログラミングにおける基本的な「きまりごと」に関するプリンシプルが紹介されています。
- KISS
- DRY
- YAGNI
- 名前重要
など。
「コードはシンプル」「繰り返しを排除しよう」といったことを説いています。
単語を知り、エンジニア同士で共通認識を持つことで「コードの良さ」は加速します。
第3章 思想 プログラミングのイデオロギー
プログラミングの「思想」に関するプリンシプルが紹介されています。
- プログラミングセオリー
- アーキテクチャ
- 7つの設計原理
- UNIX思想、UNIX哲学
など。
この章が大きなウェイトを占めています。
具体的に「カプセル化」や「関心の分離」といった設計、実装に関する知見が多く紹介されています。
今私に刺さったのはテスト容易性
です。
これは大切です。
2,000行もあるコードはテストできません。
第4章 視点 プログラマの観る角度
改善しやすいコード、息の長いコードにするための「視点」「見方」とするためのプログラミングの「視点」「見方」に関するプリンシプルが紹介されています。
- 凝集度
- 結合度
- 技術的負債
など。
特にコードの臭い
や技術的負債
について、早い段階から学習、意識しておくことは「良いコード」「優れたエンジニア」には大切ですね。
第5章 習慣 プログラマのルーティーン
プログラミングの「習慣」に関するプリンシプルがを紹介されています。
- プログラマーの三大美徳
- ボーイスカウトの規則
- エゴレスプログラミング
など。
思考のルーチンですね。
三大美徳「怠慢」「短気」「傲慢」はデキるエンジニアとなるために必要な視点でしょう。
また昨今、一人でコードを書くことは少なく、チームでプログラミングをすることがほとんどです。
ボーイスカウトの規則
やエゴレスプログラミング
を知り、「チームメイトを思ってプログラミング」することも大切ですね。
大抵「他者のためを思って書いたコード」は、自分の役に立ちます。
第6章 手法 プログラマの道具箱
プログラミングの「手法」「技法」に関するプリンシプルが紹介されています。
- 曳光弾
- 防御的プログラミング
- コンテキスト
など。
経験を積んでいくうちに、誰でも次の経験があると思います。
- 「ケース漏れ」が発生して、品質が悪くなる
- 「要件ズレ」が発生して、ユーザーの思いとは乖離した、役に立たないソフトウェアができてしまう
このような事態に陥ることを回避するための手法を紹介しています。
第7章 法則 プログラミングのアンチパターン
アンチパターンに関するプリンシプルが紹介されています。
- ブルックスの法則
- エントロピーの法則
- 車輪の再発明
など。
コードは自然に腐る エントロピーの法則、本当の問題にたどり着かない ヤクの毛刈りなど、ソフトウェア開発において陥りやすい「罠」「経験則」の紹介です。
この章が一番面白いと感じてしまうのは私だけでしょうか。
おわりに
IT界隈の技術はあっという間に陳腐化してしまいますが、広義のプログラミングスキル
は、「 一度身に着ければそのあと長期間活用できる 」ものが数多く存在する。
私もITエンジニアの一人として感じてきたことです。
そのような「賞味期限の長いスキルを身に着けることによって、もっと活躍できるエンジニアを増やしたい」という筆者の思いには大変共感できますし、実際にその理想に適した良い書籍に仕上がっていると思います。
これは後輩エンジニアに買って配りたい良書です。
著者のブログ
Strategic Choice
[著書]書籍「プリンシプル オブ プログラミング」を執筆しました
http:// d.hatena.ne.jp/asakichy/20160302/1456925809
現在は非公開