プログラミングの独学に苦戦した学生時代を振り返る（前編）

# はじめに

現在、[公式イベント(エンジニアのキャリア振り返り)](https://qiita.com/official-events/72b44470c9c08f6f080b)が開催されているようなので、自分もこの機会にエンジニアとしてのキャリアを最初から振り返っていこうと思います。

僕は最初からメチャクチャできたという人でもなく、むしろ最初挫折してプログラミングは向かない、、とずっと思っていました。しかし、そんな自分でも社会人になってプログラミングを実務で扱ってもうすぐ1年半となるところまで来たので、それまでの過程をこの記事で共有できればなと思います。

少し長くなるので、前編(学生編)と後編(社会人編)の2本立てで投稿していきます。

# 1. 【興味】高校時代：名前への憧れ

**<font color="Gold">自信度：50</font>**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/a713635a-53eb-8af0-dafd-c0ed7dbe477e.png" width="70%">

僕がプログラミングに興味を持ち始めたのは、高校時代の時でした。

「なんかプログラミングって言葉カッコよくない？笑」

そんな言葉に対する憧れから入りました。その後にプログラミングについて少し調べていたら、ロジックを組み立ててコードを書くことを知り、ちょうど理系だったので自分のやりたいこととたまたま合いそうだなと思って、将来的にプログラミングをやってみたいな〜と思う感じでした。

その時は、何かコードに触ったりとかは一切しておらずただ憧れかな〜というような漠然とした感じでした。

# 2. 【無縁】大学1,2年：別分野の専攻

**<font color="Gold">自信度：50</font>**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/42cb915c-f9c1-0e21-782b-3d388a840659.png" width="70%">

大学1,2年の時はプログラミングをほとんど触った記憶がありませんでした。
というのも、通っていた大学の学科が物理化学の専攻で、実験室でこもって実験していたのがほとんどで、選択授業でちょっと情報系の授業をとっていただけなので、ほとんど触っていなかったですね。
そんなこともあって、自信度は高校時代と変わらなかったです。

# 3. 【挫折】大学3年：初学の洗礼を受ける

**<font color="Red">自信度：0</font>**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/a28ec1fc-56f8-fe78-9ba8-46598f4c0026.png" width="70%">

## 初めて参加したWEB開発インターンでズタボロに

大学3年生で初めてプログラミングというものを触り、しっかり挫折しました笑
というのも、将来は憧れとして持っていたプログラミングの仕事をしてみたい気持ちが強くなり、インターンに参加しました。このインターンの概要ですが、

* 内容：基礎問題(練習問題)をクリアする → 個人のWEBサイトを制作する(カテゴリ不問)
* 期間：2ヶ月
* 開発：個人作業(詰まった場合は、インターンの参加者同士で解決する)
* 場所：在宅
* 言語：PHP/MySQL

とざっくりこんな感じのカリキュラムでした。環境構築は初日にハンズオン形式で実施したので、躓くことはありませんでした。しかし、ここでプログラミングの洗礼を受けました。

「え、やっても訳のわからない呪文のようなエラー文出てる」
「何回やってもうまくいかないんだけど、、」
「エラー出なくても自分の期待している挙動をしないんだが笑」

など、プログラミングが想像以上に地道であることを知って、正直トラウマ化しました笑 初めて実装した時は、文字列と変数を表示する問いのようなものにも3時間程度苦戦を強いられたのを覚えています。

```sample.php
<?php
// Q.自分の名前を変数にして「私は〇〇です。」と画面に出力してください。
$name = "テスト太郎"
print("私は".$name."です。")
?>
```
また、他のインターン生の進捗も見て着々と終わらせているところを見ると、

「自分ってプログラミング向いてないのでは」
「こんな地味なことして何が楽しいんだろうか、、」

など焦燥感も相まって憧れとのギャップに正直やられまくりました。ただ、途中で挫折すると他の勉強とかにもサボり癖がついてしまうのでは？と思い、最後まで頑張ろうとは思いました。その結果、2ヶ月間で、一部バグがあったりなど不完全ではあったものの、なんとかCRUD機能を理解して実装も粗方できるところまではいけました。

## 大学3年時点の実力

この大学3年終了段階の実力は、

* 想像以上に地味であることと自分の圧倒的な実力不足を感じて、メンタルがやられた

* 初回は、文字列表示の問題に3時間程度かかった

* 最終的にCRUD機能を粗方完成させた（2ヶ月間）

でした。正直今思うとよくこれでエンジニア目指したな？笑 って状態でしたね。そんな感じで、プログラミングに対する自信度は0と地に足がついている状態でした。

# 4. 【圧倒】大学4年：ディープラーニング？

**<font color="Orange">自信度：20</font>**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/e502b3d2-0cd9-96bb-462b-810fc5432b8b.png" width="70%">

## アルゴリズム構築力が伸びてきた

大学4年になってプログラミングを行う情報系の研究室に配属となりました。そこでは、ディープラーニングを使った画像認識の自動化について研究していました。もともと、物理化学の専攻に進むことも考えてはいたのですが、自分自身手先がそこまで器用だったわけではなかったこと、物理化学の研究は温度などの環境に依存することや再現性が100%でないことを考えたら、その裏返しである情報系の研究室に進もうといった背景で選びました(正直消去法だった部分がありました笑)。ここでは自信度が0→20と上がりました。その要因として、

「順次・選択・繰り返しの基本構文を使えた処理が自力でかけた！」
「しっかり期待通りの結果を出した上で、研究のように結果に対して分析もできた！」

などと、プログラミングに対してメンタルがやられていた大学3年次と比較すると、言語はMATLABを使っていてWEB開発とかではなかったものの、自分の実力でプログラムが書けている実感が出てきて、少し自信が出てきたためでした。

## 環境構築や技術の幅に圧倒...

ただその一方で、ディープラーニングとなるとPythonも使用することになるのですが、

「え、環境構築ってこんなしんどいの、？パッケージが依存しまくってうまくインストールできない、」
「ディープラーニングってそもそもどうやって実装してるの、？」
「その上で研究結果出すって割としんどないか、？」

となっていました。当時大学院の先輩にもディープラーニングを扱った研究をしている人がおらず、知見も自分で調べることが求められる割と過酷な環境にぶち込まれて、**あああ無理いいい**って何回か発狂しそうになってました笑 この研究テーマも、最終的にはなんとか運よく良い結果が出て、無事卒業できました笑

## 大学4年時点の実力

この大学4年終了段階の実力は、

* 順次・選択・繰り返しの基本構文を駆使した実装はできるようになった

* ちゃんと研究ができるレベルまでには到達できた

* 環境構築が想像以上に大変だということを知り、トラウマになった

* 技術の幅を思い知らされ、エンジニアの世界の広さを知った

といった感じで、大学3年次の実力がほぼ皆無な状態と比べると、少しは上達したかなと思いました。


# 5. 【成長】大学院時代：自力解決が増えてきた

**<font color="Gold">自信度：50</font>**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/985baa8b-f6b1-d65e-fbeb-0506aa2e57f5.png" width="70%">

## 環境構築や技術の幅にも徐々に対応できるように

大学院時代になって、プログラミングに対する自信が少しずつ出てきました。
というのも、

「環境構築も自力で調べて割とスムーズにできるようになってきた！」
「技術の幅を思い知った原因となったディープラーニングに関わるコーディングも自分でできるようになった！」

など、環境構築や技術の幅にも少しずつ対応できるようになったためでした。この時は、とにかく**エラーにあたっても焦らない**ことをかなり意識していました。大学3,4年生の時は、

「エラーをみたらもう無理なのでは、？無限にこれが続くのでは、？」

と割とネガティブ思考になって焦ってしまっていました。しかし、大学院時代に**焦らない**ことを意識しただけで、だいぶプログラミングに対する壁は小さくなったかなと個人的に思いました。それが功を奏して、自分の研究分野のデータセット生成〜分析までの一連の流れは1ヶ月単位で改善をしながら回すことができるようになりました。

## アルゴリズム構築能力も着実に伸びた

また、大学院1年の終わりに就活をしていた際に、有利になるかと思い、Paizaと呼ばれるプログラミングスキルチェック(AtCoderの親戚みたいなもの)をちょっとだけやっていたのですが、この時点では大体1,900くらい(学生平均+400〜500程度)まで到達することができてました。これは、日々の研究でソースコードに慣れ親しんでおり、アルゴリズムを考える習慣がずっとついていたために、ついてきたものであると考えています。

![スクリーンショット 2024-02-14 18.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/371d6d0c-69d5-aca0-9fbb-ca1d1dc86b8e.png)

## WEB開発に関しては全然まだまだ...

アルゴリズム構築能力やディープラーニングについては、プログラミングを始めた大学3年生と比べると着実に伸びてきたのですが、WEB開発に関しては依然と開発にかなり時間がかかる状態でした。というのも、研究で遭遇していたエラーとは全く異なっていたため、解決に非常に苦戦しました。
就活時期に簡単なToDoアプリを自作してみたのですが、環境構築+CRUD機能のみでも1ヶ月以上かかってしまい、会社員として現場で活躍するにはまだまだ足りてない技術力でした。

## 内定は頂いたもののエンジニアとしてやっていけるのか...

大学院2年になって無事志望していた会社からエンジニア職(開発職/プログラマー)として内定を頂いたのですが、

「WEB開発で1ヶ月以上もかかっている自分が会社で力になれるだろうか...」
「エンジニアブログを読んでても、みんなすごいことやりすぎ...優秀だなあ」
「これから新しい技術をたくさん学ぶことになると思うが、適応できるのか、、」

大学3年生のインターンで、エラー連発で全然WEBアプリすら作れなかったことがかなりトラウマ化していたのもあり、正直不安しかありませんでした。

## 大学院修了時点の実力

成長点と課題点もありましたが、大学院修了段階の実力は、

* 順次・選択・繰り返しの基本構文を駆使した実装は得意とまで言えるようになった

* 研究を通して、ディープラーニングに対して理解を深めることができた

* 環境構築も徐々に対応できるようになってきた

* WEBアプリ開発については、簡単なアプリ作成でも1ヶ月かかる

といった感じで、アルゴリズム構築系のプログラムを書くことはかなり上達しました。
しかし、WEBアプリ開発についてはまだまだ時間がかかり、入社までに不安が残ることとなりました。

# 読者に伝えたいこと（特に初学者向け）

まず私が伝えたいのは、「プログラミングは最初ほとんどの人が挫折するのではないか、？」ということです。

「エラーの意味がわからない...」
「何回やってもエラーばっかりでる...」
「予想以上に地道だった...」

など出鼻が挫かれる場面もあるかもしれません。
僕についても何回もやられて、他の人と比べて焦って何度やめてやろうと思ったことか...。

でも、諦めずに続けていると、成長した！と思える部分が少しずつ出てくると思います。そして、プログラミングに慣れ親しんでいるといつか「楽しい」「面白い」に変わる瞬間が出てくると思います。自分も、大学4年生や大学院時代の時に、「自分の頭で考えてコードが書けている！」と思った時は、すごく楽しいなと思えていました。

もしやめたい...でもやめたら後悔すると思った時は、ぜひ本当に少しの目標でもいいので目標を設定して、それに向けて取り組んで「自分でコードが書けた！」といった実感を増やしてみてください。おそらくどんどん楽しくなっていくと思います。途中、誰かに聞いて解決するのも全然ありだと思います。

なので、**「自分でコードを書けた！」と思う回数を増やす**ことを意識して取り組んでみると良いかなと思います！

あと、個人的な体験談からすると、

* アルゴリズム構築能力(手順化する能力) → コード化する能力

* エラー(環境構築/実装)対応能力

は初期段階からつけておくとかなり良いと思いました！

# 最後に一言でまとめる

最後にこの約3年ちょっとのプログラミング生活で学んだことは

**マインド**

* エラーが出ても冷静に対処する意識を持つ

* 「自分でコードを書けた！」と思う回数を増やす

**能力**

* アルゴリズム構築能力(手順化する能力) → コード化する能力

* エラー(環境構築/実装)対応能力

が特に序盤の段階で重要だと感じたので、もしよろしければ取り入れてみてください。
自分も初学言語に対して同じことが言えると思うので、上記を忘れずに引き続きエンジニア生活を送っていけたらと思います。

社会人編に関しては、実務でWEB開発を行っていくにあたって、「知識の深さ：効率良く学びを吸収する」「開発の速さ：開発速度を向上させる」についても考えながら取り組んでいて、その部分も執筆できればと思っていますので、ぜひ見ていただけると嬉しいです。社会人編は[こちら](https://qiita.com/yuto_h9m8/items/4a4a8aa46def40f1c754)になります。

最後まで読んでいただきありがとうございました！