再読:リファクタリング・ウェットウェア


この記事は,フラー株式会社 Advent Calendar 2021 の 10 日目の記事です。

9日目の記事は @Daiji256 さんによる PokéAPI を使ってポケモン図鑑の Android を作ってみた でした。


私はフラーでフロントエンドエンジニアを担当しているのですが、この業界自体にはそれなりに長く在籍しており、もうすぐ15年という歳月が経とうとしています。
なので2021年のアドベントカレンダーは過去を振り返った記事にしてみたいと思います。

趣向としては、新卒でエンジニアになったころに読んだ本を再度読み直して、今の自分がどのように感じるのかやってみよと思います。
十数年前より幾分か成長を感じることができれば良いのですが...

リファクタリング・ウェットウェア

今回選んだ本は、2009年に日本語版が発売され『達人プログラマー』の共同著者でもあるアンディ・ハントによる『リファクタリング・ウェットウェア』という本にしました。


リファクタリング・ウェットウェア――達人プログラマーの思考法と学習法

ウェットウェア = 脳 をリファクタリングするというキャッチーなタイトルに惹かれて購入したのを覚えています。

実際にはエンジニアの思考方法や仕事術に関する書籍となっており、オライリー本ですが、重くなく楽しく読める本となっています。

目次はまえがきと8つの章から構成されています。
まえがき
1章 初心者から達人への道
2章 脳の構造
3章 Rモードへの転換
4章 アタマをデバッグ
5章 意識的な学び
6章 経験の積み重ね
7章 集中のコントロール
8章 達人になってから

では早速読んでいきたいと思います。

まえがき

プログラミングとは、人間とコンピュータ、双方の「能力」が発揮されるだけでなく、双方の「最悪の欠点」まで表面化させてしまうのです。

最初にこのように書かれているように、本書はエンジニアとコンピューターの関係について考察されています。
(コンピューターと私は長い付き合いですが、いまだに不明なエラーに遭遇するとパソコンに向かって悪態をついているのでまだそれほど良好な関係を築けていないようです。)

また、ここでエンジニアの最も必要な能力は以下の2点だと記述されています。
- 意思疎通(コミュニケーション) 能力
- 学習・思考能力

これは今読んでも変わらず全くその通りだと思いますね。

コミュニケーション能力はGitHubやSlack、Notionなどのツールの発展のおかげで当時よりもだいぶ生産的になった気がします。
対面のコミュニケーションのほうが楽しい時もありますが、オープンな環境で議論できるこれらのツールは非常に便利です。

1章 初心から達人への道

達人とはどういった人物かについて書かれており、
熟練者が問題を抽象化できるものとすると、達人は直感的に行動できるものとされています。

達人の膨大な経験が蓄積されているのは脳の非言語的、前意識的領域であるため、他者にしてみれば観察が難しく、本人にしてみれば明確な表現が困難です。

とあるように、たしかに優秀なエンジニアに思い当たる傾向な気がします。

また、

(意訳)
達人によるベストプラクティスは初心者のパフォーマンスを改善するが、
厳しい規則を押しつける開発方法論や社風は達人のパフォーマンスを初心者レベルに引きずり下ろしてしまいます。 

とも書いてあり、達人の能力が十分に発揮される環境は大切だと思いました。

達人へ到達する方法としてはどれだけ現場で経験が積めるかが大事だと書かれてあります。
実際に私もこれまで多くの実務を担当し、いろいろ経験したことで、特定の箇所に限っては直感のようなもので重要度の取捨選択ができるようになったような気がします。

2章 ~ 4章

人間の脳の仕組みをノイマン型CPUに喩えて説明した2章や、LモードRモードと脳が複数の機能の集合でできているという話の3章
認知バイアスの問題などについて説明する4章と、人間の脳の効果的な使い方をハードウェア的に説明するこれらの章は当時とても新鮮でしたが、今となってはこの分野の研究はより進み、他に脳科学の人気書籍もたくさん出ているので今回は省略したいと思います。

