imaizumeの個人メモ

コードとか旅とか飯とか

プログラムを始めて6年も経ってしまったので今までの活動を振り返ってみる

初心者だった自分を思い出す

プログラミングを始めてもうすぐ6年になる。
プログラミングを始めた当初、自分が何を考えていたかや何をしていたかの記憶が今ではほとんど無いことに気づいた。

またこの1,2年は、後輩や研究室のメンバーにプログラミングを教える立場にならざるを得ず、その中で改めて『プログラミングとは何か』について考える機会も増えた。

彼らがプログラミングをするときに考えていることは当時の自分と近いのではないかと思い、それを思い出して指導すればもっと良い教え方ができるのでないかということに気づいた。

そこで、これまでの自分が
  • いつ
  • どこで
  • どんな事を考えながら
  • どんなプログラムを書こうとしていたのか
を可能な限り思い出してみることにした。

これまで一貫したビジョンを持って勉強してきたわけではないので、書き出してみたら前後に脈絡がなくて思った以上につまらない回想になってしまった。
しかし今になってこれらの「点と点が線でつながった」から今の自分がいるとも思えるし、将来の自分のためにも今まので出来事をひたすら書き記しておこうと思う。

高校まで

  • 初めてコンピュータに触れたのは小学校入学前だったが、高校3年までプログラミングは一切やらなかった。やっていたのはソリティアとか文書作成とかフライトシミュレーターとか。
  • 高校になってガラケーを買ってもらう。ところが,データ通信できないプランで着メロがダウンロードできなかった。どうしてもほしかったので、調べたところ自作できることがわかり見事自作に成功。これがきっかけで音楽編集をかじる。
  • この頃数学はそこそこ得意で、今でも一番得意なのは英語。この2つはプログラミングにおいて大切だし(数列や変数の概念とかAPIドキュメントの読解とか)、得意だったおかげでその後のプログラミング理解も早かったと思う。
  • 世の中にないものは自作すればよいということを学んだ。

できるようになったこと

  1. タイピング
  2. 着メロ作成
  3. 音楽編集

高校3年時

  • 自分の高校ではなぜか情報の授業で全員Excel VBAをやらせていて、これが最初に出会ったプログラミング言語だった。乱数使ってモンテカルロ法で円周率の概算値を出すのとかもやっててグラフも出してたので、内容は高度だったかもしれない
  • 変数の概念も理解に苦しんだ覚えはない。周囲はなぜ"x=x+1"みたいな式がプログラミング的に正しいのかを理解するのに苦しんでいたように記憶している。"="(イコール)の意味が理解できるかどうかが、プログラミング学習にとっての最初の大きな壁になっていると後に気づいた。

できるようになったこと

  1. Excel VBAの基礎
  2. 乱数を使ったモンテカルロ法のシミュレーション

大学1年

  • 最初の授業でアンケートがあって、高校の授業でプログラミングまでやったことがあるのは130人中自分だけった。このことからも、後に自分はかなり恵まれた環境にいたことを認識した。同時にまだまだプログラミングが普通高校の授業でできるほど普及してはいないらしいということも分かった。
  • 前期の授業で、VBAhello worldからサブモジュール作成くらいまでをやったんだけど、高校で一通りのことは学習済みだったためぶっちゃけヌルゲーだった。
  • 後期はJavaでまたhello worldからやり直す、これもヌルゲー。「書き直すたびにコンパイルしなきゃいけないのめんどくさいなー」って思いながらやっていた記憶がある。
  • 「プログラミングをやればVectorとか窓の杜にあるようなフリーソフトが作れる」と思っていたけど、結局GUIが綺麗なネイティブアプリとかは作れそうもなくて、どうしてこんなこと勉強しているんだろうってすごくイライラしていた。
  • この頃はまだエンジニアの精神論や姿勢的なものも身についてなかったから自主勉強とかもしていなかったし、具体的に作りたいものもなかったので、当然の結果ではある。

