ふりかえり(3ヶ月半経過して)
テックキャンプの夜間コースを8月1日から始めて約3ヶ月半。
昨日発展カリキュラムが終わり、今日から最終課題に入りました。
ずっと振り返りをしようと思っていたのですが、ブログで言語化するには時間がかかるため「カリキュラム進めたい」という思いから、発信出来ずにいました。
しかし最終課題に入るにあたり、
- 自分がどこまで理解していて、理解していないのか把握したい。
- 将来、過去の出来なかった自分を正確に思い出すことは出来ないので成長記録として残したい。
- プログラミング以外にも学んだことが多いため残しておきたい。
上記のように感じたため、今の感情や状況を書こうと思います。
今まで理解したこと
テックキャンプに入った頃は、HTMLは文字で、CSSはフォントを編集できるものというくらいの知識でした。
初めは、環境構築でコマンドを打つのが怖かったり、ターミナルの閉じ方がわからなかったりしたのを覚えています😅
今、自分が覚えていて書き出せることを、言語化してみます。
後から振り返った時に、当時の理解度を把握するために、少し細かく書きます。
Railsのこと
- Railsアプリケーションの作成を通して、リクエストからレスポンスの流れを知った。(MVC)
- 初めはMVCでもアクションが一つのみだったが(例 index)、後半になる
resources(7つのアクション)に増えていったり、入れ子構造になったり(ログイン中の時に、このアクションはOKにするよ!)した。 - ルーティングとは対応表。コントローラーが進む道筋を書く。道筋のほか、Railsが立ち上がった時に「Hello!Rails」のような画面にならないようホーム画面と連携させていたり、そのアプリに受け入れ態勢OKの準備もしたりもする。(deviseというライブラリや、JavaScript実装時にエンドポイントのパスパラメーターを使う受け入れ準備をする等)
- コントローラーとは、MVCの主役。リクエストを受けてからレスポンスを返すまでコントローラーが中心となって必要な情報をレスポンスに返す。必要に応じてモデルからデータも受け取る。パラムスというリュックサックに入れて、ユーザーから受け取った情報を包んでビュー・モデルまで運んだり、プライベートメソッド(クラス外から呼び出せない処理のまとまり)にして、「どのモデルからどのカラム情報」を取ってくるか設定したり、before_actionというコントローラーの中でも一番初めに読み込ませたいものを設定したりする。
- モデルは、データベースの調整役。アソシエーションといってデータベースとデーターベースの関係性を決めたり、バリデーションといって「この情報じゃデータベース入れられないよ」と設定したりする。
- ビューは、見た目。Railsの場合には、ヘルパーメソッドというHTMLのRails版がある(使用することでセキュリティも上がる)。ヘルパーメソッドにはform_withという入力フォームを作ったり、コントローラーで定義したモデルから取ってきたデータを変数にしたものを表示させたり、deviseと連携して「ログインしてたら表示する、ログインしていなかったら表示しない」等、をする。
- マイグレーションファイルとは、データベースの見出し設定をするもの。
- MVCいずれも、単一責任の原則で一つのファイルに一つの役割を持たせるので、ユーザー関係のもの、ツイート関係のもの、と役割ごとに分けたり、使い回しができるように、機能を切り出したりもする。
- テストコードは、全体の流れ(リクエストからレスポンスまで)をみる結合テストコードや、モデルやコントローラなど単体の機能をみる単体テストコードを学んだ。「こうなったらこんなふうにエラー出るよね?」と予測を立てられることは、アプリケーション全体がどういう構造になっているのか理解していないと書けない。テストコードを書くことで、目視確認から一気に楽になったり、バージョンアップの時にうまくいかないところすぐ分かったり、どういう意図で製作者がアプリケーションを作っているのか後々わかりやすかったりする。
Rubyのこと
- Ruby自体も、ルビードリルのおかげ理解が進んだと思う。配列(データが前習えで入っている箱)、ハッシュ(データをキーとバリューで管理しながら入っている箱)、メソッド(決まった処理のまとまり)、変数(名前を付けて使い回し・編集しやすくするもの)・スコープ(変数等、使える場所にはルールがあること)・引数(スコープの概念に伴って、他のメソッドなどにデータを渡したい時に使うもの)など。
JavaScriptのこと
- JavaScriptには見た目に動きをつけることと、サーバーとやりとりできることの2つ役割がある(コントローラーと友達)
- JavaScriptの見た目の動きの付け方はイベント発火といって「こういうことした時に」「こういう動きをする」という設定をする。HTMLとCSSのように「.js」というファイルを作って、HTMLに「JavaScriptを読み込むね」という設定すれば見た目を作れる。
- Ajaxといって、JavaScriptを使って非同期通信でのやりとりができる。非同期通信とは「更新」ボタンを押さなくても、アプリケーションがサクサク動くこと。
- JavaScriptがサーバーとやりとりするには、コントローラーと友達になり、エンドポイントと呼ばれるJavaScriptがデータを取りに行った時に対応してくれる受付窓口を設定する。(「jsonっていう形式で送るね」など)
- JavaScript側も「XMLHttpRequest」というAjax使えるようにするオブジェクトの固まりにしてデータとやりとりする。
プログラミング全般の概念のこと
- セキュリティ面では、ユーザーが入力する部分に罠が仕掛けられることが多い。防ぐためには、フレームワークを利用したり、入力した時に「ただの文字列」にしたり、クッキーというセッションIDを保持するものを小まめに変えたり、SQL文への命令文を工夫したり、総合的に対策することが大事。
- Webには、アーキテクチャ(構造)がある。構造があるからこそ、ここまで普及してきた。Ruby on RailsもRESTというアーキテクチャスタイル(設計思想)に基づいて作られている。
-
静的付け型言語と、動的型付け言語がある。静的付け型言語は、始めにどういう処理をするのか宣言してから記述するので(記述した以外のデータは受け付けないので)処理が早い。その分、パソコンが理解できる言語に近い言葉で書くので、難しい。動的型付け言語は、型は定義せずに「ざっくりこんな感じ」で書くので、処理が遅い。その分、人間が理解できるような言葉で書くなど。
これから理解したいこと
もっと身に付けていきたいと感じている知識を書き出します。
- 環境変数などのOSの知識
- 環境構築、バージョンに対応できる力
- GitHub(イシューを作成したり、ブランチを作って、コミット・プルリクエスト・マージ・プルしたりすることは理解。GitHubを使って他のアプリケーションと連携させることや、コードを公開している人ものを自分に取り入れたり、きっと便利な機能が色々ありそうだけどわからない)
- Herokuなどのデプロイ方法(1回しかやっていなくて口で説明できない)
- README(取扱説明書なので、わかりやすく相手に伝えるには大事だと思うが書き方が理解しきれていない)
- リファクタリング(引き出しが少ないため、全体の構造をみてこことここをくっ付ければもっとスマートになるなというレベルに達していない)
- データベースをインポートする力・エクスポートする
- Docker(これは面白そうだからやってみたい)
総じて自分に足りないと思うところ
3ヶ月半学んでて思うことは「必要なものを取り入れる能力」が一番必要だと感じています。
(1)必要なもの・機能ってなんだろうと見極める
(2)ググって、「これだ!」と仮説を立てる
(3)コードに落とし込んで検証する
この力が欲しいです。
概念を理解した後「この機能実装してみたい」と思った時に、くっつける能力がないことを自覚しています。
そのためには、
- フレームワーク等でその機能を取り入れる時のお作法の引き出しを増やす(そのライブラリを使うにはモジュールバンバンドラーが必要、そのGemを使うにはどこに記述する、など)
- 取り入れてみた後にうまくいかない部分を解決する力を身に着ける(バージョンの関係であったり、今書いてあるコードとの繋がり、など)
この2つを意識して、最終課題に取り組もうと思います。
プログラミングを通して自己理解に繋がったこと
実際にやってみて、プログラミングが難しいからこそ、”必要なスキル”より前に、いかに自分が楽しみながらコツコツ続けられるかが、かなり重要ではと考えるようになりました。
自分にあった方法はどれなのか、今でも試行錯誤しながら戦略を考えています。
気づいた特性としては、
- 4〜5時間の睡眠が続くと疲れる。体調を崩す。
- 頑張りすぎると「楽しさ」から「義務感」に変わる。
- 他の人との比較による「焦り」は理解度を下げる。
ということです。
良い戦略(自分にあっている方法)としては
- WHYを大事にする。
- 6〜7時間は寝る。
- 「朝起きたら勉強」「夜ご飯食べたら勉強」など「〇〇したら勉強」を続ける。(そうすると、習慣化に繋がる。)
- 理解がゆっくりなこと、たまにのんびりしてしまう自分を受け入れる。
- 進捗が遅い時こそ、共に頑張る仲間との関わりに触れる。
- モヤモヤするときは紙に全て書き出す。
- 何故プログラマーになりたいのか、目的に立ち返る
です。
特に「理解がゆっくりなこと、たまにのんびりしてしまう自分を受け入れる」ようになってから、変な焦りを感じたり、他人との比較がなくなったように思います。
どんなプログラマーになりたいか
テックキャンプに入る前は、なんとなく見た目を整えられたら素敵なので、フロントエンドエンジニアになりたいと思っていました。
しかし、実際に学習を始めてからは少しその考えが変わりました。
今は、”ここは任せて”という得意分野を作りつつも、課題をコードに落とし込んで、リリースして、メンテナンスするという一連の流れが出来るプログラマーになりたいです。
理由は、自分が何故プログラミングスキルを身に付けたいのか深ぼっていくと、誰かが困っている課題に対して仕組みで解決する力を付けたいから、と行き着くためです。
そうすると、一つの分野だけでなく、満遍なく(課題を機能に落とし込んで形にし、デプロイして、運用していくところまで)出来るようになりたいなと思いました。
そのためにも、問題解決時に必要になったスキルで「これは極めたい!」というのが出てくると思うので、それまでは好き嫌いしないで、広く引き出しを増やしていきます。
(番外編)テックキャンプの夕礼について
さて、最後に明日で最後の夕礼について触れようと思います。
テックキャンプ(夜間コース)には、毎週土日に夕礼という仕組みがあります。
知識の定着とアウトプットを目的として、時間制限内に各自が書き出しを行って、それをみんな前で発表するというものです。
その夕礼に参加できるのも、基礎カリキュラムから発展カリキュラムまでなので、明日で最後になってしまいました。(寂しい)
参加は任意なものの、土日のいずれかにはずっと参加していました。
参加しようと思ったきっかけは
- アウトプットに対する苦手意識があったため
- 会社でzoomなどのオンラインで出来るアプリケーションに触れられる機会が少ないので抵抗なく使えるようになりたいと思っていたため
という理由からでした。
しかし、それ以上に得られるメリットはたくさんありました。
- 受講開始が先だった方からはどんな風に進めるといいのか失敗を含めて聞ける
- 受講開始が後だった方の発表が復習になる(自分の成長も感じられる)
- 夕礼がきっかけで、他の期の方と繋がりを持てる
- 仲間の発表、ライフコーチからの言葉が、自分自身を客観的に見る気づきに繋がっていた
などです。
一番大きかったのは最後のメリットです。
「自分自身を客観的に見る気づき」とは大きく2つありました。
(1)セルフコンパッションに繋がること
- 「うまく進められなかった」という発表に対しても、ライフコーチが前向きな部分を見つけて励ましてくれた。(今思うと「できない自分を受け入れる」ことが出来ていなかった始めの頃は、なんでこんなに自分は理解が遅いのか苦しんでいた。)
- 仲間も同じ悩みを抱えていることが多かった。その方の発表を聞くと、とても共感するのと優しい言葉をかけたくなる。それに対して自分も同じ悩みを感じているのに、自分自身に対しては厳しい言葉(もっと頑張らなくちゃ)をかけすぎていたのでは?と気づけた。
(2)戦略が誤っていたことに気付けること
- 進捗が悪い時、「もっと時間量増やして頑張らなくちゃ」と思っていた時期があった。その時に、進め方が上手な方の発表を聞くと、メリハリを大事にしていて「時間数を増やすのではなくて、休息もきちんとしてプログラミングを楽しめる心が今の自分には必要だ」と戦略が誤っていることに気がつけた。
- 瞑想や、時間確保の仕方など、みんなの戦略が転がっていた。
などです。
本当にありがとうございました。
これを書いていて思ったのですが、テックキャンプはライフコーチ・メンターの存在、夕礼、勉強会、カリキュラムなど「仕組みで解決しよう」に溢れています。
「失敗しても良いからチャレンジしてみよう」とテックキャンプの仕組みに飛び込むと、最終的には「自分で戦略を考え出す力を身に着ける仕組み」に行き着くと最近感じていて、凄いなあと実感しています。(笑)
以上です。
3ヶ月半が経ち、「全くプログラミングをわからなかった自分」に比べると成長したなと思います。
最終課題では、今回まとめた部分を克服出来るように取り組みつつ、自分の知識の穴をアウトプットしていこうと思います。
長いのに読んでくれてありがとうございました。