Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
不可視の巨人

この記事は FUN Advent Calendar 2016 17日目の記事の予定でした。

はじめに

私は高校生の頃からプログラミングはしていたのですが、大学入学後してからびっくりするほど見えている世界が広がりました。

この記事の内容は高校の時に見えている世界が狭かった理由の考察と、私なりの解決策の紹介です。

簡単に自己紹介

  • 上原(本名ではありません。念のため)
  • 学部2年
  • 知能システムコース

大学入学前の私

 唐突ですが、自分語りから始めさせてもらいます。私は高校の頃から一応コンピューター部に所属していて、JavaやらCやらでゲームを書いていました。ポインタなどはなんとか理解して、Player クラスや Bullet クラスなどを作成して継承をしたりしてゲームを作成する程度のプログラミング力で、Java Appletで和菓子になって洋菓子を撃ち落していくシューティングゲームとかを作っていました。 先輩も数人いましたが、使っているのは同じくCとJava。ゲーム以外の作り方なんかも全く分からず、ネット上でデータをやりとりするとかそういったことなんて、なんかすごい人たちが難しい知識を使ってやることなんだと思っていました。 このころはプログラミング言語なんて実用的なのはC++とJavaとC程度しかないと信じていて、他の言語はよく分からない人たちが趣味でやってるものだと漠然と思っていました。だって他の言語なんて検索してるときに見かけることなんてほとんどないですし、それはあまり使われていないってことだろうから実用的じゃないよね、って感じです。 Java入門とかでも、ある数字が素数かどうか判定するプログラム程度しかろくに使えそうなもん作ってないし。他の先輩なんかもそんな認識で、だからこんなもんなんだろうなぁと思っていました。

未来大学に入学して

 そんなプログラミング感覚のまま高校を卒業して、プログラミングがそこそこ好きだった自分は情報系の大学に進もうと思い、数学ガールの著者の結城浩さんが講演をしたという話から未来大学に興味を持ち本学に入学しました。 そして私は神奈川から越してきて下宿に入ったのですが、そこがたまたま某緑のITヤクザの寝床でもあったのです。そしてそれが私の技術的開眼の原点となりました。 拠点が一緒なので食事の時や帰りの時なんかに技術系の話をするようになるのですが、その内容がいつも私の知らない世界の話なのです。プログラミングは好きなので技術系の情報収集もしていましたが、それでも全然知らない情報ばかりでした。でも半信半疑で調べてみると実際に存在するし本当にすごい技術なのです。彼にとってはすべて常識のようなことだったのでしょうが、私は毎回話すたびに目からウロコといった状態でした。 それらのツールや技術を吸収していき、私はできることも生産性も高校の頃とは比べ物にならないくらい増えていきました(あくまで主観ですが)。何が変わったかといえば、端的に言えば巨人の肩に乗れるようになったのです。すでにあるものを利用するようになったのです。

「Unixという考え方」より少し引用します

よいプログラマはよいコードを書く。偉大なプログラマはよいコードを借りてくる  ソフトウェアを大量に書く一番よい方法は、借りてくることだ。ソフトウェアを借りるということは、他人のモジュールやプログラム、設定ファイルを自分のアプリケーションで使うということだ。自分の仕事に他人の成果を取り込むことで、先人の努力を活かし、コードの有用性を一段と高めることができる。先人のソフトウェアは、より多くのアプリケーションに活かされてより価値のある存在となるし、取り込んだソフトウェアも、投資が少なくてすむ分だけ相対的に大きな収入を生み出すことになり、どちらにとっても好ましい状況となる。

 一般に信じられているところとは反対に、独自技術症候群は創造性を伸ばさない。他人の仕事を見て、自分の方がうまくできると主張してみてもそれだけで創造性が増えるわけではない。既存のアプリケーションをゼロから設計し直すことは模倣ではあっても創造とは言わない。むしろこれを避けることで、新しい、わくわくするような設計世界への扉が開かれる。既存のルーチンを書き直さずにすむためにできた余裕で新しい機能を開発できる。

なんかいろいろ書いてありますが、要するにコードを借りてくる知恵を手に入れたことで、晴れて私は目指すべき偉大なプログラマーに少し近づけたわけです。

なぜ巨人が見えなかったのか

 先ほど述べたように、高校生時代と大学時代とで大きく生産性が上がったのは私が巨人の肩に乗ることができるようになったことに起因します。 しかしなぜ利用したほうが明らかに得な巨人を見つけられなかったのでしょうか。その理由を少し考察してみます。