できるようになったこと

  1. Javaの基礎

大学2年

  • 次の年もまたVBAの授業があった。ただ前の年がforループとifを組みあわせる程度の内容だったのに、いきなり行列計算とか生産シミュレーションとかをやってレベルが急に上がり戸惑った。周りの友人は、この頃からプログラミングを嫌いになっていったと記憶している。
  • Javaカプセル化とかクラス作成とかアルゴリズムとかを習う授業もあった。けどやっぱり思うようなフリーソフトを作る技術は身につかずますます苛立ちが募る。でも何か行動するモチベーションもあまりなくてただ授業に文句を言っていたような気がする。
  • ただプログラミング関連の授業数自体が少なかったうえ、入部していた英語サークルに感心が向いたため、プログラミングへの関心が一次的に薄れた

できるようになったこと

  1. 簡単なシミュレーション
  2. アルゴリズム
  3. クラス作成とカプセル化

大学3年

  • デザインパターンに関しては、やっていること自体は理解できたんだけどやる意味は感じられなかった。オブジェクトベースのプログラミングも、モジュール化する必要性があるような中・大規模なプログラミング経験がなかったからだと思うし、その時の知識は今になってようやく少し役にたっていると思う。
  • 冬休みに家にこもってサークル向けの(たぶん初めての)Androidアプリを作った(ローカルにDB作って部員の検索とWebサイトへのリンクがあるくらい)。大した出来にはならなくて、部員に見せてもあまり良い反応ではなかったので配布はしなかった。
  • また同時期にサークルメンバーを管理するための別のPC向けネイティブアプリを出そうとしていた。けど学校で習った知識だけでは自分が思ったようなアプリを作ることはおろか、まともなGUIさえも作れずVisual Basicに手を出すも結局挫折。
  • 別の授業でソケット通信とかファイルIOとか暗号化も習ったけど、バッファリングとかプロトコルの概念がいまいち理解できなくて、ドロップアウト今ではなぜかこの授業のTAをやっているけど、1年目で理解して課題こなしている後輩はホントスゴイなぁと。同じ頃の自分は、いろんなことに手を出して全部中途半端なタイミングで挫折していたように思う。
  • 後期にPHPで簡単なWebアプリをチームで作る授業があって、これがとてもおもしろかった。自分以外の人とものづくりして、しかも動くものを作れた初めての経験だった。
  • 冬休みにITProRuby合宿の記事を見つけて応募、当選する。これがRubyとの出会いになる。人生初のプログラミング合宿だった。

  • 合宿中、一緒のチームにいたメンバーからGitを習う。正直RubyよりもGitの方が難しかったけど、学んだことも多かったしGitが使えたおかげでその後のハッカソンにも参加し、研究データもきちんと管理できた。最初に学ぶプログラミング言語はぶっちゃけどれでもよいと思うけど、それと別に全員Gitは早いうちに習得しておくべき

  • そして早いうちにチーム開発での成功体験を身につけておくと、それまで自分が思っていたものづくりと実際の現場のものづくりのギャップが見えて何かしらの刺激を受ける。それが自分の技術力不足に対する認識だったり、コミニュケーションの取り方だったり、レベルの違う人への教え方を考えることへ繋がる。
  • でも就活向けのポートフォリオ作りはほとんど何もやっていなかった。そもそもプログラマに就職して良いのかという迷いと、リーンスタートアップに興味があったせいで起業にも少し関心があったというのが理由。その後起業家志望ではなくなったけど、MVP作って仮説検証するとか理論よりも行動、思い込みよりもデータを重視するという研究に役立つ姿勢が身についた。
リーン・スタートアップ
エリック・リース
日経BP
売り上げランキング: 2,924

できるようになったこと

  1. デザインパターンUMLの読解
  2. Androidの基礎
  3. Visual Basicの基礎
  4. HTML, CSS, PHPの基礎
  5. Rubyの基礎
  6. Gitの基礎

