nagumoのエンジニア学習帳

プログラミング学習で学んだことなどをアウトプットしていきます。

プログラミング学習6ヶ月くらいの経過報告

はじめまして、nagumoです。

前回の記事から5ヶ月くらい経っていたので半年という節目に経過報告の記事を書いておこうと思います。

↓前回の記事

nagmo.hatenablog.com

学習状況

自分でもビックリするくらい学習を継続できています

スクールやそこで知り合った人との交流や単純にプログラミング自体が楽しいなどいろんな要因のおかげな気がします。 体感だとここ半年でやらなかった日はなかったんじゃないだろうか

GitHubの草

スクールのカリキュラム的な部分では

HCのカリキュラムの進捗

公式サイトに公開されている表でいうとだいたいこんな状況です。 赤がすでに終了した部分、青が現在進行形で取り組んでいる部分になります。

ちなみに前回の記事時点で⑥HTML&CSSまでは終わっていたので、

⑦Docker〜⑩Ruby on Railsまでがこの期間で取り組んだ内容になります。(だいたい600hくらい)

それぞれの学習について

Docker

dockerは個人的にとても理解するのが大変だった記憶があります。

最初はイメージとコンテナがあまりにも腑に落ちなくていろんなネットで色々な解説などを見たのですが、イメージというものが現実の物質に例えにくい概念なこともあってとても苦労しました。

その他にもdockerよりdocker-composeの方で苦戦しました。yamlファイルの記述もそうですし、バインドマウントなどのデータの永続化の部分もあまりすっと理解ができなくてchatGPTと永遠に壁打ちなどを行って学習していました。

環境構築では、RailsのイメージがdockerHubでは7はおろかめちゃめちゃ古いverで止まっていたので自分で構築する必要があり大変でした。

また、スクールのインプット教材以外にも以下のような書籍などを読み、自分なりに理解を深めました。

自分で環境構築しろと言われるといまだに自信はないですが、自作サービスなどを作る際にはdockerを利用して開発できるようにしようと思います。

Ruby

スクールに入ってはじめて本格的にプログラミング言語のカリキュラムに突入したので、寿司職人に弟子入りしてから初めて寿司を握らせてもらえるときのような喜びがありました。

基本的なインプットを済ませたあとはアウトプット課題に取り組むわけですが、 そのときに、「日本語でやりたい操作を自分の中で考えてそれをできる関数などが存在するかを調べる」みたいなやり方をしていました。

例えば 「果物の一覧が入った配列があり、aに代入されてるものが果物かどうかを調べたい」のようなときに配列の中にaが含まれているかを調べられないかな?のように考えて、 includeというメソッドを見つけてきてそれを使って実装する みたいな感じです。

結果的にこのやり方がたまたまプログラミング初心者にはオススメのやり方だったぽく、割とすんなり課題を進められました。

オブジェクト指向を用いてプログラムを作るという課題では、そもそもオブジェクト指向自体を知らない状態からのスタートだったため、結構時間がかかりました。

特にオブジェクト指向を解説しているサイトだと題材の役割があまりにもハッキリしていて、オブジェクト指向を理解することはなんとなくできたのですが、実際のコードで書くときはオブジェクトごとに綺麗に役割が分かれているパターンが少ないためそこでも苦戦しました。

このときにスクールに在籍している現役エンジニアの方がコミュニティ内で勉強会みたいなものを開催してくれていて、色々知識の補強をさせていただきました。

なんだかんだ全てのRubyのカリキュラムを終えるのに1ヶ月くらいかかりました。

SQL, DB設計, REST

SQLはprogateでやったことがあったのですが、SQLが使えるというのは既存のもう構成が決まっているテーブル操作が行えるという感じで、実際にこのテーブル構成などはどうやって決めているんだろうとprogateをやっているときの疑問がDB設計の学習で解消されて良かったです。

個人的になぜだかDB設計の学習が楽しかった記憶があります。

RESTに関しては当時はなんの話だかあまりよくわからずに学習していました。 その後のRailsで点と点が線でつながったような感じです。

Ruby on Rails

実際にWebアプリを開発するとなるとフレームワークを使って行うことのが主なことや、RubyといえばRails的な部分も感じていたのでとても楽しみにしていました。

インプットを半月くらいで終わらせて、そこからはアウトプット課題に取り組みました。