脳科学について興味ある方は、脳の構造的な説明をする『キレる女 懲りない男』という書籍や、人間脳とディープラーニングアルゴリズムについて学べる『人工知能は人間を超えるか』といった書籍もおすすめです。

5章 意識的な学び

Java や Ruby、.NET に iPhone SDK― こういった具体的な事柄に関する知識は、 現実にはそれほど重要ではありません。しかし、多くの人がいまだにこのことを理 解していません。学ばなければならない新しい技術や、既存技術の新バージョンは、今後も常に存在します。重要なのは技術そのものではなく、学び続けることなのです。

まさに今私が一番苦労しているところです。
フロントエンドは毎年のように技術の流れが変わるので、新しいことを毎回学ぶのはとても大変です。
これまでも様々な言語やプラットフォームを学習してきましたが、これからもずっと同じように学習していく必要があるのでしょう。
経験を積むことで楽に学べることもあれば、逆に古い考えを捨ながら学ぶ必要もあるので全く楽にはならないですね...

● 学びとは、「人に対して」行われることではない。「人が」行うことである。
● 経験の伴わない、知識のみの習得は効果がない。
● 目的やフィードバックのない無計画なやり方は、一貫性のない結果を招きがちである。

自分が学ぼうとしてないと、学ぶ意味がないということですね。自分で楽しんで学べるように価値を感じながら勉強しないと身に付かないというのはその通りだと思います。
そういった意味でも実践の中で学んでいく方法は効率のいいやり方なのかもしれません。
またそれ以外でも本書では社内勉強会はメリットしかないからおすすめと書いてあったので、今後も力を入れてやっていきたいです。
目標設定を上手くやるのは難しいですが、振り返り会は最高の学習機会だと思っています!

6章 経験の積み重ね

「遊ぶこと」が、事実を記憶することよりも先でなければなりません。

遊ぶように仕事をしよう。

調べましょう。 ググりましょう。空白を埋めるのです。最初は「わからない」でいいのです。ただ、分からないままにしておいてはいけません。

すみません。ちゃんとググります。

「努力は失敗を呼び、気づきが救う」
意識的に「努力しよう」とすると、単に感覚を研ぎ澄ましているだけの時と比べて、たいていはうまくいきません。実際、頑張りすぎると決まって失敗します。
期限が迫ってくるだけで我を忘れ、失敗してしまいます。

努力することが目的にならないように気を付ける。
ちゃんと完了できるイメージをもっておかないと、とても辛い状況に陥ることがあるのでしっかり納期を意識して開発しましょう。
納期は万物の根源。

7章 集中のコントロール

歳をとって20代の頃より集中できる時間が減ってきた気がします...

時間の確保についてはこちらの書籍もおすすめです。
『時間術大全』
『エンジニアの知的生産術』

8章 達人になってから

この本を読んで十数年経ちましたが、まだこの章は読めないみたいです。
また十年後にチャレンジしたいと思います。

再読してみて

今回再読してみて、やはりエンジニアにとっての学習することの重要性を再度確認することができました。
学習方法におていも。目標設定や振り返りなど意識的に行えているところもあれば、まだできていない部分にも気付くことができました。

ただ、最初に読んだ頃と同じように問題意識を持つだけで明確な回答は持っていないところも多く、自分の成長をあまり感じることはできませんでした。人間の成長には思った以上に時間がかかるようです。

とはいっても、この十数年間エンジニアとして順調に働いて来ることができました。
これは自分の性質として好奇心が強かったため、新しいことへ挑戦することを楽しめていたからだと思います。
これからも強く好奇心を持って新しいことを学習していきたいと思います!

最後に

改めて私にとってこの本は共感できるところが多く、よい書籍だったと思います。
ただ、学習方法や目指すべき達人のイメージなどは個人で異なることもあると思うので、ここの内容が正しいというわけではありません。

しかし、今の時代勉強し続けることは大事だと思うので一緒に頑張りましょう! レベルアップ!