大学4年(1回目)

  • そのせいで、就活でスタートアップベンチャーを志望していたんだけど明らかに自分には合っていなくて、しかもポートフォリオも何もないから「お前やる気あんの??」的な感じで毎日ボコボコにされまくった。そのまま4年の4月になってしまう。
  • 休学し1年間フルタイムインターンへ参加。一度就職してみなければ大人に期待されていることなんて分からない」という思いと「本当にプログラミングで飯を食っていきたいか」を確信したかった。この決断が良くも悪くも自分の人生を大きく変えることに。
  • 行った先はWebベンチャーを名乗りながら、なぜかフロントをまともに書けるエンジニアが一人もおらず、デザイナーが画像で余白を作ってWebページ作っているトンデモ企業だったことが判明。ましてJavaScriptなど書いたこともないので自分がプルダウンメニューやらカルーセルやらの実装をやっていくこととなった。
  • インターンの自分が一人で朝から深夜までひたすらHTMLとCSSでWebページをゴリゴリ作っていった。学校と違い、とにかくインプットとアウトプットを基準に達するまで毎日限界まで繰り返したおかげで、入った時はHTMLタグの名前とかほとんどわからなかったのに、終わる頃にはタグ辞典を見る機会はほとんどなくなっていた。
  • 社員やリソースが増えてCSSの管理が追いつかなくなった時SassとCompassの存在を知り、社内に導入する、ここでも再びRubyが暗躍
  • フロントはとにかく要求された動きをつけるためにjQueryを使いまくり、その場しのぎはできたのだが、結果的にページのあちこちに地雷とゴミが埋め込まれまくった。生のJavaScriptもそこそこ使ったけど、その時は関数オブジェクトとかプロトタイプみたいな言語特性を理解する暇がなかったのであまり使いこなせなかったと記憶。
  • オンプレミスサーバーをAWSへ移行するという話が出た時に、Cent OSにするかUbuntuにするかみたいな話を聞いて、よくわからなかったので調べるうちLinuxの勉強をし始めていた。自分が触ることは最後までなかったが、VMWareをPCに入れてコマンドを覚るみたいなことを毎日終電の中でやってた。Linuxの勉強はその後研究室のマシン管理とか院で行ったインターンですごく役に立った。UNIXコマンドの使い方は、バックエンドを触る可能性が少しでもある人(SE志望の人とか)は自由にマシンが使えるうちにどんどん触って慣れておいたほうが良い。
  • あとLinuxに触るタイミングでVimに入信。以降敬虔なVim教徒として生きる運命となる。同時期にはNetbeansというIDEを社内に広めたり、フォントをRictyにしたりエディタもSublime Textを使いこなしてみたりと開発環境にこだわっていた。プログラムの大半はエディタが補完してくれるので、自分で書く必要はないということに気づく。ここに気づけたことで、一日に書けるコード量が飛躍的に増えた。
  • 1年を通していろいろ勉強はできたものの、最初のインターンでの労働環境は最悪で、うつ病になった社員さんもいたし給与未払いで辞めていった人もいた。自分も無謀なスケジュールで言われたことをひたすら実装する毎日だったため、その疲れから春休みは就活も勉強もまともにやる元気がなく新学期まで家でひたすらぼーっと過ごしていたと記憶している。
  • しかし、仕事を嫌いになることはあったがそれでも技術は好きだった。そう思えたことで、ようやくエンジニアとして就職する自信を得られた。コードの書けない仕事は嫌いだと思いえるくらいには成長できていたと思う。結果、当初の目的は達成できた。
  • ちなみにこうやって悪い過去を受け入れるために正当化する心理を「認知的不協和」と呼ぶらしい。