1.そもそも情報にアクセスするルートがない

 これが一番の原因かなと思います。そもそも他の人に言われるまでそもそも普段何気なくしていることが「プログラミングで解決できる」ということがわからないのでそれについて検索をかけたりしない、というパターンです。 いわば、巨人がいることを知らないのです。 プログラミング入門書などで「Hello World」と出力したり素数を求めたりとか、非常に不毛なプログラムを組むことしかしないので、WebページのデータをひたすらExcelにコピペしたり延々と同じマウス・キーボード操作を行い続けたり、大量の画像の形式やサイズを一つ一つ変更していったりといったことをしているとき、コンピューターにやらせたいなぁと思いながらもそれを自動化できるなどとは思わないのです。 大学入学初期の自分がこの状態から脱出できたのは、某緑の人にいろいろと指摘されたからでした。

2.現状維持を選択してしまう

 高校生のころはC言語ならなんでもできると聞いて、じゃあC言語だけ覚えればいいや、と思っていました。Java言語の入門書程度の内容を覚え、初歩的なオブジェクト指向の感覚をつかんだときも、「これでだいたいのことできんじゃん!」などと思っていました。 まぁ実際それらは正しいのですが、より高度な言語の機能を使ったり、使う用途に合わせた言語を選択することでより生産性はどんどん上げることができます。 しかし、高校生の時はそのことになかなか気づくことができませんでした。学んだところで大して変わらんだろうと思っていました。

この現象は「ハッカーと画家」の中で「『ほげ言語』のパラドクス」として紹介されているので引用します。

 プログラマは自分の好みの言語を深く愛する質だし、私は誰も傷つけたくないので、ここで仮想的なプログラミング言語「ほげ」を使って私のポイントを説明しよう。「ほげ」は抽象度のスペクトルのちょうど真ん中に位置するものとする。もっともパワフルな言語ではないけれど、Cobolや機械語よりはパワフルだ。  そして、仮想的な「ほげ」プログラマ氏は、Cobolも機械語も使わない。もちろん機械語なんて使わない。あれはコンパイラのもんだ。それにCobolだって、あれで何かをきちんと動かしたことがあるって人を知らないよ。結局のところ、「ほげ」にある機能xがないもんな。  このプログラマ氏がパワーのスペクトルを見下ろしている時、彼にはそうしているという自覚がある。「ほげ」よりも力の弱い言語は、明らかに力が弱い。彼が慣れ親しんだ機能がないからだ。しかし、このプログラマ氏が反対の方向に目を転じた時、彼は自分が見上げているのだということに気づかないのだ。彼が目にするのは、変てこりんな言語ばかり。たぶん、それらは「ほげ」と同じくらいパワフルなんだろうけど、どういうわけかふわふわしたおまけがいろいろ付いているんだ、と思うだろう。彼にとっては「ほげ」で十分なのだ。なぜなら「ほげ」で考えているから。

これは筆者のPaul Grahamが働いていた時に、Lispを用いることでどうして競合する他社よりも圧倒的に速く開発を行えたかについて書いている章の一部です。

 今現在でもでそれがいらない、なくてもなんとかなるものだと思っているものでも、使いこなしてしまえばとても便利ということがあるのです。 ある種のものは考え方自体を変えるでしょう。これが生産性を大きく変化させます。 えらく大げさな表現ですが、パラダイムシフトとかコペルニクス的転回が起こるともいえるでしょう。 かつて無くてもいいと思っていたものが、むしろそれなしでは生きていけなくなるほどのものになるのです。さらに、その変わった考え方・見方でしか見ることのできない巨人というものも存在します。  この例は言語の選択に限らず他の便利なシステムやサービスなどを利用することにもいえるでしょう。 例えば、GIt というものがいいという話をどこかで聞いたことがあるかもしれませんが、これは最初に学ぶときはなかなかハードルの高いものだと思います。突然出てくるリポジトリやらコミットやらという概念がよくわからず「バージョン管理システムなのだから、やっていることは要するにこれまで hoge_2.zip, hoge_3.zip, ... などという形でバックアップを取っていたものを、なんかコマンド叩いて自動化してるだけでしょ、今まで通りでも困ってなかったしいらないな。」と思ってしまうかもしれません。しかし、このGitというものが「ほげ言語」プログラマから見たへんてこりんな言語であり、リポジトリやコミットがふわふわしたものなのです。

