リーダブルコード読書メモ ~その1~

リーダブルコードを読んでいきます。前にも読んだことあるけど、次の会社行くまでに再度目を通しておきたい。

1章

  • コードは他人(未来の自分も含む)が読んで、理解しやすくなければならない。これが大原則

    • 理解にかける時間は短く。
    • 理解する、とは変更を加えたり、バグを見つけたりしやすいこと
  • 短く簡潔なコード<長いけどわかりやすいコード

    • 変数定義、条件分岐などが分かりやすい
    • 1行でまとめてバシッと書くより、複数行に分けて人間が自然に(考え込まずに)処理の流れが追えるように。

2章

  • 変数、クラス名、関数名に情報を詰め込む。
    • 何を表すかが「一目」でわかるように
      • getはただ「取得」を意味するが、downloadのほうが「どうやってとるか」を表している
      • sizeは何かの「大きさ」を意味しているが、widthやheightなどのほうがより具体的なものを表している
      • 類語の引き出しを作っておく
    • tmpとかretvalとかは何かの変数を表している以外の情報はない。
      • 具体的にどういう意味を持った値が格納されるかを名前に込める。面積、体積、ユーザのプロフィール、など
      • ただ、tmpについては、swap処理など一時保存的に利用する場合はそれでいい。この場合は本当に一時保存の意味を表しているので。
    • ループに使うi,j,kについてはこのまま使って問題ない。
      • ただ、ループが二重、三重とかになると可読性が落ちるので、もう少し情報を付加するとよい。例えばユーザに対するループであれば「ui」とか
    • 関数名は動作が分かるようにする
      • TCP/IPポートをサーバがリッスンできるかを確認する → CanListenOnPort()
    • 単位
      • 変数名に単位を付けられるなら、その情報を付与する(秒、センチ、など)
    • セキュリティに関する話題
      • セキュリティ対策前後が明確にわかるようにする。plaintext_password →(暗号化)→passwordなど。そうすれば、暗号化漏れなどを検知できる。
    • 名前の長さはなるべく短くする
      • 情報をわかる範囲で圧縮する。evaluate→eval、document→doc、string→strなど。
      • 不要な単語は切り捨てる。ConvertToString→Tostring、など。

条件つき確率の考え方というか理解の仕方

条件つき確率について。なお、以下の記事は数学の専門家に見てもらったわけでもなく、私は数学の専門家でもないので、正しさなどは保証できません。参照や流用の際はその点十分注意いただきたく思います。以下を参考にすることで損害が発生しても責任は負えません。

条件つき確率とは「ある事象 B が起こるという条件下での別の事象 A の確率のこと条件付き確率 P(A|B) はしばしば「B が起こったときの A の(条件付き)確率」「条件 B の下での A の確率」などと表現される」ということです。 ja.wikipedia.org 式としては以下の通りです。 
P(B \mid A) = \frac{P(A \cap B)}{P(A)}
AとかBとかって急に言われてもちょっとイメージ付きにくいですよね。ただ、日本語で言っていることはわかるし、式もそんなに難しくないけれどいざ応用しようとすると、あれ?ってなってしまう感じです。(個人の感想)

何回か確率統計勉強してて、さすがにちゃんと理解しないとなあと今日ちょっと考えてみたんですが、数式を日本語にすると \frac{事象A内で事象Bが起こる確率}{事象Aが発生する確率の全体}となっています。そもそも確率は(すごくざっくり言ってしまうと) \frac{ある事象の通り数}{全事象の通り数}なので(もちろん事象の派生の仕方は同様に確からしいという前提)なので、これを通り数ではなく、確率で表しているだけなんだと考えました。その瞬間、すごく腹落ちしたし、その後の問題演習もすんなりいきました。

だいたい確率統計の教科書にはこの後に必ずベイズの定理が乗ってたりするんですが、そちらの導入、応用も含めてスムーズに理解が進みました。(この辺はまた後日)

こちらの本、見やすいし、わかりやすく、問題演習も豊富(しかもそこまで難しくない)のでお勧めです。

確率統計 (工学系数学テキストシリーズ) | 健爾, 上野, 工学系数学教材研究会 |本 | 通販 | Amazon

Ruby silver受かりました

hatek47320.hatenablog.com

こちらの通り、本日リベンジし、合格しました。スコアは90でした。個人的にはもう少し取りたかったけどまあよしとしましょう。

