フリーキーズ | 独学プログラミング

コードリーディング事始め。優秀なエンジニアのコードを読んで学ぶ技術

最終更新日
【画像】コードリーディング事始め。優秀なエンジニアのコードを読んで学ぶ技術
c1-normal-4

このコンテンツでは、エンジニアの能力を底上げする有効な手段の一つ、コードリーディングについて紹介します。
他のエンジニアが書いたコードを読むことによって、自身のスキル向上はもちろんのこと、プログラミングに対して新しい視点と新しいコーディングスタイルを学ぶことに役立ちます。

コードリーディングできる情報リソース

コードリーディングと言っても、他の人のコードってどこにあるんだろう?

c1-sad-1

いざコードリーディングを始めようとしても、正しい情報リソースの見つけ方を知らなければインターネット上に散布している有象無象を読むだけになってしまいます。
これはエンジニアごとの癖や目的とする成果物がバラバラになってしまうのであまりよろしくないことです。

体系的に1つのシステムと哲学に沿ってコーディングされているプログラムであれば、文脈への理解や目的が明確になっているため、まるで一冊の書籍を読むように読み進めることができます。

ここでは、その種類と方法を紹介します。

コードレビュー

これは他人のコードから学ぶ最も効果的な方法の1つです。
同じ開発チームに所属しているエンジニアであれば、目的も同じな上、チーム内で書き方を統率しようとする力学も働くため、一貫性のあるコードリーディングが可能になります。

他人のコードを調べ、改善すべき点やバグについてフィードバックを提供し、その結果として、さまざまなプログラミング技法や実践方法についての洞察を得ることができます。職場だけでなく、オープンソースのプロジェクトへもコードレビューに参加できます。

オープンソースプロジェクト

GitHub、GitLab、Bitbucketのようなプラットフォーム上のオープンソースプロジェクトは、様々な開発者によって書かれたコードを調査する機会を提供します。
ソースコードを研究し、彼らがどのようにプログラムを構成したかを理解し、バグを修正したり機能を追加したりしてプロジェクトに貢献可能です。

競技プログラミング

AtCoder、LeetCode、そしてTopCoderのようなプラットフォームは、問題という形でコーディング課題を提供しています。
これらのプラットフォームの多くは、自分で問題を解決した後、他の人が提出した解決策を見ることもできるという特徴があります。これらの解決策を分析することで、同じ問題への異なるアプローチや解決方法についての洞察を得ることができます。

ペアプログラミング

ペアプログラミングとは、2人のプログラマーが1つの環境で一緒に開発を進めるスタイルです。

ドライバーと呼ばれる1人がコードを書き、ナビゲーターと呼ばれるもう1人が入力されたコードの各行をレビューし、随時提案や修正を実施します。これは他のエンジニアから新しいテクニックやアプローチを学ぶのに非常に効果的な方法です。

覚えておいてほしいのは、他のエンジニアのコードを勉強するときはただ読むだけでなく、そのコードが何をしているのか、なぜエンジニアがそのようなコードを書いたのかを理解しようとすることです。
可能であればコーディングをした本人に直接質問し、学んだことを自分のコードに応用してみましょう。

Githubで良質なコードを探すテクニック

GitHubは世界で最もコードがホスティングされているプラットフォームです。
独学のための良質なコードを見つけるにはGithub上で良いコードを見つけるためのテクニックを覚えておきましょう。

人気のリポジトリを特定する

Githubのスターやフォークが多い例

Githubのスターやフォークが多い例

スターやフォーク、コントリビューター(OSS開発参加者)の数が多いリポジトリを探しましょう。
この指標は、一般的に質の高いコードを持っている可能性が高く、人気のある活発なプロジェクトを示しています。GitHubの検索機能を使えば、自分の興味に基づいてリポジトリを探すことができます。
たとえば、Pythonの学習に興味があるなら、Pythonで検索して星の多い順に並べ替え、自分が興味を持ちそうなリポジトリの内容を覗いてみると良いです。

リポジトリの活動をチェックする

良いリポジトリは定期的にメンテナンスされていることが多いです。
そのリポジトリのコミット履歴をチェックすることで、コードに定期的な更新や改善があるかどうかを確認できます。さらに、多くのオープン課題やクローズ課題があれば、ユーザーやコントリビューターのコミュニティが活発であるとわかります。

ドキュメントを読む

良いプロジェクトには、明確で包括的なドキュメントがあります。
ユーザーによって該当のコードをどのように使うのか、どのように構成されているのかを理解するのに役立つドキュメントが書かれていると活発なコミュニティを抱えるコードであるとわかります。

READMEだけでなく、wikiやREADMEからリンクされているドキュメントサイトに情報が豊富な場合もあります。

Pull Requestを探す

Pull Requestはプロジェクトの質を測る良い指標になりえます。
コードレビューが定期的に行われ、有意義なコメントやディスカッションが行われていれば、そのプロジェクトが高い水準のコード品質を維持している良い兆候です。

優秀なエンジニアをフォローする

