見出し画像

ネットで見つけたプログラムコードを理解できるようにする技術


はじめに

この記事は、個人開発や趣味でプログラミングを普段から行なわれている「プログラマ向けの記事」です。(ただし、始めたてである、何年も継続している、などといったレベルは問いません)

なお、この手の方法論的なものは通常、各個人で各々探求されているものであり、そのうちの(私個人の)1つをコンテンツとして文章にまとめ、公開したものとなります。ただ、日常会話で方法論の話をする場面も普通は無いもので、その共有の場として記事を公開することには何かしらの意義があると考え、公開することにしました。


さて、この記事をお読みになっているプログラマである皆さんは、何かアプリやソフトウェアを作成することとなった場合、ユーザによるインプット(入力)に対し、画面などのインタフェースにアウトプット(出力)してくれるような処理をプログラミングで作成することがよくあるかと思います。

その際、手持ちの知識だけで作れてしまう場合もあれば、書籍やネットでひたすら調べないとなかなか作ることが難しい場面も出てきます。

そして色々とネットで検索して、ようやくそれっぽいコードが見つかったとしても、コードの内容が自身の力でうまく読み取れなかったり、コードが大量に記述されているのを目の当たりにすると、つい心が折れてしまいそうになります

ここでは、気になるプログラムコードを見つけた際、パッと見で全然よく分からない、というところから自分が理解できる情報にするまでの体系的アプローチをご紹介します。(あくまで簡易的な戦略であり、高難易度なコードを容易に読み解く「銀の弾丸」のような具体性のあるものではないです。念のため。)



コードそのものが理解できない場合

コードそのものが理解できない理由としては、以下が挙げられます。(これは、そこまで多くないコード量を想定しています)

  • 『プログラミング言語の基本知識』が不足している

  • 『使用しているフレームワークの知識』が不足している

  • 『その処理をする理由となる前提知識』が不足している

  • 『その処理に使用している数学の知識』が不足している



『プログラミング言語の基本知識』の探求

初めて特定のプログラミング言語に触れる場合、言語に対する知識不足によりつまずくパターンが多くなります。
オススメとしてはとりあえず1冊、その言語の入門書を購入、もしくはレンタルし、一通り読んでみることから始めてみて下さい。(一気にやろうとすると気持ちが折れてしまうので、時間に余裕を持って、腰を据えてやりましょう)

最近の入門書などでは、記載しているコードを『いちいち打ち込まなくても公式ページでコードが公開されているためダウンロードし、利用できる』パターンも結構あります。(ただし、コードの内容にはしっかり目を通し、分からないところはしっかりと調べる癖をつけて下さい)

書籍以外では、ネットで検索することで実に様々なコードが公開されていますので、是非色々調べてみて下さい。

また、それなりにプログラミングを続けてきた人でも、コード内に『ん?』となるようなものが時々あったりします。その際は、そのコードでしか見たことがないような単語が含まれていれば、その単語を検索ワードとしてネットで探すことで、色々なことが分かる場合があります。

あとは、『実際に動作(ビルドと実行)させてみる』のも重要です。コードを眺めても想像していなかったことが、動作させてみたら起こったり、判明する事実もあります。(パラメータを変更して何回か実行する場合は、きちんと『パラメータと結果のセット』を記録するのを忘れずに)



『使用しているフレームワークの知識』の探求

これについては、有志が色々とネット上で情報をまとめていたり、またフレームワークの制作者がGitHubなどで概要や使用法などをまとめていたりするので、まずはそれらを確認します。

さらに、開発環境によっては、フレームワークに含まれるクラスやメソッド(関数)をすぐに検索できたり、その概要を確認できるので、まずは『その方法を事前に確認しておくこと』も重要です。(それを早めにやっておくかどうかで、今後の開発効率が格段に変わる可能性もあります)

また、開発環境によっては、便利なショートカットキーが存在する場合もあるため、事前に確認し、どこかにメモをしておくとかなり強力な武器になります。



『その処理を行なう理由となる前提知識』の探求

とある物理演算(例えば、風速Xメートルの風が吹いている空間上にボールを投げるシミュレーション)を実行してくれるようなアプリを開発したいとします。これで現実の物理学に基づく結果を得るのであれば、そのアプリ内の処理を作成する際、おそらく古典力学や流体力学などの物理学の知識が必要となるでしょう。

他にも、音声の解析をするアプリであれば、FFT(高速フーリエ変換)やスペクトルの知識が必要となる場合があります。

つまり、ネット上で探し当てたコードのうち、どういう意図でその処理をしているかわからないコードについては、プログラミング以外の知識が必要となる場合があるのです。これには、専門書を確認するなどして理解をする必要があります。(ただし、依頼を受けてアプリを作成するのであれば、どのような数式が必要かを共有してもらえば『数学の知識だけで』プログラミングが可能な場合も多いです)



『その処理に使用している数学の知識』の探求

プログラミングで使用する数学の知識は、おおよそ高校~大学程度の知識があれば問題ないと思います。特に

  • 虚数

  • 三角関数

  • 行列

あたりは分野によっては使用する可能性も高いため、索引できる環境があると強いです。ネットで検索するのもいいですし、高校の教科書や問題集をひと通り揃えておけば、ちょっと知りたいことがあったときなどにすぐに調べられます。

また、プログラミングでは、『配列(もしくは辞書型)』を非常によく使用するため、これらの取り扱いには慣れておくと良いです。



コード量が多い場合

「書いてあるコードの記述量が多すぎて、読み解くのが大変そうだ…」という場合、以下のアプローチが基本になります。

  • コメントを残す

  • 抽象化する



