プログラミングを勉強しているときに困ったこと

振り返りが終わってしまった。今後しばらくは振り返っている間に頭に浮かんだことを書き下していくことにする。 今日は自分がプログラミングを勉強しているときに困ったことを紹介する。

振り返りが終わってしまった。今後しばらくは振り返っている間に頭に浮かんだことを書き下していくことにする。 今日は自分がプログラミングを勉強しているときに困ったことを紹介する。

どこまで一般的なものなのかわからず最初の一歩を躊躇する

課題

初めて触ったプログラミング言語C言語だった。 「C」と名前がつくことから、D言語とかG言語とかあるのか?ともしかして一部の業界でしか使われていない?と不安になった。

解決

いくつものプログラミング言語を勉強することで不安が解消された。よって、まず一歩踏み出してしまうのが良い。 古今東西すべてのソフトウェアを単一のプログラミング言語で作ることは出来ない *1

文法を勉強した後に途方に暮れる

課題

最初は文法をマスターすることこそがプログラミングのゴールだと思っていた。 しかし、勉強が終わってもExcelChromeも実装できる気がしない。 明らかに勉強が足りていない分野があるが、その名前がわからなかった。

解決

友人に聞いてしまった。「あれはどうすれば作れるのか」「ああいうものを作る場合どんな知識がいるのか」と聞くことで、 まず技術の名前を知ることができた。

練習問題がない

課題

プログラミング言語の文法を学んだ」というのは、学校の勉強で言えば「教科書を読んで公式を知った」程度の状態。 当然のことながら練習問題を解きたくなる。しかし、計算ドリルのような手ごろなものがなかった。

解決

いろいろ足掻いた。が、世界はここにまだ課題を持っている気がする。

  • 標準ライブラリを片っ端から使ってみた *2
  • アルゴリズムコンテストの問題を解く
  • 人の書いたライブラリを使ってみる
  • 自分でライブラリを書く
  • 車輪の再発明をする *3

みんな言うことが違う

課題

タイトル通り。勉強しているといろいろなことを言ってくる人がいる。 「プログラミングは単価の安い人間のすることだ、設計を学べ*4」 「目的なしにプログラミングを勉強するな*5」 「コンピュータサイエンスなんて使わないでもソフトウェアは書ける((正しい。が、私はソフトウェアで付加価値を訴求しようと思ったら必要になった。)))」などなど。 どれを真に受けたらいいのかわからなかった。

解決

とにかくいろんな人に話を聞きまくる。いろいろなチャネルからつながりをつくるのが重要だと、いま今振り返ると思う。 もちろんどれも良心から言ってくれたものだし、正しいことも多くある。が、この投稿も含めて一個人の意見でしかない。 Twitterや勉強会は普段会えないような人たちに合わせてくれる良い機会を与えてくれた。

*1:たまにJavaはなんでもできると思っている人がいるが放っておいていい

*2:ある程度標準ライブラリが豊富な言語でないとあまり効果はない。C言語とかはダメ

*3:Webサーバを自分で書くとか

*4:これはSI業界の人の発言で、実際SI業界ではそうだと思うが他は違う。うちの業界は違った。

*5:モチベーション維持という意味ではある意味正しい。が、何ができるのかわからないうちは「まず触る」で良かったと思う。

私のパソコン歴(11) : 大学生を振り返って

振り返ってみれば大学時代はとても充実したものだった。 ただ「人より多少プログラミングができる」程度だった自分が大きく伸びることができたと思う。 大学に入って伸びることができたのは何故だろうと考えてみた。

理論を学んだこと

当然といえば当然なのだが、講義を受けることでコンピュータサイエンスの基礎を学ぶことができた。 この分野の最先端を走る研究者たちから直接教わることのできる時間は、とてもかけがえのないものだった。 当時は「これを仕事で使うことがあるんだろうか」と懐疑的なこともあったが、仕事ではその知識が大いに役に立っている。 知識のインデックスを張っておいたおかげで、「これはあの分野に答えがありそう」といった嗅覚が働く。

ともに学ぶ仲間が近くにいたこと

近くに住んでいて同じ志を持つ仲間がたくさんいることは、いろいろなプラスの面があった。