3.英語という壁に隠れていた

 高校生の頃はなぜかプログラミングについての情報なんてだいたい日本語化してると思っていたような気がします。世間では英語の情報がほとんどだと書いてある記事を見かけることもありましたが、英語の情報なんて読まなくてもなんとかなっていました。だって検索したらだいたい日本語の情報出てくるし。いろいろ調べて検索をかけてみる機会はあったはずなのですが、なぜか英語の記事があった覚えがありません。調べたいことの大体は日本語で検索をかけていたというのもありますが、多分無意識のうちに開かずに飛ばしていたんだと思います。しかし、ある程度専門的な情報になっていくにつれ、情報が英語で書かれている比率は多くなっていきます。得に最新の情報なんてほぼ全て英語です。英語の情報が検索でヒットした時に「うげ、英語じゃん」で即戻るボタンを押していたとき、私は巨人を見落としていたのでしょう。英語の記事も頑張って読むように意識しだすと、不思議なものであれだけ見かけなかった英語の情報はむしろ情報源のほとんどになり、今ではむしろ日本語の情報があれば嬉しいなみたいな感覚です。  ちなみに、私が英語の情報も積極的に読みだしたのは情報表現入門の授業のときでした。教授がProcessingの公式ドキュメントは優しい英語で書かれているから頑張って読むといいと言っていたので、言われた通り素直に(というよりは周りに対して見栄を張る為という理由の方が大きかった気がしますが)英語で読むように努めました。それからというもの、英語のドキュメントなどに遭遇してもなんとか読もうと努力するようになっていき、今ではあまり抵抗なく読めるようになりました。英語の情報を仕入れる練習として、まずProcessing の公式ドキュメントを英語で読むようにするところから始めてみるのもいいかなと思います。

巨人を見つける為には

 私の場合は生身の人間と実際に雑談的に技術系の話をすることで一番知識が身についた気がします。背伸びして食らいつくくらいの気持ちで会話していたら、自然とそれに合わせて成長していきました。なので私がお勧めするのは、なんかよくわからないけど怖いすごい人たちがいる世界に飛び込むことです。意味のわからないことをすごい楽しそうに話しながら、なんかすごそうなことをしている人たちです(漠然としていてすいません)。そういう人たちがいるのはIT系の勉強会やハッカソンやカンファレンスなどのイベントだったり、サークルなどのコミュニティー、さらには Facebook や Twitter などの SNS などでしょう。他にも、もしかしたらあなたのいる下宿なんかにも生息しているかもしれません。そういったすごそうな人たちが何を言っているか、何を使っているか観察してみましょう。彼らが頻繁に口にするよくわからない単語を調べてみましょう。そういった人たちとできればどんどん雑談でもいいので話しましょう。どんどん新しい知見が増えますし、なにより楽しいです。

まとめ

 いろいろイベント出てみよう!凄い人と関わってみよう!楽しいしすごい勉強になるぞ!

終わりに

 投稿が遅れてしまって本当にすいません。最初は Python について書いていこうかなぁと思ったのですが、なんか書いているうちに「たかだか1年ちょいPython触っただけの人間がなに偉そうに語ってるんだ」などと謎の自己嫌悪に陥って思うように筆が進まなくなり、考えに考えているうちに内容が二転三転と内容が変動していき、最終的には私の過去の大反省会が始まりこのような形の記事となった次第であります。結局逆にめちゃくちゃ偉そうなことを言っている記事となってしまいました。  高校生時代ひたすら狭い世界でプログラミングをしていた私のような人が、これを読んで何かのイベントとかに参加してくれたらいいなぁと思って書きました。プログラミングが好きなら、せっかくならいろんなことができるようになった方が面白いですしね。  明日はつらね先輩の最高のキーバインドで腕が動かなくなるまでです。お楽しみに!

宣伝

手っ取り早く簡単に巨人に乗ろう!

 よくわからない人はとりあえず汎用言語 Python を使ってみましょう!Pythonを利用すれば初心者にもやさしい簡単でシンプルな文法ですぐに巨人の肩に乗ることができます。Python はあなたのコンピュータでのあらゆる処理に対してプログラマブルなハック手段を提供します。アーミーナイフとしての Python はあなたの周りの面倒だと感じること全てを技術をつけるための勉強道具にし、さらには周りとの差をつけるチャンスと変えるでしょう。Word、Excel やブラウザ、マウスやキーボード、Twitter や Slack の操作から、Web上でのデータの取得や送信はもちろん、複雑な微積や行列計算、統計などの処理に加えてそれらのグラフの描画に至るまで、様々な大学の授業課題をこなす手助けとなりますし、セキュリティやちょっと悪いこと、今流行りのAI・機械学習もとても得意です!また、再配布可能なライセンスで公開されている Python は様々なソフトウェアにてマクロや拡張機能記述言語として使用されています。Vim、Sublime Text や OpenOffice などに加えて、Maya、Gimp、Blender などでも使用されています。デザインコースの人でも覚えていけば単調作業をマクロとして記録するなどしてどんどん作業を効率化していくことで他の人と差をつけることができるでしょう。これら以外にも20年にわたり数多くのハッカー達の作り上げてきた大量の機能が利用できます。さぁ、公式チュートリアル を見ながら今すぐ始めてみましょう!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment