プログラミング漫遊記

思ったことや、勉強したことをつらつらと。

【Node.js】CLI版のメモアプリを作って学んだ難しい課題への向き合い方

こんにちははるぐちです。フィヨルドブートキャンプ(以下フィヨルド)でメモアプリを作成したのですが、はっきりいって

めっちゃむずかしかった、、、

正確には「今回もちゃんと難しかった」という感想になるのですが、「何をどうすればいいのか?」というレベルで難しいと感じたのはRubyでlsコマンドを実装するとき以来だったのでびっくりしました。JavaScriptという言語に慣れていないというのも原因かもしれません。

しかし、今回に関しては「全く意味わからん」状態ながらも精神的には楽しんでできたので、その学びから難しい問題にどう立ち向かっていけばいいのか書ければいいなと思います。

注意:課題は提出しましたが、現時点ではレビューはいただいておりませんので技術的なことは書かないつもりです。なのでネタバレはありません。

注意:難しいと煽ってはいますが、実際はフィヨルドでは助け合いのコミュニティがありますので質問すれば丁寧に答えてくれますし、だいたいみんな楽しんで苦しんでいます(多分)!

対象者

  • プログラミングが難しい〜!ってなってる人
  • プログラミング難しすぎて夢に出てきたことがある人
  • プログラミングが難しすぎて晩御飯喉を通らなくなった人
  • フィヨルドブートキャンプって知ってるけど、カリキュラムどうなの?って思っている人

課題の位置付け

まずはどういうプラクティスなのか説明します。 フィヨルドではHTML・CSSからプラクティスが始まり、今回のメモアプリは後半のプラクティスであるJavaScriptの課題「クラス構文について知ろう」というプラクティスの課題でした。メモアプリ自体はすでに作ったことがあって、1回目はSinatraを使ってメモをファイルに保存する形式、2回目は同じくSinatraで作るのですがメモをデータベースに保存する形式です。今回は言語がRubyからJavaScriptに変わって3回目のメモアプリ作成となります。DLI(コマンドラインインターフェース)版を作るのは初めてなのでいったい何をどうすればできるのかわからないところからの実装になりました。

ちなみに、プラクティスを順番にやっていくとこんな感じ。85%かぁ。(随分遠いところまで来たもんだ) 学習日数はかなりかなり遅い方なので参考にしないでください(途中7、8ヶ月ほどやっていない時期がありました。)

f:id:haruguchi_yuma:20210829155342p:plain
ラクティスの進捗状況

学習カリキュラムについては公開されていますので、https://bootcamp.fjord.jp/practicesを参考にしてください。

難しいに立ち向かう

1.難しいの解像度を上げる(わからないの言語化)

ここからが本題です。

難しい。」と、一言でいうのは簡単ですが、もっと解像度をあげなければ問題は解決しないと考えました。 ということで、事実ベースでわかることわからないことを書き出していきます。ここで個々の難易度は気にしません。思いつくままに書き出していきます。

【事実】

  • メモアプリはNode.jsを使って実装する←Node.jsの環境は整っている
  • 標準入力を受け取る←現段階で方法がわからない <調べる>
  • オプションを受け取る←一つ前のプラクティスでオプションの受け取り方は学習済み、つまりわかる(minimistを使う)
  • sqlite3を使う←よくわからない <調べる>
  • メモを選択できるようにする←わからない <調べる>
  • クラス構文を使ってクラス化する←構文自体は知っている
  • クラス設計←Rubyと同じ感じならできると思う

2.簡単なところから順番に調べていく

いきなり、アプリを完成させようとしても全体像が掴めていないことがほとんどなので、先ほど列挙したわからないことを1つ1つ地道に調べていきます。 難しいところから調べていくと心が折れるのでなるべく簡単(だと感じる)なところから手をつけていき、それでもわからないことがあれば、引き続き書き出していきます。ここで、おすすめなのは公式ドキュメントから順番に調べるということです。

僕は、最初はQiitaなどのわかりやすい記事を読んでわかったつもりになっていたのですが、これは遠回りだったように感じます。全体のうちの一部しか解説されていないことも多く、使い方があっているか間違っているか自分では判断がつきません。まずは公式ドキュメントなどをみて、そのライブラリでできることの全体像を入れてからQiitaなどの記事を見た方が「どうしてそういった書き方をしているのか?」など細かいことがわかると思います。だた、公式ドキュメントは難しくて理解できないこともあります。そこが一番辛かったかもしれない。

今回readlineenquirersqlite3などのモジュールを調べたのですが、ドキュメントが英語だったのでとても時間がかかりました。とはいえ今はDeepLなどの優れた翻訳があるので時間はかかりましたが力になったように思います。

  • 標準入力を受け取る ←readlineというモジュールを使えばいいとわかった
    • readlineのドキュメントを調べる
      • <具体的な使い方>hogeがわかった
      • <具体的な使い方>fooがわかった
      • <具体的な使い方>barはよくわからん ←<調べる>

3.それでもわからなければ、基礎・基本に戻る(戻ることを恐れない)

先ほどさらっと公式ドキュメントを読めばいいと書きましたが、実際は公式ドキュメントが全然読めませんでした。 じゃあサンプルコードだ!「ん?何やってるか全然わからん!」

あるあるです。

読めないし、書けないということはそもそもJavaScriptについての基本的な文法が理解できてないのだと思い、基本的な構文を解説しているサイトや書籍で学習するところまで戻っていきました。 どの力が不足して公式ドキュメントが読めないか分かればその部分だけ学習しなおせばいいのですが、僕の場合はわからなかったので一通り学習しました。結果的によかったと感じています。

4.「分かった」から「できる」へ(小さく実験する・条件を変えて試す)

公式ドキュメントが読めるようになって「分かった」の状態になったら、実際に手を動かして「できる」の状態にします。どちらかというと公式ドキュメントを読みながら手を動かすのでほぼ同時進行かもしれませんが、実際に手を動かさないとできるようにはならないのでここはとても大事なところだと思います。

また、小さく実験するというのがポイントだと思います。

FuzzBuzz問題で例えると、いきなり「3で割り切れる場合」と「5で割り切れる場合」と「15で割り切れる場合」を考えるのではなく、まずは「3で割り切れる場合」だけを考えよう。と言った具合に小さく動かしていき、それがクリアできたら「5で割り切れる場合」を考えようとステップアップしていくのがいいと思います。

もう一つのポイントは条件を変えて試すということです。

これまたFizzBuzz問題で例えると、「3で割り切れる場合」という条件を「7で割り切れる」場合に変えたり、3つの条件から4つの条件にしたときにプログラムが自分の意図する挙動になっているか確かめるということです。条件を変えて色々試すことで本当に理解できているかの確認になりました。

5.あとはひたすら繰り返し

あとは1~4を繰り返しながら進めていきます。 進めていく中でどうしても理解できない、わからないところは友達・メンターなどに質問するといいです。

フィヨルドブートキャンプではその他に、Q&AやDiscordなどでわからねぇ!と叫べるコーナがありおすすめです。(宣伝)

以上、メモアプリを通して学んだ難しい問題への立ち向かい方でした。