話題が通じる

ソフトウェア関係のニュースが流れるとその話でもちきりになった。 日常会話のジョークでも、「話題のスタックポインタが壊れた」「夜道で相手とデッドロックした」といった話が通じた。 大学で出た課題について一緒に考えることができた。

誘われる

学園祭実行委員会、プログラミングコンテストセキュリティキャンプのチューター、リクルートインターン、Web開発のアルバイト、勉強会の発表。 これらはすべて人から誘われたものだ。もちろんそこで「面白そう!」と飛びついたのは私だが、一人だけでは挑戦しなかったものが山ほどある。

人に教えられる・人から教われる

「人に教えるには自分で理解するより3倍深く理解しなければならない」とは一般的に云われることだが、実際にそうだった。

大学に入って思ったことは、別にそこまで専門分野が好きでもない人もいるということ。 この学類に入ったことを後悔してほしくない、この分野のことを少しでも好きになってほしいと思った私は、最初の勉強で躓いているひとに自分の知っていることを教えた。 最初は自分の知っていることを伝えるのがただただ面白かったが、だんだん全てわかりやすく教えてしまうと相手の身にならないこともわかってきた。

教わる側に回ることも非常に多かった。夜の大学で突発的に始まる数人だけの勉強会や、友人の部屋に行って飲みの席で紙とペンを使って教わることもあった。 宿舎の公衆浴場でのぼせるまで専門の話を聞いていたこともあった。

自分の身の丈を知ることができる

自分の能力がひざ元にも及ばない人に何人も出会うことができた。Linuxカーネル、コンピュータによる証明の形式化、Webデザイン、Webシステム開発スマートフォンアプリ開発プログラミングコンテスト、セキュリティ、プログラミング言語・・・ 自分よりもまだまだ詳しい人がいる、という事実は勉強のモチベーションを大いに上げてくれた。

アルバイトという長い職場体験ができたこと

自分の志す業界にアルバイトとして雇ってもらうことで、趣味と仕事の違いを知ることができた。 もちろん、自分がやる仕事は本物のお金が動く。職場体験といっても緊張感のある体験ができた。 姿勢面で何度も叱られもしたり、感謝もされた。

自分のいまの力を試す機会に恵まれる

学生という身分はなかなかに恵まれていた。 企業からは採用活動の一環としてソフトウェアの無償提供を受けられたり、アルバイトとして雇ってもらえたり、懇親会の参加費を割り引いてもらえたり、 学生相手にやる大きな仕事がやれたりする。 学んだばかりの知識や技術をすぐに生かすチャンスが目の前に転がっている。

私のパソコン歴(11) : 大学4年でやったこと

大学4年は2,3年ほど精力的には活動していなかったが、それでもアウトプットがあった。

アルバイト

先輩に紹介してもらって、東京国際大学の教授さんに個人でアルバイト。 月一でおいしいごはんをもらいつつ1人だけでWebシステム開発をやっていた。 実現したいことを一生懸命伝えてくれるので、上手い落としどころを探る練習ができた。

やさしい日本語言い換えシステムの開発

最初は先輩から引継いだRubyコードを保守していたが、n段ネストかつ数百行にわたる巨大関数に心が折れてフルスクラッチで書き直すことに。 ルールベースの書き換えシステムなので、実現したいルールを聞いて汎用性を調節した。 trieを用いたルールマッチング機構をRubyで実装し、Sinatraを使ってWebシステムにした。

辞書作り支援システム

傍らでやった別システム。いろんな言語に対応する辞書作りを支援するシステムを作った。 途上国ではインターネットの品質が安定しないため、担当作業ぶんダウンロードして編集ぶんをアップロードする形式にした。 素人でも扱いやすいデータ形式にするため、Excelファイル形式で出力とインポートを行った。

卒業研究

結局、機械翻訳は断念。 Twitterのつぶやきの連投を検知してまとめる研究を始める。 成果が出るのが遅れたが、最終的に先行研究である先輩の性能を超えることができた。 意義のある研究テーマを設定するのはとても難しいことなんだと実感。

Life is Tech!