コメントを残す

どういうわけか、ネットで探り当てたプログラムのコードには、コメントが無く何をしている処理なのかがすぐに理解できないものが非常に多く溢れかえっています。

その場合、別のテキストファイルなどにコピペし、分からないコードについてはそれぞれに『これはどういう処理なのか』について簡単に記述していくと、とても理解しやすくなります。(コードより文字数が多いコメントは、逆に理解の妨げになってしまうためオススメしません。コメントはなるべく簡潔に書きましょう)



抽象化する

例えばプログラミング言語の Swift で書かれた、以下のようなコードがあったとします。各コードは三角関数の知識があれば理解は容易ですが、まとめてざっくりと眺めたとき、やや見づらさがあります。("CGFloat" という単語が確認できますが、見たことがない、という方はとりあえずスルーして下さい)

var x: CGFloat = 0
var y: CGFloat = 0
let sinx = sin(x)
let cosx = cos(x)
let tanx = tan(x)
let siny = sin(y)
let cosy = cos(y)
let tany = tan(y)
let sinx_plus_y = sin(x+y)
let cosx_plus_y = cos(x+y)
let tanx_plus_y = tan(x+y)
let sinx_minus_y = sin(x-y)
let cosx_minus_y = cos(x-y)
let tanx_minus_y = tan(x-y)
let formula1 = sinx*cosy+cosx*siny
let formula2 = sinx*cosy-cosx*siny
let formula3 = cosx*cosy-sinx*siny
let formula4 = cosx*cosy+sinx*siny
let formula5 = (tanx+tany)/(1-tanx*tany)
let formula6 = (tanx-tany)/(1+tanx*tany)
let formula7 = 2*sinx*cosx
let formula8 = 2*cosx*cosx-1
let formula9 = 1-2*sinx*sinx


これを『配置変えとコメントのみ』で記述をアレンジしてみます。

// 変数2種
var x: CGFloat = 0
var y: CGFloat = 0



// ///---+ 三角関数(S) +-------\\\
// sin
let sinx = sin(x)
let siny = sin(y)
let sinx_plus_y = sin(x+y)
let sinx_minus_y = sin(x-y)

// cos
let cosx = cos(x)
let cosy = cos(y)
let cosx_plus_y = cos(x+y)
let cosx_minus_y = cos(x-y)

// tan
let tanx = tan(x)
let tany = tan(y)
let tanx_plus_y = tan(x+y)
let tanx_minus_y = tan(x-y)
// \\\---+ 三角関数(E) +-------///



// ///---+ 三角関数の公式(S) +--------------------------\\\
// sinx_plus_y と等価
let formula1 = sinx*cosy + cosx*siny

// sinx_minus_y と等価
let formula2 = sinx*cosy - cosx*siny

// cosx_plus_y と等価
let formula3 = cosx*cosy - sinx*siny

// cosx_minus_y と等価
let formula4 = cosx*cosy + sinx*siny

// tanx_plus_y と等価
let formula5 = (tanx+tany)/(1-tanx*tany)

// tanx_minus_y と等価
let formula6 = (tanx-tany)/(1+tanx*tany)

// sin(2*x) と等価
let formula7 = 2*sinx*cosx

// cos(2*x) と等価
let formula8 = 2*cosx*cosx-1
let formula9 = 1-2*sinx*sinx
// \\\---+ 三角関数の公式(E) +--------------------------///

いかがでしょうか。行数は増えたものの、パッと見たときの印象の良さや分かりやすさはかなり向上したのではないでしょうか。

コツとしては、ざっくりとコード群をまとめて眺めたとき、『その1行目を見て、どういう塊なのかを即座に判断できる』ようにすると、対象のコードの集まりを理解する速度が急上昇します。

なお、「三角関数」と「三角関数の公式」のコメントのラインの長さに差をつけたのは、その中に含まれるコードの行数や1行のコードの文字数の多さなどでだいたいその長さを調節し、より見やすくなるようにしているためです。



そもそもコードが見つからない

目的のコードが見つからない場合は、『誰かに質問してみる』ことをオススメします。Stack Overflow(英語のサイト)などでは、自分が疑問に思っていることを詳細に書くことでハイレベルな質問も答えていただける場合もあります。(このようなサイトで質問する際は、事前に類似の質問がないか、もしあった場合はそれらの質疑から自分の疑問点を解消できるかをチェックしておきましょう)



動画教材を調べる

意外にもプログラミングの学習をする上では、『動画教材』はかなり優秀です。

「コピペができないから向かないのでは?」と思う方もいるかもしれませんが、最近のWebブラウザでは動画内に記述された文字列をOCRの機能によりコピーすることが可能になっているものもあります。(完璧な精度ではないため、たまに修正する必要もありますが)

また、動画教材は『コードを書く手順が明確になっている』という特徴もあり、それらをきちんと追っていき、重要な点をメモしていけばかなり理解を深められるため個人的に非常にオススメな方法です。

iOSでのアプリ開発に関しては『iOSAcademy』というYouTubeチャンネルがオススメです。英語のコンテンツですが、YouTubeの機能で自動翻訳の字幕をつけることで(稀に誤訳がありますが)日本語字幕を付けて閲覧することが可能です。



最後に

いかがでしたでしょうか。プログラミング言語の教材やネット上で見つけられる情報でも、この手の議論をする記事はあまり無いのではないでしょうか。

もし、この記事で取り扱ってほしい内容などございましたらご連絡下さい。私に関心のあるものであれば、時間を見つけて追記いたします。


以上でこの記事は終わりです。最後までお読みいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?