kolmas.tech note

雑記と思索、偏った技術の覚え書き

私のプログラミング遍歴:大学生〜ポスドク・就職

前回のエントリの続き。 blog.kolmas.tech

大学生(2008〜2012年)

  • 文理融合系の学部に進学。色々な専門が入り乱れる学部で、その中でコンピュータ分野も存在感を持っていた。
  • かなり自由度高く様々な科目を取れるカリキュラムの中で、プログラミング・コンピュータサイエンス系の科目を取りまくる。コンピュータアーキテクチャ、ネットワーク、データベース、情報セキュリティなど、改めてちゃんと幅広に勉強する。
    • プログラミングという観点からは、基本的なデータ構造やアルゴリズムを自分の手に馴染む道具として正しく理解したのはここが初めて1
    • 色々と視界が開ける体験をしたが、中でも習得の過程で一番感動したのは、とある授業で取り上げられた再帰呼び出し
      • その授業は、毎回の講義の最後に新しい問題が一つ提示され、その問題を解くアルゴリズムを考えて2レポートを提出、次回授業で一人ずつ発表するというスタイルだった。
      • その週の課題は「曖昧な二つの構文規則があり、入力された文字列についてそれぞれの構文規則に従って何通りの構文木ができるか数え上げる」というものだった。
        • この二つの構文規則は自己及び相互参照を含んでいて、今だったら「あーこりゃ再帰でやればいいねー」とすぐ見当がつくが、当時の私は再帰呼び出しの考え方を知らなかった。
      • 大学の図書館の作業スペースにて、その数え上げを行う関数を組もうとし、単純な繰り返しだと入れ子状に分岐していく構文木を追いきれないし、、、などと数時間悩んでいた気がする。そうしたらあるとき、「その数え上げを行う関数」自身をその関数の中から呼び出せばいいのでは?と気づいた。
        • いやそんなことできる?エラーにならない?と半信半疑でプログラム書いて動かしてみたら、できた。とても興奮した。
        • 翌週の授業で、この考え方が再帰呼び出しというものだと知った。
    • 使えるプログラミング言語の幅も少し広がる。習熟度に濃淡はあるが。
      • C:基本的なデータ構造やアルゴリズムはCで勉強した。さらに、forkしたり3、マルチスレッドしたり。シェルを作ったり、ソケット使ってネットワークプログラミングしたり。
        • 個人的には書いていて楽しい言語4の一つ。ただ、fork以降の内容は研究活動の中で実務的に使わなかったので、かなり忘れてしまった。でも資料見返せば多分すぐに思い出せる。
      • Perl:ちょっとした文字列処理をしたり、CGIでサーバサイドプログラミングしたり。
      • Common Lisp:これも入門的な段階のみ。ただ、とても好きになった。
        • 基本関数や条件述語の非手続き的な組み合わせ組み合わせだけでさまざまな問題を解くプログラムを作る、というのがとても面白い。5
      • その他にも諸々見聞きしたり人に教えたりする過程でいくつかのプログラミング言語をかじる。
        • 手続き型のプログラミング言語6のメジャーどころ7であれば、知らないものでもちょっと調べれば読み書きできるだろうという大雑把な自信を持つ。
      • 大学以前から使っていたJavaも、諸々の知見を得て書き方が多少は洗練された感がある。
        • プログラムを書けば書くほど洗練されていく感。あるときデザインパターンの資料を見たら、これいつもやっていることじゃないかと思った。やり込んでいると同じところに収斂していくらしい。
  • 研究室ではRFIDを研究ネタにしていた。
    • RFIDは、RFIDタグに書き込まれている固有の識別コードを読取機が無線通信で読み取ることで、そのRFIDタグが付いているモノの存在を個々に検知する技術。
      • 中でも、RFIDタグ側に電池が要らず、多数のRFIDタグを一括で読めるUHF帯パッシブRFID8を扱っていた。
    • 具体的には、RFIDの無線通信技術そのものというよりは、RFIDタグが読み取られたときにそれをどのように活用するのかという情報システム方面を研究対象としていた。
      • RFIDに関わる情報システムという点で、GS1の標準に関連するネタも色々やった。
    • そうは言っても、実際に動かして検証するという意味で、RFIDの読取機を動かすためのプログラムは諸々書いた。シリアルポートが使いやすいとか、他には操作用のライブラリがWindows環境向けしかないとか、そんな理由でC#に手をつける。9
      • 基本的にJavaに似た言語なのでこれまでの経験から簡単に馴染んだ。
      • 機器と通信して操作する、というプログラムを書く中で、非同期プログラミングやイベントドリブン、コールバックの考え方を心得る。
        • 当たり前のことだが、GUIのスレッドで機器の応答を同期して待ったりすると、その待っている間GUIが固まる。必然的に非同期の考え方が必要になる。
    • RFID関連の情報システム寄りの話題について実際に作って動かしてみるために、サーバサイドJavaを覚えるなどもした。