中高生にプログラミングを教えるLife is Tech!という企業のメンターに応募。 丁寧な研修を受けた。といっても技術的には既に知っていることばかりだったので、どちらかというとメンターとしての心構えなどを主に勉強させていただいた。 何回か体験会に参加し、夏のキャンプに1回参加した。 子供たちの飲み込みはとても早く、また人生を変えるかもしれないきっかけに立ち会えたことに純粋な喜びを感じた。 古株メンターや社員の方々は子供たちの安全を第一に考えるプロフェッショナルで、教育に誇りを持っているのが恰好よかった。

私のパソコン歴(10) : 大学3年でやったこと

大学3年生では個人的に大きなプロジェクトに関われた年だったと思う。

アルバイト

3社目のアルバイト。こちらもサーバインフラ管理がお仕事。 コンテナ(LXC)や構成管理ツールなどの使い方を覚えたりした。 途中からだんだんアプリ開発にも関わっていくように。

企画ログインシステムのスクラッチ開発

かなり時間を使った。要求定義、デザイン、設計、開発、保守、運用すべて自分で実施。 CakePHPを本気で勉強、フレームワークの強さを思い知った。 初めて全体で1万行overの規模のプログラムを書いた。

リクルートインターン

2か月間かけて自分たちで企画と開発を行うインターンに参加。 最初の1ヵ月と一週間は企画を考えて終わったので、残りの3週間で実装。 乗換案内を実装する必要があったのでC++で経路探索エンジンを実装。PHPAPIのエンドポイントを作った。 事業化することになったのでクライアントサイドも作ることに。 デザインは専門の人にやってもらいつつ、Objective-Cで実装をした。 この時期あたりから実力が社会に通用するかもしれないという自信を持ち始める。

勉強会

細々といろいろ発表。

WhitespaceのCPU

講義でVerilog勉強したのが面白くてそのままCPUを作ろうとしてみた 論理回路を作るときとソフトウェアを作るときでは考え方がぜんぜん違うことを実感 ちなみにPLLとかも知らないときに作ったので論理合成ができない(!?)

Emacsいじめの現場

Emacs好きの先生の主専攻実験でカーネルモジュールを作れと言われたのでやった。 タスクのリストを監視して、emacsが立ち上がったらカーネルからメモリロックしたり名前をvimに変えたりする鬼畜モジュール。

産学官連携推進室の研究発表

Twitterの即時話題推定技術と称して、高速に流れるつぶやきのトレンドを追えるようなものを研究。 流れていく関連したつぶやきをまとめて可視化することを目的とした。取得と類似度計算までやって時間切れ。

就職活動

逆求人イベントに参加。学生がブースに座り、企業が指名して面談を持つ形。 幸いにも10何社か指名を頂き、あふれてしまったのでそのうちの何社かと面談。いままでやったことをLT形式で発表した。 面白がってくれた1社が今いる会社。

研究室配属

ことばに興味があったので自然言語処理研究室に所属した。 最初は機械翻訳チームに入るが、あまりのわからなさに挫折。

私のパソコン歴(9) : 大学2年でやったこと

大学2年は今までの勉強がいろいろなところで役に立った。飛躍の年。

同人誌

『プログラミングおさんぽまっぷ』を大学の先輩に見てもらいながら執筆。プログラミング言語の文法をとりあえず覚えただけの人向けの本。 その次に学ぶべきものとしてソフトウェアに関係するあらゆるものを"駆け足"で紹介した。 いま見返してみるとまだまだなところはあるんだけれど、反響が来たのがすごくうれしかった。

勉強会参加

いろいろ発表した。ライトニングトークと呼ばれる軽めの発表でテンポよく発表するのが楽しかった。

アルバイト

iPadアプリケーションの機能開発

Objective-Cで開発。勉強したけれどあまり好きになれない言語だった。 初めてここでプロダクションの長いコードを見た。数百行にわたる関数とかあってかなり衝撃を受けた。 「あ、仕事でもこの品質のコードがあるんだ」と、ちょっと自信がついた。

サーバ保守

インフラ屋さん見習い。先輩の横で土曜日に仕事。 設定ファイルの書き方やシェルスクリプトが上達。「三度の飯よりバックアップ」をずっと言われ続けていた。 apacheの設定をミスってホスティングしているすべてのサービスにつながらなくなったときは本当に心臓が止まるかと思った。

