私のパソコン歴(6) : 小学生~高校生までを振り返って(前編)

今までの投稿で小学生~高校生までの自分のやってきたことを振り返ってきた。 改めて見返すと、自分がなにかを習得するには4つのステップをだいたい踏んでいることがわかった。

  1. 学ぶ
  2. 手を動かす
  3. 見てもらう
  4. 教える

これからプログラミングを学ぶ人にとっても、このステップを踏んでいくのは意味のあることだと思っている。 そこで、学んだテーマごとにそれぞれのステップで私がどういうことをやっていたのかを振り返ってみようと思う。 書いていたら内容が思いのほか長くなってしまったので、後半はまた明日。 テーマがMESEではないのでまた今度整理を試みる。

Webページ

学ぶ

主にインターネットに転がっていた情報で勉強。Webサイトを構成するHTMLとCSSを学んだ。 友達をサイト作りに誘ってからは、友達から教えてもらう情報も多くあった。 出来上がる「実体」ではなく「指示書」を触る経験はこのあとのプログラミングを勉強する上で役に立った。

手を動かす

小中学生のときに、しりとりの必勝を取り上げたWebページを作った。 チュートリアル通りのサイトだけでなく、自分の作りたいサイトも同時並行で作っていったのがよかった。 全部分かったつもりでも、やりたいことに当てはめようとすることで分かっていない部分が見つかった。

見てもらう

Webページという特性上、作ったものはほとんど公開した。 無料のレンタルサーバを借りて、実際にインターネットに公開した。 更新するたびに友達にも教えて、新しく覚えたことを共有した。

教える

小中学生のころはほぼ同時スタートだったこともあり、教えるというより学びあうという形だった。 高校の授業でHTMLを扱ったときには、うまく表示されなくて困っているクラスメイトに教えたりもした。

プログラミング言語の文法

学ぶ

いろいろなプログラミング言語を触ったことは、総じて良いことだったと思う。

いろいろな言語の文法を学ぶことで、理解が立体的に深まった。 新しいプログラミング言語を覚えるときには、知っている言語との比較をして、同じ挙動を示すコードを書いた。 知っている言語が増えていくにつれ、加速度的に言語の習得速度も上がっていった。

いろいろな言語の用途を学ぶことで、自分が挑戦できる範囲を広げられた。 プログラミング言語はその実行形態や文法によって用途の向き不向きがある。 システムプログラミングにつかうC言語、かゆいところに手が届くPerl, 大規模なシステム開発に使うJava, Flashを作るのに使うActionScript。 正しい道具の選択で生産性が格段に違うこと、すべてを解決する唯一無二の言語など存在しないことを思い知った。

主に書籍と人から教えてもらうことで勉強した。 書籍はプログラミング言語1つごとに一冊買った。C言語は『独習C』、Javaは『独習Java』、Perlは『初めてのPerl』、Erlangは『プログラミングErlang』を買った。 いまから同じようなことを勉強をしたい人には、Go言語とJavaPythonOCamlを勧める*1。 買った本に書いてあった内容のうち、わからなかったものを友達やTwitterのフォロワーさんに教えてもらった。

手を動かす

Webページのときもそうだったが、学んだ文法の範囲で遊べるだけ遊んだ。 四則演算とキーボードからの入力を覚えたら、解の公式を使うプログラムを書いてみた。

見てもらう

文法を勉強しただけのころは特になにも公開していなかった。

教える

プログラミングの授業が始まったとき、クラスメイトに教える機会を得た。 自分がつまったところは同じようにクラスメイトもつまることが分かった。 また、教えることで理解も進んだ。なんとなく理解してつもりで飛ばしたところを聞かれると、プライドのためにも調べざるを得なかった。

プログラミングに使うツール

学ぶ

テキストエディタバージョン管理システムの使い方を学んだ。

テキストエディタは最初はTeraPadを使っていて、C言語を勉強するタイミングでNotepad++に移った。その後、使えるのがカッコいいという理由だけでVimに移った。 いまから勉強を始める人には、Visual Studio Codeを薦める。