ECサイト課題

最初にECサイトを作る課題に取り組みました。

実際に作成したECサイト

今までも独学でCRUDの簡単な掲示板などは作ったことがあり、そのときは実際に世の中にあるサイトとのあまりの差に何も感じなかったのですが、 この課題で作成したECサイトでは

  • TOPページ
  • 管理者ページ
  • 購入画面
  • 購入完了メール

など一連のECサイトに必要な機能を実装したため、この課題を通して初めてプログラミングできるかもという実感が湧きました。

また、個人的に苦戦した部分が

「ActiveStorageを利用してクラウドストレージに商品画像を保存する」

という実装で、こちらが全然うまくいかず画像が表示できないまま10日間くらい毎日調べ続けてやっと実装できました。

twitterクローン

次にTwitterのクローンアプリを作りました。

有名サービスのクローンはハンズオン教材なども溢れていて、取り組んでいる方も比較的多いと思いますが、スクールの課題では「ここはこういう感じで実装してください」のような機能要件?だけになっていて、あとは自身で調べながら実装するため、ハンズオン教材とは比べ物にならないくらい難しかったです。

実装としてはツイッターの基本的な機能を作成しました。おすすめ欄のようなアルゴリズム的な部分は実装していません。

https://twitter.com/nagmo01

(ちょくちょく進捗を呟いてたのでよければ探してみてください)

こちらでは

  • deviseでのgithub認証機能
  • 通知機能のテーブル設計

の2箇所で結構苦戦しました。

この課題で基本的な機能だけにはなりますが自分で1からtwitterを作ることができたため、かなり成長を感じました。

逆に、実際に自分が作ったものと本物のtwitterはアプリとしてあまりにもかけ離れていたため、世界的なサービスは本当に良く作られているなぁとも思いました。

そんなこんなでRailsの課題を終えました。

多分EC課題で1.5ヶ月、Twitter課題で1ヶ月くらい取り組んでいたと思います。時間でいうと300hくらい?

上記の2つの課題からは機能実装→PR作成、コードレビューというサイクルで行っていたため、メンターのryoさんにはお世話になりました。 この部分に関しては独学だと経験できなかったであろう部分だと思います。

現在

で、現在javascriptの学習を進めています。 rubyしか書いたことがなかったため、えっこんなに書きづらいの?と最初は思ってしまいました。

その他

学習外のことでは、コミュニティ内での交流が増えました。discordで雑談部屋が存在するのですが、夜とかは暇なので人がいるときは結構な頻度で行ってました。周りから見るとあいつどんだけ暇なんだ...と思われてた可能性は高いです。(まあ本当に暇なんですが...)

個人的なことでいうと退職した直後にスクールに入って学習を始めたので最初の頃は比較的時間があり進捗もかなり良好だったのですが、なんとなくアルバイトでもした方が良いかなと思い始めたのが個人的にはあまり良くなかったです。

自分のような初学者はとにかく量だなーと再認識しました。

まとめ

さすがにこの半年間で学習自体の習慣化はできたんじゃないだろうかと思いますので、このまま止まることなく進んでいきたいです!

また技術への関心が以前より増してきて、あれこれやりたいなーという気持ちもあるのですが、 今後の方針としてはこのまま学習をある程度進めていってシングルページアプリケーションくらいまで学んだら転職活動をしようかなーと思っています。

とりあえずReactというワードを学習を始めた頃からちょくちょく目にしてたのでこのあとに取り組むのが楽しみです。

達人に学ぶDB設計徹底指南書を読んだ感想

はじめに

自分自身以前の記事で「スッキリわかるSQL入門」を読むまでSQLとDB設計の関係性をいまいち理解できていませんでした、というよりSQLを覚えればそれだけでデータ周りは大丈夫なのかと思っていました。

SQLとDB設計は、SQLを覚えることが将棋のルールや各駒の動きを覚えることだとするとDB設計は居飛車などの将棋の定跡のようなもので、実際に実践するにあたってはむしろこちらの知識の方が重要なんじゃないかと感じました。(両方大事だし、将棋知らないのになぜか将棋で例えてしまいました)

そんなこんなで今回、DB設計(データベース)の学習にあたって「達人に学ぶDB設計徹底指南書」を読んだので学んだ内容や良かった点、感想などをまとめたいと思います。