興味のある分野で多くの人から関心を得ているエンジニアを見つけた場合、GitHubで彼ら彼女らをフォローすれば質の高いリポジトリにたどり着ける可能性がグッと上がります。
彼ら彼女らがどんなプロジェクトにスターを付けているか見ることができるので、そこからたどっていくこともおすすめです。

Awesome Listsを使おう

Awesome Listsは、特定のトピックに関するリソースを集めたものでGitHubにたくさんあります。
有用なライブラリやツール、プロジェクトのリストが含まれており、自身が扱うプログラミング言語やツールのリポジトリは一読するだけの価値があります。

他人のコードは常に優秀に見える魔法にかかる

コードリーディングをしていると、他のエンジニアのコードが素晴らしいと感じることはよくある感情です。
多くの場合、以下のような要因に起因しています。

  1. 初心者: プログラミングを始めたばかりだったり、新しい言語やフレームワークで作業していたりすると、他の人のコードが印象的に見えることがあります。これは学習過程では普通のこと。
  2. 構造化: 経験豊富なエンジニアはよく構造化され構成されたコードを書きます。明確な命名規則を使い、コードを管理しやすい関数やクラスに分解し、関連するコードをグループ化します。このようなコードに出くわすとそれが優れているように思えます。
  3. エラー処理: 経験豊富なエンジニアはコードに強固なエラー処理を持っていることが多いです。これにより洗練されているように見えることがあります。
  4. 効率性: 経験豊富なエンジニアは実行時間やメモリ使用量の面で効率的なコードを書くことが多いです。自分よりも効率的に問題を解決するコードは印象的に見えることがあります。
  5. コメントとドキュメント: コメントやドキュメントがきちんと書かれているリポジトリを見ることは自身を恥じる要因になりえます。

他人のコードが自分のコードより優れていると感じることは、あらゆるレベルのエンジニアに共通する経験であることを覚えておいてください。
この感情はあなたが新しいアイディアやテクニックに触れている証拠であり、学び成長する素晴らしい機会なのです。怖気づくのではなく、好奇心を持って、学ぶつもりでそのようなコードに接してください。

コピペプログラマーという呪縛

コードのコピペ(コピー&ペースト)は、緊急性のある状況では役に立つときもありますが、使いすぎたり、理解せずに頼ったりすると大きな弊害があります。

  • 理解と学習: 学習の妨げになります。プログラミングにおいて、なぜそれが機能するのかを理解することは非常に重要です。
  • 文脈の違い: すべてのコードは特定のコンテキスト(文脈)のために書かれています。コピペすると、書かれた文脈を見逃す可能性があり、予期せぬ結果や自分のプログラムのエラーにつながる可能性があります。
  • コードの品質: 一貫性がなくなります。コードを読みにくくし、理解しにくくし、保守しにくくします。
  • 法的・倫理的影響 適切な帰属表示なしに他人のコードを使用することは法的・倫理的な問題につながる可能性があります。
  • 依存: コピペに頼りすぎると依存性が生じます。コピーするものがないと問題を解決できないエンジニアになってはいけません。

他人のコードをリファレンスとして使ったり、問題を解決するためにその一部をコピーしたりすることは、それがどのように機能するかを理解し、ライセンスや帰属の要件を尊重する限り何も悪いことではありません。
しかし、常に自分でコードを書くように心がけ、コピペに頼るのは最後の手段か、コードの重要でない部分だけにしましょう。長い目で見れば、より強力なスキルと、より質の高いコードにつながります。

QiitaやZennのコードをコピペする先

先述した通り、コピペには中毒性があり、自身の成長の妨げになります。
ただし、どうしても理解できないが仕事として先に進まなければならない状況もあるでしょう。

たとえば、エンジニアの情報共有に多大な貢献を与えているQiitaやZennのようなプラットフォームのコードをコピペしたことがあるエンジニアは少なくないと思われます。日本人エンジニアが多く、文脈も比較的近いところで働くエンジニアによる情報共有は有用となることも多いでしょう。
こういったプラットフォームから「ただ受け取る」だけでなく、それを後学習として復習し、理解できるようになることで自分自身が情報提供者にもなれるのです。

自分が理解できなかったことは、他の誰かが現在理解できていない可能性が高いのです。そういった方の手助けができるようになれば、きっとあなたのエンジニアライフをより素敵なものへと彩る活動になります。

読み続けて書き続けて理解する

このコンテンツでは、コードリーディングへ入門したいエンジニアに情報と注意点をまとめましたが、結局のところ小手先のテクニックよりも努力あるのみです。
コードを書き続けるだけでなく、読み続けることも体力と集中力が必要になりますし、理解できないときに頭が混乱してしまうことも少なく有りません。

こればかりは明確な解決方法はなく、「理解できるまで読む(+調べる)」「理解できるまで書く」を実施することが大切になってきます。
当然効率よく学習できることが理想ではありますが、「考えた時間」の長さはそのまま自身のスキルにとって成長の礎となります。仕事から帰ってきて、温かい食事を取りシャワーを浴びたら、寝る前に1つだけでいいのでGithubリポジトリを覗いてみるところから始めてみてください。