大学院生・ポスドク(2012〜2020年)

  • 研究室での活動は学部の頃から同様の話題で継続。
    • プログラミング遍歴と言う主題から外れるので詳しくは書かないが、良かったこともそうでないことも様々にあった。10
  • 後期博士課程の学生時代、学部新入生向けの情報技術に関する基礎講座の非常勤講師をする。
    • 所謂ITパスポートの入門的な内容に加えて、HTMLとCSSによるウェブページのコーディング、また、JavaScriptによるプログラミング入門的な要素を併せ持つ内容であった。
      • プログラム書いた結果が、普段から使っているウェブブラウザの上で見た目分かりやすく動くというのは、モチベーションを発揚するという点で一定程度有効だったように思う。
    • JavaScriptは、出されれば読めるしちょっと調べれば書ける、程度の習熟度であったが、授業実施を通じて何も調べることなくそこそこ書ける程度になる。
      • 人に教えようとすることで初めて得られる知見があると思う。表層を教えるには、その背景を理解していなければならない。
      • ついでに、半分冗談ではあるが、見えない全角スペースを見つける眼力や、質問サイトの丸写しを見抜く眼力などを得た。

就職〜本稿執筆時点(2020年〜)

  • 紆余曲折の末、やりたい事は学術研究というよりも、これまで取り組んでいた話題やその関連分野の技術が世の中で実際に使われるように貢献する事だと認識する。
    • 学術研究に関して心が折れた、という節も恐らくあって、その言い訳を求めてこの認識に行き着いたのかもしれない。でも少なくとも、上記の認識は嘘ではない。
  • 本稿執筆時点で、主たる業務としてプログラムを書くような仕事はしていない。
    • とはいえ、プログラミングや、より一般に情報システム関連の理解を必要とする話題が仕事の中心ではあって、こうすれば実際にできるだろうねという実感を持ってそれらの話題にあたれるのは大きい。
    • 実際に、ちょっとしたデモをするのに簡単なプログラムを片手間に書くこともたまにある。実際に動くものを使った説明は強い。
      • 大体はHTML・CSSにクライアントサイドJavaScriptで、ウェブブラウザでスタンドアロン動作するものを作っている。ウェブブラウザさえあればどこでもデモができる11、というのは便利。
      • あとは時々サーバサイドをやったり、Cのサンプルプログラムを書いたり。

結び

基本的に成り行きに任せたまとまりのないプログラミング経験である気がする。また今や、プログラミングを直接の飯の種にしている訳でもない。それでもそこそこプログラムを書いてきた、その経験から得られたものは今でも色々と役に立っている。

「実際に作ってみて初めて本質的に分かる」が信条で、そのためにも「作る」能力はメンテナンスし続けておきたいもの。また、最近は余裕がなくて全く出来ていないが、趣味のプログラミングもたまにはしたい。


  1. そんな様子なので、それ以前に書いていたプログラムは色々と力技で無理やり問題を解決している所が多く、今からしたら目も当てられない。
  2. アルゴリズムを考えるだけなので実装は不要。ただ、折角なのでJavaでプログラム実装までしていた。当時まだ研究室に入っておらず、サークル活動などもしていなかったので、時間は有り余っていた。
  3. 看取り損ねてゾンビプロセス量産したりもした。しかし「看取る」(しかも子供を!)というのはすごい表現だとは思う。
  4. 動的メモリ確保とかポインタとか、生々しくて、ある意味とても分かりやすいから。アセンブラとか機械語とか書く人の前で、C程度で生々しいとか言っちゃいけないだろうけど。malloc
  5. 何か実用的なプログラムを作れる程には至らなかったが、とても印象的だったのを覚えている。
  6. Common Lispは例外。
  7. Brainf*ckとか読み書きしろと言われてもちょっと厳しいので言い訳。
  8. 何も知らない状態で行った研究室訪問で初めてデモを見せてもらった時はこれスゲーと思ったものである。
  9. 研究室にC#を信奉する先輩がいたことも影響。また、高校生の頃に何故か買い、しかし使わずに宝の持ち腐れになっていたVisual Studio 2005の有償版を持っていたこともある。
  10. その話はまた別途書きたい。
  11. 私がプログラミングをやり出した頃とは違い、昨今ウェブブラウザの挙動もしっかり標準化されてきていて、デモの可搬性という点においてありがたい。