とりあえず、これから先受けようと考えている人向けにメモを残します。といっても、他にも似たような記事たくさんインターネット上には転がっているのでそちらを参考にしたほうがいいかもですね。

勉強法

公式教本をやりこむこと

これにつきます。この本のsilverの範囲を徹底的にやりましょう。演習問題も全問正解できるようになるまで繰り返すことです。ポイントはただ正解、不正解を気にするのではなく、ほかの選択肢がなぜ誤りなのか、なぜその選択肢が正解なのかを論理的に説明できるまで繰り返すことです。 選択肢を論理的に吟味する→論理的に説明ができなければ教本の該当箇所に戻る、これを繰り返すことで確実に力が付きます。

RExや模擬問題集に取り組むこと

こちらも、やりこみましょう。RExは90点後半がコンスタントに出るまで、模擬問題集は全問正解になるまで繰り返してください。こちらも、正解、不正解の根拠を全選択肢について論理的に説明ができるようにしてください。 一つ注意ですが、RExが高得点だからと言って余裕こいたら確実に終了します。えーっと私のことですw。なんとなくですが、RExは問題の範囲が教本や本番の問題よりも若干浅く感じました。(本番と同等~若干やさしめ) そのため、RExが高得点とれるようになっても必ず教本を読み込んで穴を見つけてはそこを強化する、ということを繰り返してください。

コードを動かしてみること

単に問題を解くだけでなく、教本のコードをirbなどで動かしてみる(ただ写経するだけでなく、こうしたらどうなるかな、とかいろいろ実験してみる)といいと思います。

出題内容など

  • Array、String、Hashのよく使うメソッドの知識
    • 破壊的、非破壊的メソッド、メソッド実行後の返り値など
    • ただ単にメソッドの動きを問うのではなく、若干問題がひねってあるものもあります。ただ、少し落ち着いて考えればすぐにわかるようなものなのでそこは頑張ってくださいw
  • 正規表現
  • File、IOなど
    • 結構抑えるの大変ですが、何回も教本を読む、irbとかでコードを動かすなどで、理解を深めてください
    • ファイル読み込み、書き込み、File.open時のモードによる挙動などが問われます。
  • 基本的なオブジェクト指向の内容
    • silverなのでそんなに難しい内容は出ません。

さて、次はGold、といきたいところですが、読みたい本とか勉強したいことはたくさんあるので、どうしようか悩んでいる感じです。。。

いかにして問題を解くか(2)

昨日の続きです。もう少し読み進めたので読書メモを追記します。 hatek47320.hatenablog.com

なお、本の内容を私なりに咀嚼し、アレンジして書いているので、ちゃんと読みたい人(私の主観を排したい人)は原本を読んでください。

  • 改めて、問題を理解するために気を付けること

    • 問題に書いてあること(ビジネスであれば与えられた情報)を手掛かりにすること
    • どうしても理解が進まない場合は、問題を分離したり(困難は分割せよ)、言い換えたりして腹落ちさせること
  • 解くためのアイデアを考えるために

    • 問題を様々な角度から観察し、これまでの経験を何とか結び付け、応用できないか考える
    • 中々アイデアが浮かばなくてもあせらず、むしろアイデアを検討するためにより問題を理解できたとポジティブに考える
  • イデアを実行に移す

    • 枝葉末節はあまり気にせず、大枠のアイデアが思いついた段階で計画を立て、実行に移す。
      • 枝葉末節は実行中にカバーする、くらいの感じ。
    • 大きな問題は分割し、段階を踏んで対処する(困難は分割せよ)
    • 問題の把握は引き続き行う。また、実行中のアイデアが問題に対して正しい解答を得られるようなプロセスを踏んでいるかはしっかり検証すること。
  • 実行が終わったら振り返る

    • 問題が求めているものが答えられているかを様々な角度から検証する。
    • 解答をよりシンプルにすることに努める。自身の経験との紐づけ、チーム内に共有されているナレッジとの紐づけなど、自分、他人双方にわかりやすいものか。
      • 解答をただ見直すだけでなく、次の問題解決に向けた血となり肉となる。

終わりに

問題を理解する、ということの重要性をすごく強調していたような気がします。問題の理解を誤ると、計画は狂うわ、求めているものは出せないわ、と悲惨なことになります。。。 また、解答を出してハイ終わり、ではなく、周りに共有しやすい、理解されやすくまとめなおす、というのも重要ですね。

