プログラミング技術を上達させるコツ

プログラミング技術を上達させるコツ

プログラミング技術を上達させるコツ

 久々の BlogCat のプログラミング日記です。
 今回は いかにしてプログラミングの技術を上達させるか というテーマについて、ざっくばらんに話してみたいと思います。

忘れたって、いいのさ♪

 プログラミングの入門書を1ページ目からじっくり丁寧に目を通して読み終えてから、いざ何かプログラムを作ろうと思っても、
「ちゃんと読んだはずなのに、ほとんど忘れてしまった~!!」
とお嘆きの人が結構おられるのではないかと思います。

 そりゃそうです。受験勉強だって入試で点が取れるほど記憶に定着させるためには、教科書を何度も繰り返し読み返さなくてはなりません。

「そうか、なるほど! じゃあ、この入門書もあと 5 回は読もう!」
と思った真面目な人、そんなことは絶対にやめてください。言語の構造を体系的に把握するために、一回は読み通したほうがいいですが、あとはリファレンスとして活用すれば十分です (目的のために必要なことを巻末の索引を見て調べます)。読むにしても一冊を繰り返すのではなく、入門書を終えたら中級向け、中級を終えたら上級向け、というようにステップアップするとか、NumPy や pandas などの外部ライブラリについて書かれた本に進んでください。

 細かい事は忘れたっていいんです。プログラミング学習は受験勉強ではないし、一つの言語についてすべてを学ぼうとすると、その内容量は受験勉強の比ではありません。Python の公式ドキュメントに載っている内容を全部紙に変えたら、途方もない分厚さになって、持ち上げることもできないかもしれません。

「プログラマーと称する人たちは 1000 種類ぐらいの関数やメソッドを覚えていて、それを自在に使いこなしているにちがいない」
と考えている人は今すぐ認識をあらためてください。もちろん経験を積めば、それなりに知識は増えて、基本構文やよく使う関数などはスラスラ打てるようになりますが、それは本の内容を暗記したからそうなったのではなく、色々なコードを書くうちに自然と身についたものです。あまり使わない関数などは、やっぱり忘れているので、本やサイトを調べ直してコーディングしているのです。

 ほとんど一日中プログラミングしている私だって、色々なことを忘れます。自身で解説した内容でさえ忘れることもあるので、「自分のサイト」を参考にすることもあります。しばらく違う言語をやっていると、その前に使っていた言語の基本構文さえ忘れることもあります。

 もちろん、私が馬鹿であるとか、老化現象とか、そういう要因も大きいですけど、それ以上に
「忘れたっていいのさ♪ 怖くなんてないさ♪」
というスタイルでプログラミングを勉強しているからです。

 たとえ忘れたって、自分のサイトや本を読みなおしてコードを書けばプログラムは動くので、それでいいのです。このサイトも、皆さんが必要な情報をぱっと持ち帰れるようにというコンセプトで作っていますが、自身のための備忘録も兼ねているわけです (ググってみると、備忘録としてブログやサイトにコードを保管しているプログラマーさんが結構たくさんおられます)。 

【技術英語の豆知識】

・highly recognized よく知られた

 NumPy と SciPy にかかる形容詞として使われていた。
 「よく知られた」では少し弱い表現かもしれない。
 「誰もが知る」だと逆に言い過ぎ?
 そんなに誰でも知ってるわけじゃないし。
 とはいえ「Python やってる人なら誰でも知っている」なんて意訳すると、かなりくどい。技術英語なので、意味さえわかれば別にいいじゃん、てなわけで結局「よく知られた」に落ち着く。

・scripting capability スクリプト機能

 書いてすぐ実行できるプログラムのこと。

・if so desired (もしあなたが) 望むのであれば

 文末に添えられていた言葉。
 主語の you が省略されてリズミカルな文章になっている。
 ネイティブでないと、なかなか出てこない言い回し。
 こんなふうに英語を使いこなしてみたい。

 

プログラマーにとって大切な資質

 プログラマーにとって大切な資質は、
 
 ① 必要なことを調べる能力
 ② アルゴリズムの理解 (論理的思考力)
 ③ バグっても気にしない、お気楽メンタル