学園祭実行委員会

「企画ログインシステム」という企画団体と委員会の連絡システムの開発。 先輩が作ってくれたものを保守していた。CakePHPで書かれたもので、ここでフレームワークの概念を知る。 ちょいちょい機能追加しつつ既存の問題点を明らかにしていった。 人に要求されて、それなりの時間である程度のレベルのものを早く上げることが楽しくてハマった。

私のパソコン歴(8) : 大学1年でやったこと

入学して半年は自炊してみたり早く寝たりと健康で文化的な生活を試みていたため、 実は必要以上にコンピュータを触っていなかった。 よって、あまり実績がない。もっといろいろやってた気がするのだけれど思い出せない。

大学1年生の実績

学園祭生中継プロジェクトのフロントエンド

先輩のピンチヒッター。ActionScriptTCP/IP通信してニコニコ動画みたいなことをやる企画。 サーバサイドは同級生に任せ、動画再生しつつコメントが流れるように作った。 NGワード規制やチャンネル切り替えなどの機能を実装。 当日の2週間前くらいから作り始めて当日も作っていた。 TCP/IPの知識が活きて、障害発生時の問題の切り分けとかもできた。

学園祭企画特設サイト

高校時代にちょっとだけ触ったPapervision3D*1jQueryを使ってちょっと飾りっ気のあるサイトを作成。 レイアウト案をもらって作る練習ができた。

大学1年生で関わったコミュニティ

同級生

めちゃめちゃ濃い人もたくさんいた。部屋に転がり込んで夜遅くまでコーディングしたり、 風呂場でひたすら計算機科学の基礎の話を聞いたり、大学入りなおした本当に意識の高い同級生の話を聞いたり、 Lisp人工知能作ろうとした話を聞いたり、たくさんの「ソフトウェアが好き」な人に出会った。

学類誌編集部

めちゃめちゃ濃い人がたくさんいた。C++が大好きな人、Perlが大好きな人、LaTeX組版が大好きな人、 Coqが大好きな人...

学園祭実行委員会

コンピュータに明るくない人との関わりがたくさん持てた。彼らにとってコンピュータはあくまで問題解決の手段。 解決を待っている大きな問題があって、しかもしがらみがない。自分の腕試しにはもってこいの環境だった。

産学官連携推進室

1年からでも入れる研究室のようなところ。 しりとりで大学に入学したので、そのまま自然言語処理をやることに。

*1:書くの忘れてた...

私が思うプログラミングの楽しさ

あまりに眠いので今日は振り返りはお休み。 代わりに、私が思うプログラミングの楽しさについて語る。

お金がかからない

プログラミングに使うツールは、たいていの場合無料でも十分使えるものが公開されている。 情報も、本でなくともWebにたくさん役に立つ情報が転がっている。

どこでもできる

特殊な用途でない限り、大抵のものは手持ちのコンピュータで動かすことができる。 実験室は要らないし、数千万円する実験器具もない。 ノートパソコンさえあれば、どこでもできる。

元に戻せる

扱っているのは0と1のビット列。 たとえ間違えてしまっても、もとに戻せる。 作り直さなくてもいいから、「またやり直してみよう」という気持ちになる。

手先の器用さが関係ない

キーボードの「あ」は、キーのどの部分を押しても「あ」が入力される。 熟練すれば確かにキーをたたくスピードは上がるが、大抵の場合プログラミングは考えている時間のほうが長い。 生まれつきの手先の不器用さは、コンピュータの前ではそこまで致命的な差にはならない。

人の役に立つ

つまり、お金がもらえることもある。 もちろん仕事にするにはそれなりの責任を伴うが、趣味でもたくさんの人を幸せにすることができる。 自分の代わりにソフトウェアが人を手助けするので、自分だけが動くよりも何十倍、何千倍、何十万倍もの人を手助けすることができる。

どこまでも極められる

いくら勉強しても、「すべてのことがだいたい分かった」とはならない。 全クリのないRPGをやっているような感覚になる。 クリアしたと思っても隠し通路や新大陸がいくつも身つかる。