人間のあるべき姿の探索

思索・人形・エンジニアリング

プログラミングの経験についての話

Godiva AIちゃんがプログラミングを知ってから4年とちょっとが経ちました.

個人的な振り返りとしての側面が強いですが,プログラミングとかいうものがとても苦手だったので,同様に苦しみを感じている人の一助になれば幸いです*1.ふりかえりがメインですが,最後にちょっとした学びを書いておきます.

プログラミングを始めた瞬間

現在大学院の修士課程2年生で,情報工学科に配属された学部の2年生の時から授業でプログラミングの学習を始めたので大体4年とちょっとになります.それ以前の経験としては,高校時代の情報の授業で特に説明のないCか何かのオセロのソースコードを手打ちでコピーして実行し,コンパイルエラーについての説明もないので間違っている行数が実は表示されているのを知らずに目grepでtyopを探すものでした.

まずはCの基本文法を講義で扱い,そこで初めてプログラムを書きました.Cを最初に学習することについては賛否あり最近Pythonでの講義が始まったとか始まってないとか聞きますが,ポインタ周りの話があるので,プログラミング教室ではない”情報工学”の学習としては意義があると思います.Cというプログラミング言語の存在や実行環境のことさえ知らない状態だったので,学習には苦労しました.今でこそ簡単な部類だと思いますが,何も知らない状態で何かを学習するのはすでにある知識と結びつけることが難しくてとても大変でした.

加えて,人の話を聞くのが苦手な上に頭が悪いので単位を落として留年にリーチがかかりました.友人に教わったりはしたものの,基礎の理解ができていない状態ではよく分からず,非常に申し訳なかったのを覚えています.落ちこぼれている学生というのはこういうものということに対する理解をしていない人に叩かれるのでなかなか辛かったですね.

他の講義もこんな感じで,今学習すれば他の分野と結びつけて面白いと思いながら理解できたものも,最初はよく分かりませんでした.なので学部の3年生で応用っぽい分野になってから面白さに気づきました.微分の嬉しさを微分で知ることができなかったので機械学習で知るまでに時間がかかったのは悲しいですね.

ちなみに,大学の情報工学科に配属されて初めてプログラムを書いた人は意外にも多いらしく,僕は単にその中で落ちこぼれていました.

kcs1959.jp

なんとか情報工学科に配属され、おお喜びです。これでやっと情報科学が学べるぞ!と思いきや、薄々感じていた違和感がより強く現れます。情報技術の話が通じる人が周りにいません。講義でもプログラミングはおろかパソコンを触ったことのない人を想定して進み、いくつかの講義を除き全て紙に鉛筆で進みます。

情報技術の話が通じず申し訳ない…日本の大学は意識の高い層に向けたものというよりは,知らない人が理解できるための最低限をやっているのかもしれません.僕の様によくわかっていない人間が理解できる下の方のレベルをやっていて,既にある程度学習している人にとっては退屈なものだと思います.

他には,Node.jsとかPythonとかいろんなプログラミング言語があることを知って,図書館で本を借りて写経しようとしました.後から思うこととして,プログラムの実行環境を整えることや古い本ではなくネットの情報を適切に参照するスキルが必要で,この時の自分に教えてあげたいなというのがあります*2.あとは作りたいものベースでやらないと学習の質は微妙になりますね.

バイトを始めた

学部の3年生になって,ご縁があってプログラムを書くバイトを始めました.詳細は伏せますが,Javaで画像周りの諸々をやりました.若干の知識は一年間でついたものの業務でのコードの書き方がわからず,リーダブルコードを読め!!と言われそうなコードを書いて矯正されました,とてもありがたかったです.業務では作るものが決まっていてそれに向けて知識をつける必要があったのでこれは良い学びになったと思います.その後も基本的には作りたいものベースで知識を獲得していました.

その後,謎のプログラムを書く仕事などをしつつ機械学習に出会ったりして,プログラムが書けたりそれによって面白いものができるんだなぁ(小学生並の感想)と思い,ちょっとずつ知識がついたりしました.

後期にはロボット実験があり,ラズパイでロボットを作成するものがありました.正直言って僕はプログラミングが苦手でよくわかっていなかったので何もできず申し訳なかったのを覚えています.ただ,ここで実世界のロボットに興味を惹かれて今ロボットを触っているので,経験としては大きかったと思います.申し訳ない…

当時は普通に落ちこぼれていたので,あまり行儀は良くないですがいろんな物事に反発していました.今では少なくとも初学者からみて実力がある人間に見える程度のスキルはあるので,今何かを批判する様な言動をすると「バカが何か言っている」ではなく「実力のある人が攻撃している」に見えてしまうので,最近は控える様にしています.周りが大学からプログラミングを始めたが優秀ゆえにきちんと理解してやっていける人間ばかりだったので辛かったですが,留年とか退学とかしなくてよかったなぁと思います.

ロボットを触った