の三点です。① については先ほど述べたことと一部重なりますが、あるコードを書くときに、必要な構文やメソッドなどを素早く効率的に調べる能力です。
「こっちに書いてあったかな~。それともこっちだったかな~」
みたいに、だらだら調べるのはダメです。「素早く効率的に」ということが大切です。具体的には、グーグルで適切な検索ワードを入れる、書籍の巻末の索引を見て素早く目的のページを開く、というような能力です。これは慣れの問題ですね。若い人は子供の頃からグーグル検索に慣れ親しんでいるので、この点についてはあまり苦労しないかもしれません。グーグルだけでなく、サイトの検索ボックスも利用すると、より効率が上がります。

 二点目はアルゴリズムに対する理解を深めることです。
 プログラミングにとって大切なことは、関数やメソッドをたくさん覚えることではありません。プログラムがどのようなロジックで書かれているかを、その都度しっかり理解することが重要です。
 早い段階で線形探索や二分探索、素数判定などの代表的なアルゴリズムに触れておきましょう。脳をプログラミング仕様にチューンナップして、コードを読み解く力を強化しておくのです。
 実践的な段階になって、誰かが書いた複雑なコードを目にしても、「うがああ!」と叫んで頭を抱えるのではなく、必要であれば紙とペンを用意して、変数の受け渡しなどを丁寧に追いながら理解するように努めます。
 サイトや本に掲載されているコードが、必ずしも効率的なアルゴリズムで書かれていないケースもあります。そうしたときには、もっと上手い書き方がないかと考えて、自分でコードを改良してみましょう。こうしたトレーニングを積み重ねることによって、徐々に頭が「プログラマー脳」になっていきます (← こんなふうに書くと、なんだか危ない人になるみたいですね ...)。

 三点目の「バグっても気にしない、お気楽メンタル」も大切です。
 「バグっても折れない強いメンタル」を心がけていると、ストレスが溜まる一方で長続きしないので、「お気楽メンタル」でプログラミングすることをおすすめします。プログラミングにミスやバグは付き物です。最初に書いたコードが一発で上手く動作するなんて稀なことです。バグがあって当たり前と考えて、
「へらへら。また間違えちゃってるよ~。焦らずに直しましょ~」
ぐらいな気持ちで修正にとりかかりましょう。無駄な時間を使っているように思えるかもしれませんが、コードを丁寧に追ってミスを探すことも「プログラマー脳」を鍛えるトレーニングになるのです。

【プログラミング日記】キーボードを速く打てない

 なにしろ古い人間なので、PC のキーボードは高速打ちできても、iPhone キーボードの片手入力は苦手です。若い人たちが目にも止まらぬ速さでスマホを操作しているのを見てると「すごいなあ」と素直に感心してます。

 iPad のキーボードはまあまあ大きいので、iPhone よりは楽ですが、両手で操作しようとすると、左右の指がぶつかったりして、やっぱり難しいですね。結局は片手入力です。

 iPad につなげる物理キーボードも売ってたりしますす。
 でも、Apple 純正品だと 12,000 ~ 25,000 円ぐらいします。
 お金持ちの人はぜひ買ってください (↓)。私は無理だけど。

Apple Smart Keyboard(10.2インチiPad、10.5インチiPad Air、10.5インチiPad Pro用)- 日本語 JIS/MPTL2J/A

新品価格
¥20,385から
(2020/2/27 15:20時点)

Apple Smart Keyboard Folio (12.9インチ iPad Pro (第3世代)用) - 日本語

新品価格
¥24,057から
(2020/2/27 15:23時点)

「純正品にこだわらなきゃいいじゃん」と思われるかもしれませんが、ずっと使う物なので、安物買いして後悔したくないのです。

 そんなわけで、基本的に長い文章は PC で作成することにしました。それを OneDrive に放り込んで、iPhone で取り出して、AirDrop で iPad に送るという連携業で対処しています。
 名づけて「データの三角貿易」です。
 え? センスのないネーミング? ほっといてくださいな。

 まあ今のところ、これで不自由しないので、当面はキーボードを買う予定はないですが、iPad に Pythonista を導入して iOS アプリを開発してみたいなと思っているので、いずれは購入することになるかもしれません。

 