いかにして問題を解くか

読んでます。数学者の方が書いているので、中の題材は数学の問題ですが、普通の人でも読めると思います。数学だけじゃなくてより一般的な問題解決に向いています。

まだ読んでる最中ですが、印象に残ったことを箇条書きにしてみました。書いてあることはよく言われていることなのですが、こうして再認識するのは重要ですよね。

  • 問題を理解すること

    • 与えられているもの、前提条件を把握する。そのうえで何を解決したいのかを正確に把握する。
    • 他人に問題解決をしてほしいときは、自分がしっかり理解したうえでそれを伝達すること。
  • 計画を立てる

    • 問題を解決するために何を、どのように遂行するかを考える。
    • 問題を解くことの大部分は問題の理解と計画。計画さえ立てればあとはやるだけ。
  • 問題解決に取り組む

    • 横道にそれやすいので、適宜軌道修正を図ること。具体的には何を解決すべきかを見失わないこと。
      • 今実行していることについて、それが問題解決に重要なものかを検証する。またやっていることをしっかり理解する(よくわからないまま取り組まない)。
    • 行き詰まったら、何を目標としているか再度振り返る。似たような問題を過去に解いたことがないか、それを応用できないか考える
  • 問題解決できたら

    • 再現性はあるか。多角的にみて誤りはないか。
    • 別のアプローチはなかったか。今回のアプローチは他の問題に応用できないか。
    • 与えられたものや前提条件はフルに使ったか。解決したい問題に対してしっかり解答を与えたか。

担当者の作業遂行の注意書き、みたいな感じの印象でしたが、管理する側の目線だと、上記に注意して、チームメンバーのプロジェクト管理できるといいなあと思います。

読み進めて興味深いものがあればまた投稿します。

P.S

そういえば本の冒頭で「今直面している問題について、過去に似たような問題がなければ解くのはなかなか難しい」とありました。大学受験において暗記数学は色々言われていますが、著名な数学者がこのようなことを言っているのは非常に興味深いですね。 ちなみに私は「暗記数学」が意味するところは賛同しますが、いかんせん言葉がよくないので、変な論争が巻き起こっているなあと思いました。

π>3.05を示せ

有名な問題ですよね。一般的には、半径1の円の面積とそれに内接する正12角形の面積をそれぞれ幾何的に計算し、評価するようですが、ここではちょっと違った方法でやってみます。 この解法は、計算がだいぶ面倒なため、一部計算について算出用のプログラムを作成し、それを用いました。そのため、試験場で採用するには現実的ではないものとなります。そして最初に断りますが、この解法について、数学の専門家等に検証してもらったわけではありません。あくまで個人の思い付きレベルですので、流用などの際は注意してください。また、本解法を適用して損害を被ることがあっても責任は負えません。ご了承ください。

解説

以下の積分値を利用します。 \int_0^{1}  \displaystyle \frac{1}{1+x^{2}} dx = \frac{\pi}{4}

これは、関数\displaystyle \frac{1}{1+x^{2}}における {0}\leqq{x}\leqq{1}の面積を表しています。図で表すと下の青色部分です。

f:id:hatek47320:20210530222735p:plain

これに対して、例えば、以下のようなグレーの多角形で囲まれた部分の面積を考えてみます。

f:id:hatek47320:20210530230548p:plain 一例として横幅が \displaystyle \frac{1}{4}、縦幅は長方形の右上頂点がグラフ上にあるように収めてみました。 ※わかりやすいかなと思ってあえて約分はしていません

さて、ここで方針の説明ですが、今回は上記について「青色の部分の面積>グレーの多角形の面積」を示し、そこから、π>3.05を示します。

青色の部分の面積は冒頭説明した通り\int_0^{1}  \displaystyle \frac{1}{1+x^{2}} dx = \frac{\pi}{4}です。ここで、示したいのは {\pi}>{3.05}ですが、青色の部分の面積に合わせて、両辺を4で割った  \displaystyle \frac{\pi}{4}>{0.7625}を示すことをまずは目標にします。

