僕が僕を「成長できないプログラマ」だと思う10の理由


# はじめに

僕は大学生です。
地方大学の情報科に通っており、プログラミングや通信に関する勉強を行ってきました。
現在は四年生で、群知能・AI・最適化に関する研究を行う予定です。

大学四年間でいろいろなことをやってきました。
かなり個人的に毎日勉強は頑張っていたつもりです。

一年生では**頑張って文法を暗記しよう**としていました。
二年生では**様々なゲームエンジンを触りながら、様々なプログラミング言語に手を出して**いました。
三年生では**環境構築から逃げて競技プログラミングだけをやって**いました。
四年生では**院試の勉強**ばかりしていました。

しかし、現在自分に残っている技術は、本当に全体的に中途半端で、尖っているものがありません。
友人はもっとある一分野に尖っていてかっこいいな、すごいなと思います。

どうして自分がこう「**成長できないプログラマ**」になったのか、自分の反省用として残しておこうと思います。

([自分のこれまでのポートフォリオ(活動記録)](https://ganariya.github.io/web)です。)

この記事を受けての[改善](https://qiita.com/ganariya/items/efbc7b0ad2d99f4d13a9#_reference-20f73193a5a293247eac)です。


# 1. 人よりも特定の何かに興味が持てない

僕は、かなり他の人よりも興味が持てない人間です。
どう伝えればよいのか分かりませんが、やる気がおきない、お金をかけたくない、という人間です。

例えば、アニメを見ることは好きです。ニコニコ動画もすきです。もちろん、アプリ制作や競技プログラミングも好きです。
しかし、**お金をかけてグッズを買えるか？**、**東京までライブにいけるか?**、**すべてを捨ててその道で行きて行く決心があるか？**と言われれば、僕は当然NOになってしまいます。

友達にも「お前は昔から飽きるのが早いなぁ」と言われます。
どうすればいいのか分からないのですが、お金をかけたい、時間をかけたいと思えないのです。

プログラマでは、「興味」が非常に大事です。
このエラーログはどうして出るんだろう。
この技術はどうして人気なんだろう。
GitHubのブランチの正しい切り方はなんだろう。

### どうすべき

この興味が現在の自分には足りていないようです。
興味を続けることが大事なようです。

# 2. 最後まで続けられない

僕は最後まで続けることが苦手です。
多分人間はそういうことが苦手ないきものだと思いますが、その傾向が特に強いです。

例えば、昔僕はよくゲームを作っていましたが、一度形になると満足して制作を辞めてしまうことが多かったです。
「やりたいことができてしまった！」という時点で、そのゲームに対して僕の興味心はなくなってしまうのです。
ある意味僕は、様々なことに好奇心が強いです。しかし、まったくもって続かないのです。
結局、微妙な深さ、浅くて広い知識のみが自分の中に残るのです。

### どうすべき

僕は最後まで続ける力を身に着けないといけないようです。
諦めず、最後まで作り続ける、世に発表し続ける力が大事なようです。

# 3. 完璧主義

僕は完璧主義です。
これは生活に対しても、勉強方法についてもそうです。

生活に関して、僕は一日の計画がうまく行かないとその日のやる気が一気になくなります。典型的ですね。
一時間ずれるだけで、明日完璧に生きよう、と意思がブレるわけです、ダメダメです。

勉強方法に関しても、あるジャンルを勉強する時、まず理論を完璧に全て理解しようとします。
また、C#を勉強使用したときもイベント構文やデリゲートも自分で完璧に理解したい、と手を動かさずずっと本を読んでいました。
これだと、理解もできず、そもそもどうしてその文法があるのかを理解できていません。

プログラマにとって、完璧主義はある意味大事ですが、どちらかというと「その場しのぎ」を成功させてから「完璧主義」をすべきなのだと考えています。

### どうすべき

完璧主義をやめる。
まずは手を動かし、その中で学んでいく。
また、想定していた計画が崩れても、まずは五分作業に向かってみる。


# 4. アウトプットよりインプットを重視する

僕はインプット主体です。
何事も理論・本から入ります。
そして自分の中で解決したらそのまま放置することが多かったです。

これだと、「その場限り」の技術の理解になってしまいます。
現状、僕はUnityやBlenderを昔触っていましたが、現在はすぐには書けません。
もう一度勉強しなおせば同時よりはすぐに理解できるとは思いますが、それでも時間がかかります。

プログラマとしてうまくやっていくためには、インプット:アウトプット = 3:7の比率だそうです。
僕は8:2ぐらいでした。

### どうすべき

もっと、理論からではなく、実装やソースコードの理解から入るべきです。
また、本を読むのではなく「実行する」「真似るのではなく、どこか変えてみる」のも大事だと感じました。
最近はQrunch, Qiitaにひどい記事でもいいので上げています。

# 5. 何事も買って満足する

僕はものに囲まれているのが好きです。
これは、自分に自身がない、そういう人間特有の思考だと思います。
例えば、読みもしない駿河屋のライトノベル詰め合わせを年末に買ったりします。
その結果、300冊ぐらいのライトノベルが家に届くのです。でも読まないです。
自分はなにかものを持っている、というその安心感だけが自分をその場限りで納得させるのです。

プログラミング本も持っていますが、なかなかにすべて読みません。
多く買いすぎてしまい、結局そのうちの一つを丁寧にしか読まないのです。
TOEICの単語6冊は、現在も塵をかぶっています。（結局公式本でなんとかなってしまったので）

### どうすべき

別に買うのは悪くない。
それを「最後まで続けて」「アウトプットして」「理論より実装」を「１冊ずつ買って」行うのが大事なんだと思いました。

# 6. 環境周りを理解していない

僕は、環境周りが苦手です。

例えば、最近Linuxを理解し始めた段階です。
bashも最近ようやくわかってきました。
それまでは
「コマンドの仕組み」「homebrew」「C++のソースコード実行」など多くのシステム周り・環境設定をIDEに任せたり、コピペで済ましていました。

このまま環境周りを放置すると、永遠に自分はこのままです。

### どうすべき

最近は行っていますが、自分で理解できるように調べて実行しています。
docker上でLinuxを動かしてLinuxを壊しながら遊んだりしています。

もっと手を動かして、これからは「古いPCにLinuxをインストール」して遊んでみようと思います。
また、「プログラミングを始める前に知っておくとよいパソコンの周辺技術」という内容でまとめてみようと思います。


# 7. どれか一つのプログラミング言語を完全に理解していない

僕は、何一つ完璧に扱えるプログラミング言語がありません。
しかし、Hello Worldをした言語などはC・C++・C#・Ruby・JavaScript・TypeScript・PHP・Nim・Scalaなどがあります。
そのうち、日常的に使う言語はC++・JavaScriptのみです。
さらに、完璧に理解している言語はありません。（C++は完全に理解していませんが）

これは9でも述べますが、違う意味で楽をする、ということが原因の一つです。
また、手を動かさず、目でみて理解しようとしていた、というのも原因です。

### どうすべき

プログラミング言語は、一つだけ完璧に理解すれば他言語も多くは利用することができます。
（ただし、C#とProlog、PrologとHaskellのように異なるパラダイムは別です。）

そのため、なにか一つを早く完璧に言語仕様を理解する必要があります。
そのためには、手を動かしながらどうしてその文法があるかを現場の中で学ぶ必要があります。

# 8. 複雑なファイル設計ができない

僕は複雑なファイル設計が苦手です。
これまで作った最大のソースコードは、パズルゲームで、5000行ほどを20クラスぐらいで書いていました。
ただ、二年生で作ったパズルゲーム以降は、僕は基本的に競技プログラミングしかしていないため、シングルファイルばかり書いていました。

大きなアプリを作っていないため、どうファイルを分割すべきがわからないのです。
これは、デザインパターンを理解していない、というのにも影響すると思います。

### どうすべき

特定の一つのプログラミング言語を理解した後に、その言語でなにか大きいアプリを作る必要があります。
また、これまでの理由の通り、「最後まで続けて」「興味を持つ」ということも非常に大事です。

# 9. 違う意味で楽をする

僕はある意味「プログラマ」として「怠惰」「楽」をしています。

プログラミング言語C++において、僕は簡単な文法だけで書くべきだという発想を持っていました。
確かに大事なことで貼るのだろうと思いますが、競技プログラミングのライブラリ制作や、複雑なシステムを作る際には、「難しい文法を習得して、その中で簡単に書くべきだ」ということのほうが大事なのだと最近気づきました。

また、途中でほんの最後らへんで辞めてしまうのもある意味楽をしています。また、手を動かさずに、目で見て理解しようとするのも楽をしています。

### どうすべき

もっとプログラマらしく怠惰に生きなければいきません。
困ったことがあったらプログラミングで解決できないか模索する。
もっといい解決策、文法がないか考える。
など、もっと楽をできるようにプログラマとして生活しなければなりません。

# 10. そして何より自分に甘い

僕はそして何より自分に甘いです。
休日は、昼寝をしてしまいます。
何をそれぐらい？となるかもしれませんが、僕は完璧主義なのでこういう些細なことで一日が壊れます。

また、競プロerなので、Twitterをします。また、ニコニコ動画やYoutubeも夜に見ます。
これらの甘い誘惑に負けないようにしないと、いいプログラマになれないのだろうと思います。

というか、そもそも本当の興味心・探究心の強いプログラマはこれらの娯楽よりも「自分の実装したいアプリ」などを優先できるんだろうと思います。

### どうすべき

僕は自分に厳しく、というか、これらの趣味よりも好きなプログラミングを見つけなければいけません。
そして、時間を決めて、休暇に浸るひつようがあります。


# 最後に

僕は、意思が弱く、プログラマに程遠い人間だと劣等感しか感じていませんでした。
1, 2年生は、「勉強の仕方」が非常に悪く、今思い返すと全ての時間を無駄にしていた、どうして文法を暗記することに執着していたんだろうといまでも悔しくなっています。

しかし、3年生になって競技プログラミングを初めてから、自分のやりたい方向である最適化・アルゴリズムの面白さを知ることができました。

来年は筑波の院に進むことになります。
残り半年を、より最後まで続けて、アウトプットできるちゃんとしたプログラマを目指せるようにしたいと思います。