バージョン管理システムはGitを勉強した。 ただし、高3の時点ではcheckoutとcommitとresetとpushしか知らず、セーブポイント的な使い方しかしていなかった。 勉強は大きなアプリケーションを自分でつくるときになってからでも遅くない。

手を動かす

道具なので必然的に手を動かした。

見てもらう

エディタの設定は友達に見せた。

教える

プログラミングの授業で、クラスメイトに副次的に教えていた。

データ構造とアルゴリズム

学ぶ

リスト構造や木構造基本情報技術者試験の勉強で存在自体は知っていた。 高校の愛好会で受けたC言語のe-learningで、連結リストや二分木といった有名なデータ構造の実装方法を勉強して試した。

アルゴリズムは学校の授業と愛好会の活動で学んだ。 マージソートクイックソートといったソートアルゴリズムニュートン法やルンゲクッタ法といった数値計算アルゴリズムは、高校の授業で学んだ。 多角形の面積の求め方や最短経路探索などのアルゴリズムは、愛好会で参加したプログラミングコンテストで学んだ。

手を動かす

リスト構造はメモリ上の概念が分かりにくかったので何度も何度も書いた。授業中に紙に書いたりもして、最終的にはソラで書けるようにまでなった。

見てもらう

あまり実装を見てもらったりはしなかった。すればよかった。

教える

高校の専門授業の定期試験が近づくとクラスメイトに教えたりした。

Unix系OS

学ぶ

高校の授業で初めてVine Linuxを触り、基本的なコマンドやパイプやリダイレクトといった技法を知った。 セキュリティキャンプ参加前に、自分のノートPCにUbuntuデュアルブートさせた*2

いまから初めて触るならUbuntuDebianがいいと思う。 VMware PlayerやVirtualBoxHyper-Vで仮想化するか、Windows Subsystem for Linuxを使うのが良さそう。

手を動かす

高校のパソコン室と教室にVine LinuxのPCがあったので日常的に触っていた。 セキュリティキャンプのときにいろいろなディストリビューションを触った。

見てもらう

特に見てもらった記憶はない。

教える

特に教えた記憶はない。

ライブラリの使い方・作り方

学ぶ

標準ライブラリは、各プログラミング言語の文法を覚える際に合わせて覚えた。細かい使い方はWebページで調べることが多かった。 言語によってその作法が異なるので、それぞれ覚える必要があった。

C言語ライブラリの使い方*3は、高校の友人に教えてもらった。 C言語ライブラリの作り方は高校の愛好会で受けたe-learningで覚えた。別にインターネットにも転がっている内容だと思う。

手を動かす

標準ライブラリを覚えるために短いプログラムはたくさん書いた。 友達の作ったライブラリを使われてもらうこともあった。うまくビルドができず、ソースコードは様々な環境で動くとは限らないことを知った。

見てもらう

これに関してはとくにアクションを起こしていなかった。

教える

特に教えた記憶はない。

CPUの仕組み

学ぶ

勉強したアーキテクチャはPICとMIPSとH8SX。振り返ってみると意外と触っている。

PICは高校の授業でライントレーサーを作るときにやった。 MIPSはCPUの仕組みを知りたいと言ったらTwitterのフォロワーさんに紹介されて学んだ。 H8SXは課題研究でコンテキストスイッチを実装するときに使った。

私が初めて触ったアセンブリは授業で習ったPICマイコンだったが、いまから学ぶならPCに使われるCPUを勉強したほうが良い。 おすすめの本は「コンピュータの構成と設計」。

手を動かす

授業でライントレーサーと作った。 課題研究でコンテキストスイッチを実装した。

見てもらう

課題研究の発表をした。

教える

H8SXのアーキテクチャは、課題研究チームのメンバーに教えた。

*1:C言語で書かれたソフトウェアはいまだに多いので勉強の価値はあるが、文法に罠が多すぎるため初期に触るならGo言語のほうがいい。Perlは歴史が古く、いまはPythonにその役を譲っている。Erlangは用途が特殊すぎてこの時期に勉強するものではなかった

*2:ちなみにインストールに失敗して起動しなくなったこともあった

*3:ビルドの仕方、インストールの仕方、ライブラリを使ったプログラムのコンパイルの仕方