グレーの多角形について計算してみます。グレーの多角形を構成するそれぞれの長方形の面積は \frac{i}{4}*f(\frac{i}{4})(ただし、i=1,2,3,4)と計算できるので、これらをすべて足し合わせると約0.72029となります。グレーの多角形が0.7625以上になってほしいのですが、0.04ほど不足していますね。どうにかしてグレーの多角形の面積を増やしたいです。というわけで、長方形の横幅を先ほどの半分の \displaystyle \frac{1}{8}にしてみます。 f:id:hatek47320:20210530231419p:plain すると先ほどよりもグレーの多角形の面積が増えているように見えます。一般に、長方形の横幅を小さくするとグレーの多角形の面積はだんだん増えていきますが、これを説明するとだいぶ本筋からずれるので、この事実は認めてしまいましょう。(もっと正確に言うと \displaystyle \frac{\pi}{4}に徐々に近づきます)

グレーの多角形の面積は、横幅が \displaystyle \frac{1}{8}刻みとなることに注意すれば、先ほど同様 \frac{i}{8}*f(\frac{i}{8})(ただし、i=1,2,...8)を足し合わせて計算できます。実際に計算すると約0.75349となりますが、まだ足らないですね。そのためさらに長方形の横幅を小さくする必要があります。とりあえず横幅を変えていった場合の計算結果を以下に示します。

横幅 計算値 評価結果
1/4 0.72029 ×
1/8 0.75349 ×
1/9 0.75710 ×
1/10 0.75998 ×
1/11 0.76232 ×
1/12 0.76427

横幅が1/12の時に初めて0.7625を超えました。この時、  \displaystyle \frac{\pi}{4}>{0.76427}>{0.7625}となり、目指していた式  \displaystyle \frac{\pi}{4}>{0.7625}を得ることができました。そして、元々の命題である {\pi}>{3.05}を示すことができました。

最後に

Texの使い方が不慣れなので色々見にくいところはご了承ください。

グレーの多角形の面積を出すところは、横幅を変えていって0.7625を上回るまで検証し、計算をするのは実際の試験場では相当大変です。今回は横着をしてRubyで適当にプログラム組んでグレーの多角形の面積を算出しました。試験場でこの方法で解くのは非現実的ですね。 ただ運よく横幅1/12の時に式を満たせそうと、ラマヌジャンばりの神のお告げが聞こえてきたとして、数値計算をせずに「横幅1/12の時に式を満たす」の記述だけで点が来るのであれば、こんな計算しなくていいのですが、多分来ないな笑

大学数学の勉強のおすすめと思われる教材

昨日の続きみたいな感じです。本当は他の事書きたかったけどまとまらなかったので。。。

hatek47320.hatenablog.com

大学数学の勉強で難しいのは、そもそも教科書の内容が難しい、ということです。特に大学1年で履修する微分積分線形代数なんかは、高校数学でごまかしてきたことを厳密に理詰めで定義していくのですが、高校数学終わった直後の学生にそれを理解させるのは中々に厳しいです。 そういうわけなので、教材選びが非常に重要だったりするのですが、似たようなタイトルでも、ふたを開けてみると記載内容は天地の差があって、運悪く上級者向けみたいなものを買ってしまう可能性も十分にあります。そのため、本屋でしっかりと自分に合うか見る、Amazonなどのレビューを参考にする、など教材を選ぶ力みたいなのが余計に問われます。あとこれは余計かもですが、教科書のレイアウトもまるで人が読む、ということを意識しないで数式の羅列になっているわ、フォントとか表現もなんか古臭いわでそういう点でもこちらの読書意欲を見事にえぐり取ってくれます。大学数学の本は数十年前から改訂を重ねているものが多いので、視覚的に古臭く感じます。 いきなり実数の連続性とか、ε-δ論法とかでうわあああってなる前に、その辺の厳密な説明は置いておきつつ、大学数学の基本的なところをさらっておくのにおすすめの本をいかに並べてみます。以下の本から入って、そのあともう少し難しめの「ザ大学数学の教科書」に入るのがいいのかもしれません。

1冊でマスターシリーズ

図による視覚的な説明して、わかりやすさを重視している印象でした。かといって、数式による理論的な説明もしっかりしています。演習問題も適度についていておすすめです。

キャンパスゼミ

有名ですよね。マセマは大学受験向けの数学の本も出していて、それなりに有名ではなかろうか。

大学受験向け参考書によくある口語体による説明で、わかりにくい大学数学の内容をうまくほぐして説明しています。別途演習書もあります。

なんか薄っぺらい感じになったけどまあいいか。。。