卒業研究は某所のインターンでロボットを用いた実験を行い,そこで結構スキルがついてしまったのを実感しています.既に論文が出ているものの技術についての話になるのである程度書きますが,ROS+Blenderで人とロボットのシミュレーションを行う技術を応用したシステムを作成しました.その後シミュレートされたロボットのプログラムを実機で使用する形で運用されていました.

ここで学びは二つあって,一つは単に知識についてで,BlenderもROSも触ったことがろくになかったので新しい知識を詰め込む必要があり,かつ既にあるコードの設計を見ながら学習し実行もできたので,知識がついたと思います.

そして,調べたりトライアンドエラーを繰り返すことについても学びました.課題としてシミュレーションを高速化した上で複数実行する必要がありました.そこで,高速化のためにbpyというライブラリのリファレンスを端から端まで参照したり他の方法を検討して試したり大変でした.また,ROSは一つのマシンで同時に一つしか走らなかったので,仮想マシンを4台立ててそれぞれでROSを走らせたものを6台くらい用意して,それら全てにシミュレーション実行の命令を送るみたいなことをしていたのでこれの為に仮想マシンのオプションとかひたすら調べてました.ネットワークと仮想環境は難しいですね.

研究としての話は置いておいて,めちゃくちゃ大変だった分学びは大きかったです.

アプリケーションの実装

その後しばらくはQiitaでPythonの文法の細かい記事を見つつちょっとしたものを作っていました.ある程度知識がついたことでできることの検討がつき,設計ができる様になったので嬉しかったです.画像処理と自然言語処理によってできる簡単なCUIのアプリを作って遊んでいました.やっと日曜大工ができるだけの知識が尽きました.

修士1年の後期ではAndroidアプリを開発する講義があり,チーム開発を経験できるメリットがありましたが,あえて一人でやりました.今までは業務でも個人でも小さいものしか作っておらず,システムの一部を改良する程度のことをしていました.しかし,アプリ開発においてUIや内部のロジックなどすべてを設計して作る経験は割と楽しいだろうなと思いすべてをやりました.大変でした*3

ぬいぐるみをBlenderで作ってスマホの加速度センサと同期させて画面上で動かすことでコミュニケーションするアプリを作りかけの状態で放置していますが,ここでGUIアプリケーションの楽しさを知ったり,Unityの処理の面白さを知りました.

ちなみにUnityについては夏頃にSFCの子が主催していた初心者向け勉強会に参加して触れていましたが,その知見が役に立ったのでありがたかったです.

修士の研究での実装

研究内容については伏せますが,特に関係ない部分の実装としてJavaScriptでシステムを作成しました.というのも特定のライブラリの環境構築ではPythonではとても難しく,システムの安定性や他との整合性を取れなかった為,いっそすべてJavaScriptでやろう!ということにしました.同時にJavaでシンプルなAndroidアプリを書いてapkファイルの書き出しとかをやりましたが,UIと内部ロジックを両方とも作ると作業量が多いだけじゃなくてその対応づけが大変ですね.大変ですが,UIを作るとボタンが押せたりするので,フィードバックが目に見える分作っていて楽しい部類に入ると思います*4

JavaScriptはといえばクソみたいな言語でしたが,一度ちゃんと仕様を理解するとまぁ仕方ないというか納得のいく部分も多かったです.他の言語の思想をそのまま持ち込むと良くないという学びはありました*5.非同期で諸々の処理を組む必要があって,(Nodeでサーバ立てたのは別として)ブラウザはブラウザとして頑張っているんだなと思いました.

その他

某所でロボットの動作の開発をしています.PepperやSotaに見られるようなコミュニケーション用のロボットは研究開発用途がメインでとても高価なので,自分でハードウェアを作るのがネックだった自分としては良い機会だなと思っています.結構裁量が大きくて自由にやっていますが,今までの知識をぶち込んでいるのは楽しいです.具体的なロボットについては論文が出たらこれの実装をしていました!くらいのことは言えるので,紹介したいですね.

学びについて

細かくは言及してもつまらないので適当に終えます.

  • エラーメッセージとか本の注釈は読む.
  • 根本が分からない時はQiitaよりも公式リファレンスを読む.
  • 作りたいものがあった方が良い.
  • トライアンドエラーに耐える忍耐力はあった方が良い.
  • 苦手でもやっているうちに知識はつく(が,効率はマイナス方向にはいくらでも悪くなるので,コミュニティに所属したり効率を上げた方が良い)
  • 変なイキリ方をしない方が良い.
  • 周りにもっとできる人が無限にいるが,気にせずやることをやった方が良い.

まとめ

落ちこぼれるようなやつでも4年くらいやっていると日曜大工や就職ができるのかもしれないですね.根気よくやっていきましょう.

*1:僕より苦しんでいる人は怒らないでください

*2:結局まともに理解できなかったので

*3:いくつかのボトルネックを解消できず,リリースできませんでした

*4:画像処理とかも目に見えるので面白い

*5:JavaScriptはクソ