プログラミングでつまったことを書く流れ
プロのプログラマーたちが、自分が何に詰まったのかを書くのが流行っている雰囲気を察した。リンク等は末尾に書いた。
せっかくなので自分も書こうと思う。昔少し書いたんだけどね。まぁ今なら書けることもあるでしょう、ということで。
自分はたった(!)5年程度しかプログラミングをしていないのだけど、過去のことを思い出すのは結構難しい。わかってしまったことに、わからなかった頃の自分の視点はない。けれどもなんとか思い出してみる。
プログラミングしてきた経緯
初学者の頃
昔自分がプログラムを初めて書いたとき、 Terminal.app を使って ssh して Linux サーバー上で Emacs というテキストエディタを起動させられたことをよく覚えている。そもそも OS X(当時はまだ macOS ではなかった)を触ったことがほとんどなかった僕にそんなことをさせられ、プログラミングとかシステム開発とかって怖いなって思った記憶。ちなみにコレは大学時代のエピソード、1年生のとき、19歳。
それでしばらく離れたんだけど、2年生、3年生くらいにHTMLやJavaScriptならナントカできるんじゃないかってことで興味を持ってやってた。とはいえ、JavaScript の文法と jQuery のメソッドとかの区別も全くついていない状態でずっと触っていたので、「コピペして動くからヨシ!!」以上のことはしていなかったように思う。
ちなみに当時はSVNでソースコードが管理されてて、謎に短期間だけSVNを使ってた。もう全部忘れたけど。
真面目に入門するきっかけ
コピペではなく、プログラミングというものを真面目に始めたのは大学3年生(21歳)のときの大学の講義。自分は数学科にいたのだけどC言語を学ぶ講義があった。数値計算の講義ではなく基本的なプログラミングの講義。
題材は競技プログラミングの内容に近くて、競技プログラミングの問題をみたとき「大学のレポート課題じゃん」って思った記憶がある(もちろん制約条件が競プロのほうが厳しいけど)。数学の知識が活きる問題もなかにはあって、すごい大きい数をそこそこ大きい数で割る、みたいなときに「Z/nZ の積が well-defined だから〜」とか言ってオーバーフローを回避していた。
そのときについでみたいな感じでGitを勉強してた。まだ当時はGitHubではタダでプライベートリポジトリをつくれなかったのでBitBucketにソースコードを置いていバックアップにしていた(今も残ってる、非公開だけど)。
日常的にプログラムに関わりだす
大学3年生のときにMacBook Airを買ったんだけど、それを売り払って自分のWindowsマシンにデュアルブートで Linux 入れた。何入れたか覚えてないけど、紆余曲折を経て Arch Linux がなんだかんだ一番使いやすいという結論に至ったことだけ覚えている。インストールが面倒で Antergos 使ってたけど。
Linux を入れたのが契機で、とにかく色んなことをトラブルシュートしなきゃいけなくなった。「動かないから諦める」じゃなく、「動くまでやりきる」ことが原理的には可能になったため。ただ、全然生産的なことやOSS活動みたいなことにはつながらず、いろんな言語の開発環境を整えてやめるとか、なんかアプリをビルドして動いて満足するみたいなことを頻繁にやっていた気がする。なんでそんなことをしていたのかあまり自分でも説明がつかないのだけど、仕事でPythonのパッケージとか使っててCのレイヤーでエラーが起きたときも「なんかこうすれば動きそうだな。。。」とか言って対処してたりしているので、案外無駄になっていない気もする。
そして言語としては Ruby をなぜか書いてた。Ruby にした理由は本当に覚えてない。スクリプト言語だったら何でも良かったと思うけど、正規表現リテラルが使えたのは当時は嬉しかったのかな?別にWeb開発とかはせず、自分の日常の作業の自動化とかをしてた。なのでやっていたことは Alt Shell Script って感じ。
あ、卒業レポートは LaTeX で書いて Git で管理して BitBucket でバックアップにしてて指導教官に Dropbox で共有してましたね。
仕事を始めるちょっと前
諸般の事情がありまして(そのへんについては書きません)、大学を卒業して空白の期間があったのちに仕事を始めます。
空白期間中に何していたかと言うと、とりあえずHaskellを勉強していました。ここが割と自分の「良いコードに対する価値観」のターニングポイントだったような気がします。
少なくとも、「純粋な部分と副作用は分離しよう」とか、map, filter, fold, リスト内包表記などのリスト操作については自分の基礎になっています。でもアプリカティブファンクターやモナドについては今も使いこなせている感じがしません(なのでHaskellが書けない人のまま生きている)。
仕事はPythonですし、今も僕のメインスキルはPythonということになっています。ですが、PythonをメインスキルにできたのはHaskellを学んだからだと思います。
入社〜1年程度
とりあえず最初はまずPythonを知らなかったけど、別に細かい文法を知らなくても書ける(Ruby書いてたし)ってことでガチャガチャやってたら大体書けるようになっていた気がする。
フルスタックWebフレームワークってやつを初めて動かしたのはDjangoが最初でした。ORMとかよくわからんけどSQLってやつを書かなくてもデータベースってやつからデータを取ってこれるんだなって思った記憶。とにかくバックエンドについてはド素人だったので、人のコードを読みながら色々吸収していった気がする。あとテストってこういうものか〜と思った。
仕事を始めてしばらくたってから、Effective Pythonを読みました。これが僕にとって大事な本でした。ほとんど全部読んで、今もたまに見返します。
2年目〜
いろんな環境変化がありましたが、自分のやることはあまり変わりませんでした。Djangoを書くプロジェクトと、けっこうPureなPythonを書くプロジェクトの両方やったり、途中Pandas芸人をやっていたりしました。
この頃にはもうプログラミング初心者みたいなことを冗談でも言わなくなりました。ググることも減りました。
2社目(3年目)
会社は変わりましたが、やっぱり似たような感じでで今に至ります。会社変わってからは視点が変わったというのが大きくて、技術的にすごい成長したみたいなのはあんまりないというのが正直なトコロ。
つまったこと、現在もつまっていること
自分語りはこんな感じでしょうか。
実を言うと、あんまり「これが意味わからなかった」みたいな思い出がない。強いて言えば意味わからないと思っているものは今も意味わからないと思っているものがほとんど。オブジェクト指向とか、モナドとか。忘れているだけかもしれない。
あ、Dockerは初めて触れたとき意味不明だった。でも他に思い出せるものがない。
自分はどんな概念も一旦無批判に「まぁそういうもんか」と受け入れて、「どういうときにそれが活きるのか」を考えるというスタンスなことが多い。だから、わけわかんないなと思いながら無批判に受け入れて、そのまま生きているといつか「便利じゃん!!」とわかる日がくる、というのを繰り返している。ていうか、数学を学んでいるときにそんなクセがついてしまった。どんな難しいものでも、だいたいいつかわかる時が来る。学びさえ継続していれば。
あえていえば、自分はアルゴリズムとデータ構造や計算量みたいなことを全然学習していなくて(特にデータ構造)、CSを学んだ人からすれば知識が欠けているんだろうなと思う。そして自分はあまりこういうことを学ぶ環境に今まで居なかった。実際AtCoderとかもスゴイ下手だし。うまくなりてぇ…
ライブラリとかも使えるんだけど、使えるだけじゃなくて(ある程度)つくれなきゃいけない。この作るというのはよいIFを実装してみんなに使ってもらえるものをというよりも、実際に(そこそこの)パフォーマンスの出る実装ができるかどうかで、そういう部分が自分は弱いよなと思う。
終わりに
深夜に何書いてんだろうな俺。