できるようになったこと
  1. HTML, CSS、構造的なWebページの作成
  2. デザインさえあればおおよそその通りに実装可能
  3. SassやCompassを使ったCSSの生成・管理
  4. jQueryで動きがあるUIの実装
  5. 最低限のLinuxコマンド
  6. Vim
  7. Sublime Text
  8. 未知の技術領域を自分で調べて実装する
  9. StackOverFlowみたいな海外のサイトの読み方

    大学4年(2回目)

    • 復学後、友人の紹介でとある飲食店のHPを作ることに。ただ、フロントの知識はあったけどバックエンド側にはほとんど知識がなかった。そこで勉強がてらサイトをRuby on Railsで作ってみることにした。ほとんど静的なページだったにも関わらずRailsにしたのは単に勉強したかったという以外に、Gitでherokuにpushするだけでデプロイできるのは楽だと思ったからで、今でもそう思っている。ただ自分の技術勉強に利用した感じになってしまっていたし、メンテナンス性を考えて今後はWordpressで置き換える予定(Wordpressでもherokuは利用可能)。覚えた技術を自由にアウトプットできたのは気持ちよかった。

    • 前期はHP作成にほとんど時間を使ってしまったが、その後卒研でもRubyでWebクローリングとかDOMの構築ためのスクリプトを書いた(Anemone, Nokogiri)。

    • ある日自分のドメインが欲しくなって、調べたら意外と安かったのでimaizu.meを取得。就活でのアピールにも使えたので、メアド用に取れそうなら取っておいて損はない。
    • 卒研でSVMニューラルネットワークで分類をしたいと思ってたらRがけっこう使えそうだったので再勉強することに。よくありがちな「Pythonの方が何でもできるから良いんだ派」へは流れなかった。ゴチャゴチャしたデータも扱えるしグラフもかけるし分類器構築もパッケージがあって、関数呼び出し一行で済むしパラメータでアルゴリズム変えられるからRは偉大である。
    • 人生初の学会に出て新人賞的なものをもらう。卒研と学会が終わって、自分は理論よりも実装の方に興味があるんだなと改めて感じた。
    • 人工知能を使ったWebアプリを先輩と作ることになって、渋谷のTech Lab Paakに週2,3で通うようになる。TLPは本当に面白い場所で、起業するために大学辞めた人や有名ベンチャーインターン行ってる人とかたくさんいた。ここに来ると自分と同じようなことを考えているだけでなく、実際に行動している人ばかりで良い刺激を受けた。紹介してくれた先輩に感謝。
    • いろんなメディアにLikeしてFacebookTwitterのタイムラインに情報を流すようにしたのもこの頃だったと思う。この方法はとても効率的。朝起きてタイムラインを見た時に飯テロ写真やスイーツのポストではなく、技術的な内容で埋まっていて、それをきっかけに勉強したりTIPSをマネすることが増えた。QiitaとかpaizaCodeIQみたいなメディアや、CookpadCyberAgentミクシィなどの開発者ブログがおすすめ。

    できるようになったこと

    • Ruby on Railsの基礎
    • herokuへのpush
    • テストとCIの設定
    • 独自ドメインの取得と設定
    • AnemoneとNokogiriでWebスクレイピング
    • R言語の基礎と機械学習ライブラリを使った分類器構築
    • とりあえずのそれっぽい研究
    • モチベーションのキープ(少しだけ)
    • エンジニア向けメディアを使った効率的かつトレンディーな勉強

    修士1年

    • 春休みに人生で初めてハッカソンに参加。年度初めは月一くらいのペースで参加していた。Twitter Bootstrapは、デザイナーがいなかったりMVP作るのにそれっぽく見せるのにはすごく便利だという意見がよくわかった。またgit challengeというgitのプロコン的なイベントにも参加して、Gitをより「正しく」使えるようになったと思う。

    • 家と学校以外の場所でプログラミングしたい時のためにコワーキングスペースに行くことが増えた。都内だと、Kanda Rounge(神田)や東京VIPラウンジ(東京)、ありんこオフィス(渋谷)あたりが好き。他のクリエイターや起業家との出会いもあるので、少し意識が高い人はこういう場所でコーディングするだけで何か良いことがあるかもしれない。
    • 就活SuppoerZっていう会社のインベントに行って、今までのインターンやらHP作成やらの功績が認められてミクシィさんとリブセンスさんの夏季インターンシップに参加させて頂けることに。正直言うと業務経験があるのはHTMLとCSSRails少しくらいで、こんなんじゃ有名ベンチャーインターンには行けないと思っていたのでかなり嬉しかった。ブログに書き終わるまでがインターンだがまだまとめられていないのでインターン絶賛継続中である。

    • 端的に書くと、リブセンスでは一週間のインターン画像処理を応用した求人検索ページの改善を行ったRailsOpenCVで実装。メンターのエンジニアさんがかなりコードレビューが好きな方で、書いても書いても原型を留めない程の添削を入れられる。しかしそのおかげでRubyの真の力に気づき、もっとRubyが好きになる。
    • またミクシィでは家族写真共有アプリ「みてね」のインターンに参加。チーム全体で10名弱、うちエンジニアは5人程度という超少数精鋭のチームであり、それゆえ扱う全技術領域を全エンジニアがカバーできるようにすることがチームポリシーであった。具体的にはサーバーがRails、インフラ系がAWS、クライアントアプリはiOSAndroidで、自分も例外なくインフラ以外は全て担当させてもらえた。

    • ここで初めてObjective-Cのプログラミングをすることになったものの、C言語の経験自体がほとんど無く、ヘッダーファイルの意味とかもわかっていなかった。それでもiPhone6系のAuto Layoutへの対応タスクを割り振っていただきました。またAndroidReactのJava移植であるRXJavaを使っていて、ObserverやらObservableやらの意味も理解できていないにもかかわらず、ロジックからView、テストまであらゆる部分のタスクを任せていただきました。週2日しか来れないので、担当したはずのタスクが次の来社時には終わっているということも多く、チームのみなさんには迷惑をかけてしまったこともありましたが、とても貴重な経験ができました。

    • 個人的には、ペアプロの重要性に気づいたことが大きかった。同じ画面を見ながらプログラミングすることで、自分の間違いを指摘してもらえたり、分からない部分を丁寧に解説してもらいながらしっかり理解できたのがかなり印象に残った。これはその後の研究室生活でも応用している。
    • またチームマネジメントでも、褒めることの大切さ立場が異なる人との接し方を学び、研究やTAで活かしている。気づけばプログラミングをするだけの立場ではなくプログラミングを教える立場になっていた。自分が当たり前だと思ったことが、その人にとっては当たり前ではなく、説明の仕方や接し方で間違っていた部分があったと反省する。

    できるようになったこと


    1. Twitter Bootstrap
    2. 正しいGitの使い方
    3. Linuxをもう少し(SSHとかシェルスクリプトとか)
    4. Objective-Cの基礎
    5. RXJavaの基礎
    6. 前よりは効率的な後輩への指導
    7. ラボのマネジメント(人・技術)

    ある程度たったら振り返りをしよう

    書き出してみたらかなりの文量になってしまったが、書いていくうちに思い出したことも少なくなかったし、やってみて自分のエンジニアリングに対する情熱、思考のルーツみたいなものが知れてよかったと思う。
    特に印象深かった出来事は、また別のポストにして詳細に掘り下げていきたい。

    プログラミングを始めてからある期間が過ぎると「自分はちゃんと毎日成長できているんだろうか」「ちゃんと技術は身についているんだろうか」と不安になる。
    そんな時、こうやってやってきたことをまとめてみるだけでも、思ったよりも成長していたなぁとか感じられる(その逆もまた然り)

    高い山に登る前は頂上が雲隠れして見えないが、登ってしまうと麓が雲で隠れて見えなくなるのと同じ。
    これからも定期的な振り返りを欠かさないようにしていきたい。