良かった点

SQLに関してはいろんなもので触りだけ学ぶことができたりするのに対して、DB設計を学べる教材などは比較的数が少なく貴重な感じがしますが、その中で本書籍はとてもわかりやすく書いてある印象を受けました。

特にSQLの部分については必要最低限な記述にとどめていて、あくまでデータベースの設計という部分に特化して解説がされている点が良かった。

書籍の中で一貫して著者の考えが書かれていて、もちろんそれに従うのが唯一の正解というわけではないと思いますが、自分のような初学者からするとさまざまな手法の解説だけがされていくより、自らを達人と称する著者が将来的な展望や基本的な設計方針などを断定してくれるのは思考を固める上でとても学びやすかったです。

書籍の図解が必要最低限にとどまっている部分が良かった。これはあくまで個人的に意見なのですが、図解が多い書籍はとっつきやすい反面、情報量が少なくなってしまうのでパラパラめくっていると結局読みたい部分まで見落としたりすることがあるのですが、本書籍は1ページたりとも飛ばしても理解できるような部分がない(言い換えると無駄な要素が少ない)のでしっかり全ページに目を通しました。

学んだこと

データのあとにプログラム(DOA

本書を読むまではDBはあくまでプログラムの中で必要になる1要素のようなイメージを持っていましたが、それ自体がある種の間違いでプログラムはデータの流れを作るためにあるようなもの、データ中心アプローチであるというくらいデータ設計というのは重要なのだと感じました。

各種の設計とパフォーマンスのトレードオフの関係

DB設計はある種どのような要件に対しても正解に近いようなアプローチがあり、正規化やインデックス作成、その他の工夫を正しく行なっていきそこに近づけるようなイメージがあったのですが、例えばバックアップの設計に関しても、より細かい頻度で行えば行うほどパフォーマンスは落ちていったり、正規化に関してもパフォーマンスを考えると行わない方が良くなる場合などもあり、そういった部分を天秤にかけながら要件ごとに対してのベストを探っていくような作業なのだと知りました。

アナログなデータ→DB設計に落とし込む

例として家計簿などのアナログで作られていたものをRDBの設計に置き換える場合のやり方が書かれていて、実際に実務でやったことがない身からすると学びになりました。またこのやり方を知ったことで自分の身近なものをRDBの形式でDB設計するならどうすればいいのか?などと考えてみたりできるようになりました。

ER図

ER図がいまいち理解できていなかったのですが、本書を読んだあとはIE表記法に関してはある程度書いたり、見て関係性を理解できるようになったと思います。

難しかった点

本書はDB設計というデータベースに関しての内容がメインになっていて、特定の要件定義があり、それをSQLを用いてハンズオン形式でDB設計していく ような内容ではないため、いざこの書籍で学んだ知識をもとに実際のアプリケーションで使うデータベースを設計する場合、SQLの知識と今回学んだDB設計の知識を自分なりに融合させていかないと難しいと思いました。

後半の部分では、すでにDB設計をしていて今より良い手法をもとめている方 のようなレベル感の読者を対象にしていて、自分のようなまだDB設計をやったことすらない人間からすると現実味のない事象の対策を聞いているような感じでした。それでも内容自体は非常にわかりやすくて理解することはできました。

感想

プログラミングの学習を始めてから10冊弱はすでに技術書を読んできたのですが、本書は内容が簡単なわけではないのにスラスラ読むことができ、なぜか今まで読んだ技術書の中で一番好きでした。 まだDB設計自体をそこまでやったことがないので、自作のアプリケーションを作る際などにまた読み返していきたいと思いました。

スッキリわかるSQL入門の感想まとめ

はじめに

スッキリわかるSQL入門という書籍を読んだので理解できたポイントと感想をまとめたいと思います。 ちなみに自分自身この本を読むまではProgateでSQLをやったのみでした。

学んだこと

SQLの書き方

復習的な部分ではあるのですが、progateで学ぶより、動作ではなく、なぜそうなるのかの部分がより詳しく書かれていて勉強になった。

DBMSとその種類

正直SQL自体は知っていたのですが、Rubyrubyというような感じと同じでSQLSQLのようなイメージでSQLという言語兼動作するものが存在していると思っていたのですが、そうではなくDBMSというソフトウェアでSQL文を使うことができるというような認識が正しいようです。 oracleというのは書店とかでよく本を見かけていたのでインフラ系のなんかなんだろうな〜と思ってはいたのですがDBMSの一つなことを知れた。

トランザクション

実際のアプリケーションだと複数のユーザーが同時に利用しているわけなのでデータベースへの操作が同時実行されるような場面も出てくる。 そういうときにエラーにならないようにどのような単位でSQL文をまとめるかなどトランザクション分離レベルを指定して、対策する必要がある。

インデックス

実際の本のように索引を作ることでデータベースから情報を取得するときの処理を早くすることができる。

正規化

DB設計をするときのセオリーのようなもの 1〜3正規化までは基本的に行う。

良かったところ

  • まず本の全体的な作りとして図解が多く、未知の部分もストレスなく読むことができました。
  • dokoQLというサービスを利用して本の内容を簡単に自身のPCでも実行して試すことができるようになっている。

    本の中身としては、

  • SQLの場合はプログラミング言語と違い、書いてあるコードの理解は比較的容易に行える反面、いざ自分がしたい操作をするためのSQL文を書くとなると途端に手が止まってしまうのが自分のレベル感でもあり、割と初学者の人はみんなそうなのかなと思ったりしているのですが、その原因を突き詰めると各種の命令自体を理解はしていても頭の中で綺麗に整理されていない状態だったりするのが原因なのかなと思いました。 この本ではいわゆる4大命令(SELECT,UPDATE,DELETE,INSERT)と言われるような部分だったり、WHEREなどの主要な修飾語を丁寧に説明していくので、本当にSQLの基礎を頭に定着させるような本の作りになっていたこと。

  • 入門とは言いつつもprogateのSQLに比べるとトランザクション、インデックスの作成、正規化などより深い内容も基礎的な範囲で説明されている。

感じたこと

  • dokoQLでCREATE系の操作をしたりする場合会員登録が必要になったりするので、割と別のサービスで代替できるかなとは思った。
  • あくまでSQLの入門書なので後半の章でDB設計などについて触れてはいるが、その章だけでデータベースを設計できるようになるのは難しいと思った。別途別の書籍や教材などでDB設計を学ぶ必要性はある。

おわりに

SQLの学習として「スッキリわかるSQL入門」読ませていただきました。

とても入門書であると同時に、わからないときに辞書的に開いて使うことができる本だと思うので、今後もSQLを使う際はこの本を片手に取り組んでいこうと思います。

プロを目指す人のためのRuby入門

プロを目指す人のためのRuby入門を読み終えたので感想をまとめたいと思います。

良かったところ

Ruby自体もともと初学者向けの入門書とprogateでやったことがあったので本当の基礎的な部分は知っていたのだが、 テストなど入門書で出てこないような知識まで乗っていてよかった。 またただrubyの入門というだけでなく、タイトルの通りプロとして仕事で使うことが想定して書かれているので、実際に使用する場面などについても書かれていて参考になった。(機能としてはあるけど実際は使わない、等逆もしかり)

答えだけ載っている書籍の場合、書籍のコードでも動くけど、自分の書いたコードでも動くから良いんじゃないのか?と感じたりする場面があったのだけれど、この本ではまず先に自分のような初学者が持っている知識でそのまま書いた一応動くコードが出されていて、その上でそのコードをもっと良く書く手順の説明がされている箇所が多いため、納得感がすごくあった。

学んだこと

テスト、デバッグの部分は一切やったことがなかったので、とても勉強になった。 今は実際に書いているプログラムがそこまで複雑じゃないこととテストコードを書くこと自体が大変なので、いまいち効果を実感していないが、今後より大きいプログラムを作っていくとなると重要になると思うので、今のうちに覚えたい。

Rubyのクラス自体についての説明は十分だったのだが、実際にクラスを使ってオブジェクト指向プログラミングをしていくやり方などがいまいち理解しきれていないので別の書籍を読むなどで補完していきたい。

難しかったところ

基本的に1~5章くらいまでは半分くらい知っている知識に対して、+αで深掘りした内容を学べたという感じだったのでそこまで難しく感じなかったのだが、6~11章は前半に比べると難易度が高いことと初めてみる内容も多く非常に難しく感じた。

感想

初学者でも学べることがとても多い本でした。 それとRubyを学んでいる限り、辞書的な役割としてずっと見返す必要のある書籍に感じました。 何か自身で作ったあとなどに改めて読み直そうと思う。

GitHub Pagesを使って静的サイトを公開するやり方

はじめに

GitHub Pagesを利用してHTMLCSSで作成したWebページを公開したので、備忘録も兼ねてやり方をまとめてみたいと思います。

例(https://nagmo01.github.io/resume/

GitHub Pagesとは

GitHub PagesとはGitHubが提供しているサービスとなっており、内容としては静的なウェブページを無料で公開することができます。

web制作の学習を始めるとまず最初にHTMLCSSを学習すると思いますが、いざ作ったHTMLファイルを一般に公開するのは既存のブログサービスなどを利用するのに比べると サーバーを建てたりしないといけないためハードルが高いと思います。

そのようなときに今回紹介するGitHub Pagesを利用すれば作成したWebページを比較的簡単にインターネット上に公開することができます。

手順

GitHubの登録は完了している前提で進めます。

GitHubで新規リポジトリを作成する

まず最初にGitHubにログインして、画像の部分から新規でリポジトリを作成します。

続いて、下記の画像のような画面に映りますので囲われている部分にリポジトリ名(ローマ字が良い)を設定してください。 他はいじらずにそのままCreate repositoryで大丈夫です。(もし何か変更する場合も公開設定はpublicにしておいてください。)

そうすると下記のようなページに移行するかと思います。赤枠で囲ってある部分をあとで使いますが、そのままで一旦GitHubから離れます。

公開するHTMLファイルなどが入ったディレクトリを用意する

下記のような形でindex.htmlやそれを装飾するCSS,img画像が入ったフォルダを作ります。(resumeの部分は各々好きな名前で良い)

macの場合はFinder内のサイドバーにユーザー名のディレクトリが表示されていない場合、Finderの設定から表示するようにできます。

上記の手順でユーザー名のディレクトリの中に公開したいウェブサイトを配置できたら、 ターミナル(widowsだとコマンドプロンプト)を起動します。

上のこんな画面になっているかと思います。macbookproみたいな部分は自身のPCの名前でその隣の ~ という部分がターミナル上で今操作しているディレクトリ(フォルダ)を表しています。めちゃくちゃわかりにくいのですが、この〜が先ほど設定で見れるようにして、HTMLファイルなどを配置したUsersディレクトリの下のユーザー名のディレクトリ(ホームディレクトリ)のことを表しています。

resumeフォルダはホームディレクトリ内に配置したので操作対象をホームディレクトリからresumeディレクトリに移動します。

手順は下記の画像の通りです。

Linuxコマンドがわからない場合は下記などを見るといいかと思います。 【初心者向け】 基本のLinuxコマンド一覧!操作別に…|Udemy メディア

①lsコマンドで現在操作しているディレクトリの中身を一覧表示できます。

②操作中のディレクトリの中にresumeがあとことを確認できました。

③cdコマンドで指定したディレクトリに移動できます。ここではresumeに移動したいのでcd resumeと打ちます。

先ほどまで ~ で表示されていた部分がresumeに変わりました。これでresumeディレクトリが操作対象になっています。

次はGitが使えるようにします。

Gitを使えるようにする

先ほどのターミナルに続けて、下記の画像のように順番に入力していってください。(resumeからtestに変わっているのはこっちの問題なので気にしないでください!)

GitHubにアップロードする

ここから少し前にGitHub上にリポジトリを作成した時にそのままにしていたページを表示してください。

赤枠で囲われている部分の3行を1行ずつ先ほどのターミナルに入力してください。

全部入力し終えたらGitHubのページを更新してみてください。

そうすると先ほどの画面と違う画面になります。 そこにアップロードしたファイルが表示されているかと思います。

次はGitHub Pagesを利用してアップロードしたファイルを公開していきます。

GitHub Pagesを設定する

さきほどのGitHubのページのまま、下記の画像の順序で

  1. 「Settings」押して
  2. 「Pages」押して
  3. 「Branch」を「main」
  4. 「Save」をします

このような表示が出ましたら完了です。(場合によって少し時間がかかるようです)

visit siteを押すと実際のウェブサイトにアクセスできます。

Happiness Chain入会1ヶ月目に取り組んだこと&感想。

はじめに

プログラミング学習中のnagumoと申します。

Happiness Chain (以下HCと表記)というプログラミングのスクールに入会してちょうど1ヶ月くらいになったので HC入会から今までに取り組んだ内容と諸々の感想を記事にしてみようと思います。

1ヶ月目に取り組んだこと

  • Progate復習
  • Web技術の基礎
  • VimLinux
  • Git & GitHub
  • HTML & CSSで簡単なページ作成

HCでの学習はロードマップ形式になっていて、 公式サイトのカリキュラムに載っている項目ごとに教材の指定や課題が用意されていてそれをやっていく形になっています。

取り組んだ感想

150hくらい自分自身で入る前からやっていたのでProgateは復習のような感じでした。

その後に学習したweb技術の基礎ではHTTPやcookieなど昔から聞いたことがあったものの知識を補完することができ、一般知識としても非常に学びが多かったです。

LinuxとGitがとても内容的に難しく、大半の時間はここに使ったと思います。Linuxは今までも触れる機会があったのですが、GitやGitHubに関しては自身で学習しているとあまり必要にならなかったので存在は知っていても触ったことがなかったのでその概念、仕組みなどから学習しました。

今も定着しきってない部分を多く感じるので、復習する予定です。

HCに入ってみて良かった点

プログラミング言語以外の部分で必要な周辺知識を学べる

ロードマップを進めてて感じたことがプログラミングをするに当たって必要になるであろうLinuxやGit,GitHubなどの周辺知識の学習が大量に詰め込まれていて、これは独学でやっていたら蔑ろにしていた部分だなと思いました。

またそういった部分をしっかり行なった後でプログラミングの学習に入るため、独学で学習していたときになんとなく意味を理解しないまま教材の指示通りに実行していたターミナル操作の部分だったりが何をするためのものなのかが理解できるようになりました。

その分学習自体は個人的に結構ハードでした。(料理教室の入ってみたら食材に触る前に包丁の使い方とか火の入れ方とかですでに100時間くらい使うようなイメージ)

ロードマップがしっかりしていることで学習に集中できる

逆にそのくらい分厚いロードマップなのでこれに専念すれば、確実にスキルが身につくだろうという安心感がありました。 というかネットで自分で探したときに見たどのロードマップよりも強靭でした。

単純に学習内容を決めるために時間を使うのはもったいないこと。いざ取り組んでいるときもこれで合ってるんだろうかと考えながら学習するのは割とストレスですし、途中で方向転換を起こしやすいという自覚を持っていたのでHCのロードマップはかなり自分にとって良かったです。

もう一つ独学でやっていたときとの違いを強く感じたところは、学習教材に掛ける費用です。自分自身で学習していたときは書籍こそ有名なものを購入するとしても、それ以外の部分でなるべくお金をかけずに学習をしていこうというような考えでやっていました。

HCのロードマップでは良い教材は有料、無料限らずに指定されているので、自分でやっていたらこの分野はお金かけてまで勉強してなかっただろうな〜というのが結構ありました。 また有料のものもHCの運営側がしっかり選定したわかりやすい物を選んでくれているのも大きなメリットだと思います。

アウトプットの重要性がわかった

HCでは教材などのインプットとは別に学んだことのアウトプットなども推奨されています。いざ学んだことを記事などにしようと思うととても難しく、その過程で自分自身理解できてない部分を自覚できたりするので、アウトプットはとても大事だなと感じました。と言いつつあまりできていないので今月はやっていきたいです。 

他の人の活動が刺激になった

最後に、HCには日報という文化があり、各々がその日学習した内容をGitHubにまとめて投稿しています。他の人の日報を見ることで自分以外の学習状況などもわかるので刺激になったりします。

自分の場合はもともとマイペースな性格なのですが、それでも他の人が毎日たくさん積み上げているのを見ると多少なりとも刺激になる部分があります。

自分はHCに入ってから時間のある生活なので、学習量くらいは誰よりも取りたいと思っているのですが、なかなかに手強いです。

学習自体あまりしてこなかった人生なので非常に苦手な分野なのですがやってできないことはないと思うので、いろいろ改善して2ヶ月目は良い感じの報告記事が書けるように頑張ります!

以上です。読んでいただきありがとうございました!

↓今までの学習記録です。

github.com