プログラミングに英語力は必要?

 「プログラミングに英語力は必要?」というテーマについて真面目に意見を述べたいと思います。

 結論から言うと、プログラミングに英語は必須です。
 リスニング (聴き取り) や会話のスキルは不要ですが、ある程度の語彙力と読解力がないと、プログラミング学習を進めること自体が辛くなってしまいます。具体的にどのくらいの水準の英語力が求められるのかといえば、

 [1] プログラミング入門レベルで中学卒業程度
 [2] プログラミング中級レベル以上で高校卒業程度

となります。入門レベルと中級レベルで要求される能力にかなり開きがありますが、その理由については以下で説明します。

 プログラミング学習に英語力が必須であることの1つめの理由は、ほとんどのプログラミング言語において、コードは英語で書かかなければならないからです。たとえば、Python でリストの要素を降順に並べ替えるコードは次のように記述されます。

# リストを作成
num = [5, 3, 4, 1, 2]

# リストの要素を逆順に並び替える
num.sort(reverse = True)

# リストを表示
print(num)
[5, 4, 3, 2, 1]

 Python入門段階であっても、中学レベルの英語力があれば、なんとなくコードの意味を類推できます。しかし仮に sort, reverse, true, print のような単語を知らないとしたら、コードに記述された1つ1つの用語の意味に気をとられ、プログラミングの本質的な学習に集中できなくなってしまいます。

 プログラミングの基礎についてひと通り学び終わり、データ分析やアプリケーション開発のための実践的なスキルを身につける段階に達すると、書籍や Webサイトから色々な情報を収集する日々が待っています (本当に毎日毎日ググり続けます)。

 ところが、大半のプログラミング言語は欧米生まれなので、最新情報は英語で発信されます。たとえば、Python の拡張パッケージ SciPy については、最新どころか基本情報ですらいまだに日本語ドキュメントが整っていないというのが現状です。

 知りたいことが日本語マニュアルに載っていないのであれば、英語で読むしかありません。技術文書なので文法や表現は比較的易しいですが、それでも高校卒業程度の英語力が要求されます (語彙についてはもう少し上のレベルが必要です)。

 例として、NumPy 公式ドキュメントの一部を抜粋してみます。

 When operating and manipulating arrays, their data is sometimes copied into a new array and sometimes not. This is often a source of confusion for beginners.

 それほど難しい英文ではありませんが、立ち止まらずにひと息で斜め読みできるぐらいの読解力は必要です (プログラミングで忙しいときに、文書を読むことに時間をかけていられません)。そのためには、英文を頭の中で逐一日本語に訳すのではなく、英語を英語のままで理解する訓練も必要です。

 実際問題として、英語が苦手だった人、あるいは英語から長く離れている人にとっては、高校英語を学び直すには相当な労力と時間を要しますが、上級プログラマーを目指すのであれば、英語はどうしても避けて通れないので、プログラミング学習と平行して少しずつ読解力を向上させていくしかありません。

 色々な勉強方法があると思いますが、中学~高1水準の英文法が身についているのであれば、Python の英語ドキュメントを読みながら、知らない単語はその都度 Google 検索で調べて語彙を増やすという方法が実践的かもしれません。ドキュメントと Google 検索画面を並べて見るために、スマートフォンより PC を使ったほうが効率的です。

 ただし、紙媒体のほうが頭に入るという人もいるでしょうし (私自身がそうだったりします)、体系的に学んでしっかりとした英語の土台を築きたいという人には『総合英語 Forest』をおすすめします。高校3年分の内容がこの一冊に全部詰まっています。中古で購入すると安いですが、何しろ参考書なので書き込みがあったりします。新品は高いなと思ったら、ブックオフなどで探して中身を確認してから購入するといいかもしれません。