プログラミングを目的にしてもいいと思う
文系でプログラマーになったけど色々失敗して3年半で会社を辞めた話|denkigai|noteという記事を読みました。 この記事に書かれていることが私の身にも覚えがあります。特に私と同い年の方のようなので自分に重ねてしまうところもあります。 ですが多少似たところはあってもやっぱり他人なので全然違う体験もしています。そういう体験を書いてみようと思います。もし該当記事を読んで絶望した人がいるなら別の例もあるよということで参考にしてください。
私は「パソコンの中身が知りたい。多分プログラミングとかいうやつを勉強したら分かる気がする。」くらいのモチベーションでプログラミングをはじめました。 ゴールがあやふやですし、結局のところ「プログラミングをする」が目標になってるので迷子になるのは必至ですね。実際そういう時期がありました。 そんな私でも今はプログラマとして生きています。以下に、私が遭遇した課題とそれをどう解決(あるいは迂回)したかを示します。
ところで、該当記事中でも文系プログラマという呼称は不適切とされていますが、私は理系の人間でした。 プログラミングはあまり教育法の確立されていない領域なので多くの人が大なり小なり似たような問題を抱えていると思います。
課題1: 何をすればいいか分からなかった
私は大学生の内にプログラミングに入門しました。 独りで勝手にやってるので良さげなチュートリアルも見つけられず、インターネットにあるRubyの入門記事で言語機能を勉強しました。 するとどんな機能があるかは分かってもそれで何をしたらいいのか、何を作れるのかが全然分からない状況になりました。
解決1-1: 本を読んだ
大学生は知識で困ったら図書館に頼るのが吉です。Rubyの入門書をみつけて読みました。 内容は同じ入門でも切り口が違うと自分の勘違いが解けたり疑問が解消したりします。 また、チュートリアルのように「作って学ぶ」系の本だと何をしたらいいかが多少分かるようになりました。
解決1-2: コードを読んだ
自分独りではどうしようもなさそうなので他人の書いたコードを読んでました。 Rubyの標準ライブラリとか。WEBRickが教科書的なコードときいて読みましたがそもそもHTTPが何をしてるのかもわからないので「分からん」となったりもしました。 何をしているのかは分からなくても「コードをファイルに分けるんだ」とか「だいたいクラスとかモジュールとかで機能を分けるんだ」などは分かりました。
課題2: プログラミングで作りたいものがなかった
プログラミングを勉強しはじめて半年とかそのくらいの時期ですかね。 この頃には動くものを作れるくらいにはなりました。 しかしプログラミング自体が目的なので作りたいものがありません。 シューティングゲームを作るチュートリアルをやってみてもゲームに興味がないのでその後の進展がありません。 それにチュートリアルをやっても自分で考える能力は身につかないので先に行きづらいんですよね。 このあたりで迷子になりました。
迂回2-1: 勉強を目的にした
自分のやりたいことがないので「知らないこと、わからないことを勉強する」を目的にしました。 本を読んだりWebの記事を読んだり。流石にインプットばかりだと飽きるのでブログを作って学んだことをまとめたりしました。
迂回2-2: OSSに貢献した
自分の作りたいものがないので既に作られているものに乗っかる戦略を採りました。 OSSとはいっても最初は翻訳とかで、gitとGitHubに慣れてから少しづつプログラムの方にも貢献していきました。 レッドオーシャンなRubyなどではかなり難しい戦略かもしれませんが、Common Lispのようにブルーオーシャンな言語なら案外貢献の余地は残っています。
課題3: 今後の方向性が分からなかった
入門から1,2年経った頃ですかね。ある程度普段の作業というか、やることは決まるようになりました。 しかし今後の方向性というか雰囲気というか、プログラマと呼ばれる人たちが何をしているのか、何が常識的知識で何を当たり前のようにこなせばいいのかが分かりませんでした。 このときには行動原理として「プログラミングとは勉強だ」となってました。それでも勉強をするにもどっちに向かって進めばいいのかが全然わからないのです。
解決3-1: 勉強会に参加した
実在のプログラマが集うとされる地、勉強会に参加しました。 このときはじめて、自分しか知らない宇宙語と思ってた言葉がその場に居る人に通じたのを見て感動しました。プログラマは本当にいたんだ。 そこで職業プログラマの方をつかまえて「普段どんなことをしているんですか」とか聞いてイメージを作っていたりしました。 あと、発表を聞いて聴衆の反応をみて「ここは常識なんだ」とか「こういうことをすると面白がられるんだ」とか色々学ぶ点がありました。
解決3-2: コンテストに参加した
実際には解決を求めて行動したわけではないですが、結果論として解決になりました。 Webアプリケーションを高速化するコンテストに参加したら、何もできませんでした。そこで自分に足りない能力というのを把握できました。 ありがたいことにコンテストの解説ブログがあったので、そこから色々なことを学べました。
だいたいこのあたりで自立したというか閉塞感はなくなりました。周りを見渡せるようになったので自分で目的地を探して歩いていけるようになったのです。 概ね入門から3年とかそのくらいです。この時点でもやっぱりプログラミングは目的、「プログラミングとは勉強だ」となっていましたし、なんなら今でもそうです。
冒頭で紹介した記事の彼も入社から3年半でフリーランスになっているのでプログラミングをやるにはそのくらいの時間が必要なんでしょう。 最も、バックエンドにフロントエンドにデザイン、会社員からフリーランスと経験した多才な彼とは違って私はバックエンドだけですが。
ちょっとここからオフトピックで私の考えを書きます。
環境の違いとか
彼と私の入門時の環境を比べてみると丁度真逆になってることに気づくと思います。 彼は一応研修を受けて現場に配属され、やることが与えられました。しかし仕事なので時間の余裕がなかったようです。 私は誰にも縛られないので時間の余裕はありましたが、独りなので最初から手探りでした。 彼は急ぎすぎですし私は遠回りしすぎですね。 千仭の谷に突き落とすと自ら這い上がって成長する人も居るにはいますが、これにはその人の見極めが必要です。多くの人には手厚いサポートが必要でしょう。 逆に私のようなケースは今ならプログラミング学習支援も充実してますし独り四苦八苦するのは絶滅危惧種かもしれません。
何をすればよかったのか
「xxxのタスクをする」くらい具体的な目標があっても今自分が立ってる場所からあまりに遠いところに目標があると迷子になります。 回りの人が途中にいくつかの道しるべを置いてあげるとよかったのではないでしょうか。具体的にはタスクのブレイクダウンですね。
目標がないけど色んな所を探索したい人には地図が必要です。 具体的には自分と似たような領域に興味を持つ先人、ロールモデルがいるといいと思います。
プログラマになろうとしている時点で向いていないのか
好きこそものの上手なれとか言葉を変えて色々に言われますよね。 個人的にはある程度真だと思いますが向いてないまではいいすぎかなと思います。 この言葉の言わんとするところは「口より先に手を動かせ」だと思いますが、それは環境の整った人に向けて言うべき言葉です。 入り口が見つからずにうろうろしている人も入り口さえつかめれば一気に進んだりもします。 調べて実装するスキルは必要ですが最初から持ってなくてもいいのです。 それに、之を楽しむ者に如かざれど、それは上位の一握りに入れないだけです。 「プログラマになりたい」という意思があるだけ十分素質はあると思います。
プログラミングを目的にしてもいいと思う
「プログラマになろうとしている時点で向いていない」と似たような言葉で「プログラミングは手段であって目的ではない」があると思います。 私はちょっとこの言葉は危険だなと思っています。 技術だけに寄りがちなプログラマに対して諌める意味ではいいのですが、誰にも彼にも言うのは良くないです。 これを言っていいのはちゃんと手段としてプログラミングができるようになってからです。
そもそも手段に秀でているから専門職をやってるわけで、そのためにはどこかでプログラミングを目的として勉強するフェーズが必要です。 私の経験でもほとんど目的としてプログラミングをしています。「シュートは得点への手段であって目的ではない」といってシュートの練習をしないスポーツマンはいませんよね。 シュートだけでは選手としてプレイできないだけです。
あまりにも遠くにある目標を眺めてると先を急ぎたくなります。 でも急がば回れ、可能ならのんびりプログラミングを目的にして過ごす時間があってもいいんじゃないでしょうか。