すずかのプログラミング勉強記

元教員からエンジニアを目指す、プログラミング勉強記録です。

大江戸線徒歩チャレンジをしました!


2023/10/8に、大江戸線を徒歩で全駅制覇するチャレンジをしました🚶‍♀️
16時間ほどかけて、約50kmを歩ききることができました✨挑戦の記録をまとめたいと思います。

挑戦者

私と夫の2人で歩きました。
夫は運動習慣があり、筋トレやランニングを週2~3回のペースで行っています。

妻の私は、気が向いた時にリングフィットをやるぐらいで、ほぼ運動をしません😅学生時代の体育の成績は、5段階中「2」か「3」だったので、運動音痴な方だと思います。

動機

半年前(2023/4)に、夫の提案で山手線徒歩一周チャレンジをしました。

普段動かない私でも、休憩を入れてゆっくり歩いたお陰で、無事一周できました。その時の達成感からまた歩いてみたくなり、今回のチャレンジにつながりました😊

大江戸線を選んだのは、距離が山手線(34.5km)より長いこと、環状であること、都内の景色が楽しめることなどが理由です。

道のり

おたまじゃくしの形をした大江戸線の全駅を歩きます。
地下鉄の距離は40.7kmだそうですが、線路の上は歩けないので、徒歩だともう少し長くなります。 今回は光が丘駅をスタートし、都庁前駅から時計回りで一周、新宿駅をゴールにしました。

歩いた時間と感想

書いていない箇所もありますが、1時間に1回程度、ベンチやカフェなどで休憩をとっていました。

起床(4:15)

5:00頃発の始発電車に乗るため、早朝の起床です。まだ外は真っ暗でした。
夕方以降雨の予報が出ていたので「本当にやるの?!」と思いましたが、しぶしぶ出発しました😅

光が丘駅スタート(6:25)

乗り換えの関係で、近くの別の駅まで電車で行き、その駅から光が丘駅までタクシーを使いました。

太陽は登っていますが、まだ肌寒いです。「ここから何時間も歩くのか〜」という気持ちでスタートしました。
SNSで「大江戸線徒歩チャレンジをします!」と宣言しました❣️

練馬春日町から都庁前(~10:20)

平坦な道で歩きやすかったです。途中の豊島園駅では、ハリーポッターの施設の様子が見えました🧹
まだ足の痛みはそこまで感じませんが、若干靴擦れしてきたので、右足の小指に絆創膏を貼りました。練馬駅で朝ごはんを食べました。

新宿西口から飯田橋(~12:05)

歌舞伎町など、繁華街を通るのが楽しかったです。
靴擦れがひどくなり、絆創膏を増やしました🥲 飯田橋駅を過ぎたところにラクーアがあったので、ベーカリーレストランでお昼を食べました。

春日から清澄白河(~15:50)

歴史を感じる街並みが多かったです。
清澄白河駅近くに、『おくのほそ道』出発地の採荼庵がありました。

松尾芭蕉は『おくのほそ道』の旅で、約1800キロを156日間で歩いたそうです。芭蕉さんに対して尊敬の念が湧きました😇

門前仲町から大門(~18:50)

汐留〜大門駅周辺では、夜景がとても綺麗でした。

東京タワーが真正面から見えました

日が落ちてきて、天気予報通り雨も降ってきたので、寒かったです。足の痛みがひどくなり、絆創膏ではどうにもならなくなりました😖

大門駅のファストフード店で夕食を取りましたが、この時点でくたくたです。

赤羽橋から代々木(~22:05)

雨が降ったり止んだりしており、風が強まる時もありました。足が痛過ぎて、一駅に一回ぐらい休憩しないと歩いていられない感じです😱

SNSを通じて応援のコメントをいただいたのが、とても励みになりました🙏

新国立競技場付近のイチョウ並木は、夜なので人影が全くなかったです。スマホ「負けないで」を流して夫と励まし合いながら、ラストスパートを頑張りました!

22: 15 新宿駅ゴール!

新宿駅が輝いて見えました。着いた時は達成感と共に、「怪我をせずに終われた」という安心感が押し寄せてきました✨

疲労と痛みは限界に達し、最後は亀のスピードでした。余談ですが、新宿駅から自宅に帰るのが非常に辛かったです😅

まとめと感想

総歩行距離(自宅~光が丘駅含む)は52.3km、歩数は約7万歩、歩行時間は約16時間でした。

この日ほど、自転車に乗っている人を羨ましく感じた日はないと思います😅

山手線の1.5倍ぐらい、しんどく感じました。でも、終わった時の達成感は何にも変え難く、「この先の辛いことも乗り越えられる!」という自信にもつながりました❣️

道を調べたり計画を立てたりするのは、夫が全部やってくれたので感謝しています。

夫のnote:【2023】大江戸線徒歩一周の記録(光が丘〜西新宿五丁目込み)|Horikoshi Yuki

また機会があれば歩きたいと思っているので、おすすめの路線をご存知の方はぜひ教えてください!

フィヨルドブートキャンプでプログラミングの勉強をする【半年経過!】

4月からFJORD BOOT CAMP(フィヨルドブートキャンプ)で勉強して、6ヶ月目が終了しました。 今月の振り返りと、半年間の振り返りを書きます❣️

9月の振り返り

9月の感想を一言で表すと、「コロナ辛い」です。

家庭内感染し、発熱・喉の痛み・倦怠感で約一週間、ほとんど勉強できませんでした😭
回復後も後遺症と思われる咳の症状が残り、勉強に集中できないことが多かったです💧

しかし、コロナを経て良かったこともありました。

  • 健康のありがたさを認識できた!
    元気にご飯を食べてよく眠れれば、それだけで幸せを感じれらるようになりました✨

  • 日報提出を継続できた!
    療養中も、日報だけは毎日出しました。 「今日は喉が痛くて勉強できませんでした」というような日報を出し続けましたが、読んでくださったメンターさん・受講生の皆さんに感謝です🙏


勉強の状況

9/4~10/3で、修了したプラクティスは8つです。

1ヶ月間で修了したプラクティス一覧

JavaScript環境の設定

オブジェクト指向プログラミング

Railsでテストを書く

テスト技法

日報の言及機能を作る

test-unit の基本を理解する

TDD の基本を理解する

コメントを付けられるようにする


前半はRailsに取り組み、後半はテスト・オブジェクト指向JavaScriptを勉強しました。 今月は短時間で終わるプラクティスがいくつかあったので、数だけで見ると結構進みました✨


勉強時間

学習時間は6ヶ月間累計(184日)で1163時間でした。
今月だけで見ると約160時間で、他の月より少なめです💦 コロナで一週間潰れたのが痛かったです😢

学習時間


できるようになったこと

参加したイベント

  • オフラインもくもく会を主催しました。
    主催者の一人として、渋谷でもくもく会を行いました。レンタルスペース・二次会会場の予約と参加者の方との連絡を担当しました。
    合計11名が参加してくださり、一緒にもくもくしたりカードゲームで遊んだりしました。非常に有意義な時間になりました❣️

    もくもく会
    写真を一枚も撮っていなかったのでイメージです笑

  • OSS Gateに参加しました。
    OSS GateとFBCのコラボレーション企画に参加し、OSS活動を体験しました。
    6時間のワークショップの中で、私はhtmlbeautifierというgemに、READMEの修正のPRを送りました。大変貴重な経験になりました✨


半年間を振り返って

今回は6ヶ月目なので、半年間の振り返りも書きたいと思います。

達成できたこと

  • 日報を出し続ける
    半年間(184日間)毎日、日報を提出することができました!
    メンターさん・受講生の皆さんがくださるコメントやリアクションを励みに、楽しく日報を書き続けることができました。

  • ブログを定期的に更新する
    毎月何かしらの記事を投稿することができました。平均すると2週間に一回ぐらい投稿していたと思います✏️
    チーム開発や自作サービスまで進むと、書けるネタが増えるそうなので、週一ぐらいで書けたらいいなと思っています。

  • フィヨルドブートキャンプの関係者の方々と交流する
    RubyKaigiやフィヨブーフェスなどに現地参加し、直接お話ができました😆
    また毎月開催される交流会(オンラインミートアップ)に、皆勤で参加しました。困ったことを卒業生・受講生の皆さんにアドバイスいただいています🙇‍♀️
    初めは知らない人と話す緊張で胃が痛くなりましたが、今では知り合いが増えてイベントが楽しみです!(まだ緊張はしますが。。)

苦労したこと

  • モチベーションの維持
    難しい課題だと「何から手をつけていいかわからない」状態になってしまい、モチベーションが下がることがありました。
    そこから抜け出せばやる気が出るのですが、わからない状態が続くとしんどくて、数日サボったりしていました😅

    何もわからない時は「プログラミング辛い。。」という状態なのに、ちょっとわかるようになると「私天才!プログラミング面白い!」となるのが不思議です。

    と日報に書いたところ、メンターさんから

    エンジニアとして働き始めてもうすぐ10年くらいですが、未だにこれを繰り返してます。一生やってそうな気がします笑

    というコメントをいたただいたのが印象に残っています。

  • 劣等感との闘い
    周囲のFBC生やRubyコミュニティにいるエンジニアさんたちが、技術的にも人間的にも素晴らしい方なので、「私は全然ダメだ〜」と落ち込むことが多々ありました😭
    就職してからも向き合っていかなければならない課題だと思います。いつか自分なりの劣等感との向き合い方を考えて、ブログにまとめたいなと思っています❣️

  • いつ卒業できるのか不安
    これはどうしようもないのですが、FBCは卒業までの期間が人によって全然違うので、「いつになったら就職できるの?」という不安がかなりありました😢
    今は以前より、自分の進捗を予測できるようになりました。スキルをつけることが最優先ですが、お金と時間は有限なので、うまく折り合いをつけながら進めていきたいです。

今の気持ち

Macに触ったことがない状態からフィヨルドブートキャンプに入り、どうにかここまで勉強を継続できました。 卒業までの道のりははまだ長いので、失速しないよう適度に息抜きしながら頑張ります💪

10月の目標

プログラミング初心者がコードレビューで学んだこと【まだ初心者編】

はじめに

前回は「超初心者編」として、学習1~2ヶ月目にRubyのコードレビューで学んだことをまとめました。

今回は「まだ初心者編」として、lsコマンド作りなど、Rubyやや複雑なプログラム作りに取り組んだ際のレビューから学んだことをまとめたいと思います。


学んだこと

ブロックを使うと短く書ける場合がある

こんなコードがあった時、皆さんはどのようにリファクタリングしますか?

words = ["", "いう", "えおか"]

words_size_sum = words.map do |word|
  word.size
end.sum

puts words_size_sum
=> 6

まず、do ~ endはこの場合、ブロックを使った方がわかりやすいです。

puts words.map { |word| word.size }.sum
=> 6

さらに、sumメソッドにはブロックを渡すことができるので、mapが不要になります。 Enumerable#sum (Ruby 3.2 リファレンスマニュアル)

puts words.sum { |word| word.size }
=> 6

&:を使うと、超短くできます✨

puts words.sum(&:size)
=> 6

もとは4行で書いていた処理が、たったこれだけになりました!
ブロックを渡せるメソッドはうまく活用して、簡潔なコードを書いていきたいです❣️


mainメソッドは、プログラムの概要がわかるように書く


トップレベルにmainメソッドを定義すると、上から下へ読むことができるようになり、コードが読みやすくなります。Rubyスクリプトにもmainメソッドを定義するといいかも、という話 - Qiita
このmainメソッドを、プログラム全体の流れがわかるように書けると、読み手にとって親切になりますね✨

例えば、こんなコードを書いていました。

def main
  if options[:l]
    print_file_details(files)
  else
    # 行数を計算する処理
    # 行数に合わせてファイルを整える処理
    # 整えたファイルを表示する処理
  end
end

main

これを少しだけ書き換えます。

def main
  if options[:l]
    print_file_details(files) 
  else
    print_files(files)
  end
end

def print_files(files)
  # 行数を計算する処理
  # 行数に合わせてファイルを整える処理
  # 整えたファイルを表示する処理
end

main

else以降をメソッドに切り出すと、上のifの処理と対照的になりました。「lオプションがある時はfile_detailsを表示し、ない時はfilesを表示する」という処理が、一気にわかりやすくなりましたね✨

mainメソッドの中は、読む人が全体の流れを把握しやすくなるよう、メソッドの切り出しなどを工夫して書きたいと思います。


正規表現は色々な状況を想定して、正確に書く


ファイルの中の単語数を数える処理を書いていました。 例えば、sample.rbが下のようになっていた場合、単語の数(3つ)を数える処理を書こうとしていました。

I love  ruby!


そこで私が書いたコードがこちらです。

file_data = File.read("sample.txt")
=> "I love  ruby!\n"
words_count = file_data.scan(/\s+/).size
=> 3

File.readメソッドを使うと、sample.txtは"I love ruby!\n"という文字列になります。

この文字列の単語数を数えるため、正規表現\s+を使っています。 \sは空白文字( [ \t\r\n\f\v])にマッチするメタ文字列で、+は1回以上の繰り返しを表します。正規表現 (Ruby 3.2 リファレンスマニュアル)

つまり「空白文字の一回以上の繰り返しの数を数える」ため、"I love ruby!\n"の場合、[" "], [" "], ["\n"]の3つにマッチして、無事単語数の3を出力できています。


しかし、このようなファイルがあった場合はどうでしょうか。


ruby

単語の数は1つなので、当然1が出力されて欲しいです。

file_data = File.read("sample.txt")
=> "\n\nruby\n"
words_count = file_data.scan(/\s+/).size
=> 2

しかし、実際には2が出力されてしまいました😱

このファイルに対して「空白文字の繰り返し」を抽出すると、rubyの前の改行も含む["\n\n"], ["\n"]にマッチしてしまい、単語数を一つ多く数えてしまいます。


これを解決するために、以下のように修正しました。

words_count = file_data.scan(/.(\s+)/).size
=> 1

\sの前に、任意の1文字(改行を除く)にマッチする.を入れ、「任意の1文字に続く、空白文字の繰り返し」を数えるようにしました。文字列の前の改行にはマッチせず、正しく単語数の1が出力できました。

正規表現を使用するときは、いろいろなパターンを想定して、正確に書かなければならないと学びました。特に空白や空行には、注意しようと思います。


例外処理を条件分岐のように使わない


ファイルのオーナー名を取得して、表示する処理を書いていました。

require 'etc'
file_status = File.stat('sample.rb') # ファイルsample.rbの情報を格納したオブジェクトを変数に入れる

def get_user_name(file_status)
  Etc.getpwuid(file_status.uid).name # ファイルのオーナーのユーザIDから、ユーザ名を取得して返す
rescue ArgumentError
  file_status.uid.to_s # ユーザIDからユーザー名が見つからなかった場合は、IDをそのまま返す
end

この処理では、「ユーザ名が取得できたらユーザ名、できなかったらユーザIDを返す」というのを、rescueを使って書いています。


このように例外を使って処理を制御するのは、可能な限り避けなくてはいけません。Railsアプリケーションにおけるエラー処理(例外処理)の考え方 - Qiita

この場合は、例外を補足する形ではなく、単純にifなどで分岐させるべきでした。

def get_user_name(file_status)
  user_info = Etc.getpwuid(file_status.uid)
  user_info.name ? user_info.name : file_status.uid.to_s
end

Railsのエラー処理でも、同じような指摘を受けたことがありました。
例外をキャッチして条件分岐のように使うのは、可能な限り避けようと思います。


外部環境に依存する処理は、極力独立させる


プログラム実行時に引数があった場合に、引数から得たファイル名を使って詳細を取得する処理を書いていました。

def main
  file_details = (ARGV.empty? ? create_details_from_stdin : create_details_from_arguments)
end

def create_details_from_arguments
  file_names = ARGV
  # file_namesからファイルの詳細情報を取得する処理
end


このコードの問題点は、ARGVに依存する場所が2箇所あることです。
ARGVとは、プログラムを実行した時に与えられた引数を保管する配列です。Object::ARGV (Ruby 3.2 リファレンスマニュアル)
この処理は、外部環境に依存していて不安定になりやすいので、影響範囲を限定させるために、できる限り独立させるのが望ましいです。


レビューを受けて、下のようなコードに修正しました。

def main
  file_names = ARGV
  file_details = (file_names.empty? ? create_details_from_stdin : create_details_from_arguments(file_names))
end

def create_details_from_arguments(file_names)
  # file_namesからファイルの詳細情報を取得する処理
end

外部環境に依存する処理を1箇所に閉じ込め、独立させることができました。 おまけに「ファイル名を取得元をARGVじゃなくて違うところにしたくなっちゃった!」みたいなことが起きた場合でも、mainメソッドだけの変更で済むようになったというメリットもあります✨

ARGVやネットワークアクセスなど、外部環境に依存する処理は、できる限り独立させたいと思います。


おまけ

force pushを避ける


レビューを受けている最中、バグがあるのに誤ってgit pushしてしまったため、慌ててgit push -fを使って取り消しました。

force pushを使うと、レビュアーが変更点が追いにくくなってしまうそうです。また、チームで開発している場合はメンバーがプッシュできなくなるなど、多大な支障が出る可能性もあります。

Matzもこのように言及していました。

危険だと知らず使ってしまいましたが、間違ってpushした場合は、過去を抹消せず、新しくコミットするべきでした。


まとめと感想

今回改めてレビューを見返して、やはり指摘事項は難しく、消化しきれていないことが結構あると感じました😖 ただ、メンターさんに丁寧に説明してもらったことは文字に残っているので、復習して以前より理解することができたと思います❣️

Railsの課題でもたくさんレビューをいただいているので、いつかまとめたいと思っています。

フィヨルドブートキャンプでプログラミングの勉強をする【5ヶ月目】

FJORD BOOT CAMP(フィヨルドブートキャンプ)で勉強して、5ヶ月目が終了しました。今月も振り返りを書いていきます❣️

8月の過ごし方

今月は色々なところにお出かけしました。

夫と自分の実家に帰省したり、花火大会(トラブルで直前に中止になってしまいましたが。。)に出かけたりしました!

そして、2泊3日で北海道に旅行したのが最高でした❣️

積丹半島の黄金岬(無加工です)

・・・というわけで、遊びすぎてしまい、あまり勉強は捗っていません😅

8月にやる気ゼロになるのは、夏休みがある教員をやっていた時の名残なんです(言い訳)。
9月はやる気100%で、頑張れると思います💪


勉強の状況

8/4~9/3で、修了したプラクティスは以下の通りです。

1ヶ月間で修了したプラクティス一覧

devise を使ってユーザー認証を実装する

ActiveStorage で画像アップロードを実装する

Railsi18n を理解する

kaminari を使ってページング処理を実装する

WebアプリからのDB利用


Railsをひたすらやる1ヶ月でした。

前半2週間で5つプラクティスを修了しました。しかし、「コメントをつけられるようにする」の課題(後述)に苦しみ、その後は1つも修了できませんでした💦


終了したプラクティス


勉強時間

学習時間は5ヶ月間累計(154日)でぴったり1000時間でした✨


学習時間

早い人だと1000時間程で卒業する人もいそうですが、私はこの3倍ぐらいかかると思います💧
完全未経験なので、時間がかかるのはしょうがないと割り切っています!


できるようになったこと

  • Railsさっぱりわからない」から少し脱出した。
    先月はファイル・フォルダの多さに迷子になっていましたが、1ヶ月勉強すると、なんとなく掴めてきました。 「独習Ruby on Rails」を、どうにか一冊読み切ったので、基礎的な知識はつけられたかなと思います。

  • ページング実装や画像アップロード、ログイン機能を作れるようになった。
    情報量が豊富だったため、比較的スムーズに進みました。
    ただ確認不足で、「バリデーションが意図しない形で発動して新規登録ができない状態」、つまりメンターさんが起動できない状態で提出してしまうミスをやらかしました😅


苦労していること

  • 「コメントを付けられるようにする」の課題
    ポリモーフィック関連を使って、複数モデルにコメントをつけられるように実装します。モデルの関連付けに苦労し、何も進まない日が数日間ありました😢
    なんとか提出しましたが、その後プルリクエストに数十個ものコメントをいただき、反省しました。現在修正中です。

  • 「日報の言及機能を作る」の課題
    フォームから送信されたテキストにレポートのURLが含まれていた場合、メンションがつけられるよう実装します。
    ググってもヒントが少ないため、今までの知識を総動員してもがくのが、辛くもあり楽しくもあります❣️


参加したイベント


今の気持ち

FBC卒業について、今までは遠すぎて現実感がなく、幻のように思えていました。
ただ5ヶ月目に入り、遠くに卒業・就職がちょっとだけ見えるようになりました!

時間はかかるかもしれませんが、エンジニアとして働ける実力をつけて卒業できるよう、引き続き頑張ります💪

8月の目標

プログラミング初心者がコードレビューで学んだこと【超初心者編】

はじめに

完全未経験からプログラミングを勉強して、約5ヶ月経ちました。
FJORD BOOT CAMP(フィヨルドブートキャンプ)では、fizzbuzzなど初心者向けの課題に取り組んでいる時から、メンターさんに本気のレビューをしていただきます😊

今回は「超初心者編」として、学習1~2ヶ月目にRubyのコードレビューで学んだことを中心にまとめたいと思います。



スペースを適切に入れる

rubocopを導入するまで、半角スペースを入れるのか入れないかをよく迷いました😖

演算子の前後には、半角スペースを入れる。

+-など、演算子の前後にはスペースが入るのが一般的です。私が書いていた、ダメな例がこちらです。

if number%15 == 0 # ダメ
if number % 15 == 0 # OK

%と出会うのが初めてだったため、演算子だという認識がなく、前後にスペースを入れていませんでした。「何が演算子なの?」という時は、確認しておくべきでした。
Ruby入門 - 演算子 - とほほのWWW入門

メソッドと引数の間には、半角スペースを入れない。

上とは逆に、不要なスペースを入れてしまった例です。

"Ruby!".delete ("!") # deleteメソッドと引数の間に半角スペースが入っている。
=> "Ruby"

このコードでは、スペースが入っていても動きました。

しかしコードによっては、エラーや意図しない結果になってしまいます。

"Ruby!".delete("!") + ("?") # 正しい書き方
=> "Ruby?"
"Ruby!".delete ("!") + ("?") # deleteの後ろに半角スペースあり
=> "Ruby"

下だと「"Ruby!"から"!"と"?"を削除する」という意味になってしまい、想定通りの結果になりません。

Rubyでメソッド呼び出しのかっこの手前にスペースが入るとエラーになる理由 - Qiita


変数・定数をわかりやすく

「名前重要!」というのは毎日聞く言葉ですが、命名についても当然沢山ご指摘を受けました。

変数名に抽象的すぎる名前をつけない

array = [] # ダメな名前
number = 1

while number <= 20
  array << number
  number += 1
end

arrayのような変数名をつけてしまうと、読み手に伝わる情報がない上に、別の配列を使う必要が出た場合困ります。

下のサイトではこういう名前は、使ってはいけない名前とされていました😅
data とか info とか list とか item とかいう変数名止めろ - Neo's World

マジックナンバーは、定数として定義する

ボウリングのスコア計算プログラムを作っていた時のコードです。

next_frame = [3, 4]

def calculate_spare(next_frame)
  next_frame[0] + 10 # 次のフレーム1回目の得点に10を足す
end

def calculate_strike(next_frame)
  next_frame[0] + next_frame[1] + 10  # 次のフレーム1・2回目の得点に10を足す
end

謎の数字(マジックナンバー)の「10」が何度も出てきてしまっています。読んだ人は「この10は一体なに?」と気になることでしょう😣
STRIKE_POINT = 10という定数を最初に定義することで、読みやすくなりました。


無駄な処理を書かない

うっかり不要な処理が残ったまま提出してしまったことが、何回もありました😅

無駄にデータ型を変換しない

user = { name: 'suzuka', age: 28 }
puts user[:name].to_s # 無駄に文字列に変換
puts user[:age].to_i + 1 # 無駄に数字に変換

長い処理を書いているうちに変数の中身がわからなくなり、余計な変換処理をしてしまっていました💦
変数の中身がどのようなデータ型なのか、常に意識しておくべきでした。

デバック用のコードは、削除しておく

require 'debug' # デバッガを有効にする
number = 0
total = []

while total.size < 10
  total << number
  binding.break # デバック用のブレークポイントを追加
  number += 1
  p total # プリントデバッグで変数の中身をチェック
end

debug.gemに関係するコードやpメソッドなど、デバッグで使用するコードが混じっています。他の人がコードを読む際に邪魔なので、削除しておくべきでした。


メソッドの定義をわかりやすく

メソッドを何のために定義するのか、どのように切り出すのかがわからず、悪戦苦闘しました。

メソッドを定義する目的を考える

このような短すぎるメソッドを沢山定義していました。

def sum_numbers(numbers)
  numbers.sum
end

current_numbers = [ 1, 2, 3 ]
current_sum = sum_numbers(current_numbers)

next_numbers = [ 2, 3, 4 ]
next_sum = sum_numbers(next_numbers)

「同じ処理をするならメソッドにするのがいいね!」という気持ちで切り分けましたが、逆に読みにくくなってしまいました。
メソッド多い分だけ、コードを読む時に複数の場所を行き来する必要が出てきます。

コードの可読性を上げたり修正しやすくしたりするなど、メソッドに切り出す目的を意識して、単純な処理のメソッドを量産しないようにします😢

暗黙の了解を満たさないと使えないメソッドを定義しない

def calculate_price(drink_order, food_order)
  # 値段を計算する処理
end

drink_order = { name: "コーヒー", price: 100 }
food_order = { name: "ケーキ", price: 200 }

total_price =
  unless today.sunday?
    calculate_price(drink_order, food_order)
  else
    drink_order[:price] + food_order[:price] # 日曜日は違う処理
  end

注文の値段を計算をするメソッドcalculate_priceを定義していますが、よく読むと使えるのは月〜土のみです😳

「呼び出すときは、暗黙の了解で日曜日以外にしてね」というメソッドは、使いづらくなってしまいます。メソッド名を工夫する、どんな引数でも処理できるようにするなど、わかりやすいメソッドにするべきでした。


条件式・繰り返しをわかりやすく

処理が複雑になるほど、理解が追いつかなくなり、ぐしゃぐしゃのコードを書いてしまうことがありました💧

ifには色々な書き方がある

例えばこのようなコードがあった場合です。

require 'date'
current_date = 【日付またはnilが入る】

if current_date.nil?
  next_date = Date.today + 1
else
  next_date = current_date + 1
end

next_date =ifの前に持ってくることができます。

next_date = 
  if current_date.nil?
    Date.today + 1
  else
    current_date + 1
  end

三項演算子を使って、1行で書くこともできます。

next_date = current_date.nil? ? Date.today + 1 : current_date + 1

状況に応じて、一番良い書き方を選択しましょう。

一つのループ処理の中に、役割を詰め込みすぎない

eachなど繰り返しの処理を、沢山使うのは良くない気がして、こんなコードを書いていました。

file_names = ["test.rb", "file1.txt"]

file_names.each do |file|
  # ファイルの詳細情報を取得する処理
  # ファイルのサイズの合計を計算する処理
  # ファイル名の文字数の最大値を割り出す処理
end

こういうコードは、3つの処理すべての流れを頭の中に入れなければならず、読むのがとても大変です💥
eachの節約をやりすぎず、処理をわかりやすく書くのに必要な分のループを回すべきでした。

感想

過去の自分に対するレビューを見るのは恥ずかしかったですが、成長を実感できました❣️丁寧なレビューをしてくれるメンターさんに改めて感謝です。
今書いているコードを、数ヶ月後に「酷いコードだ」と言えるよう、引き続き勉強を頑張ります💪

時間ができた時に「Webアプリ編」や(いつの日か)「脱初心者編」も書きたいです。

フィヨルドブートキャンプでプログラミングの勉強をする【4ヶ月目】

FJORD BOOT CAMP(フィヨルドブートキャンプ)で勉強を開始し、4ヶ月目が終了しました。1ヶ月間(7/4~8/3)の振り返りを書きます!

7月の過ごし方

今まで図書館と家で勉強していたのですが、暑くて外に出れなくなりました😭
朝の涼しいうちに散歩して、日中は家にこもって勉強していることが多かったです。

息抜きには、国立科学博物館に行きました。忠犬ハチ公や恐竜に会えたり、昔のコンピューターを見ることができ、感動しました😆

1960年代の座席予約システム「マルス101」: 日本初の本格的なリアルタイムオンラインシステム。超巨大でびっくりしました。マルス (システム) - Wikipedia


勉強の状況

7/4~8/3で、修了したプラクティスは以下の通りです。

1ヶ月間で修了したプラクティス一覧

Railsの基本を理解する

Sinatraを使ってWebアプリケーションの基本を理解する

wcコマンドを作る

質問をする力をつける

プログラムの修正(リバーシ編)

lsコマンドを作る5


FBCは卒業まで109のプラクティスがあります(2023/8/4現在)。数だけ見れば、ちょうど半分まできました。
ただ、課題はどんどん難しくなるので、実際のところは3分の1終わったかどうかだと思います😅


勉強時間

学習時間は4ヶ月間累計(122日)で818時間です。1ヶ月200時間ペースを継続しています。


達成したこと

  • 初めて質問をしました
    FBCの質問ページは、受講生卒業生全員が閲覧できる状態で、卒業後もずっと残ります。 「回答者にエスパーさせない」上手な質問が推奨されていることもあり、ビビって質問ができていませんでした💦
    素朴な疑問ですが、やっと質問することができました✨✨

  • 初めてプログラミングに関わる記事を書きました。
    上記の質問の際、メンターさんにブログにまとめることを勧めてもらいました。今まで、イベントの感想や学習の振り返りしかブログに書いていなかったので、プログラミングに関わる記事を書くのは緊張しました😱
    %記法の「i」「I」は何の頭文字? - すずかのプログラミング勉強記

  • Ruby Silverに合格できました。
    合格を沢山の方に祝っていただき、自己肯定感が3倍になりました✌️
    Ruby Silverに合格しました! - すずかのプログラミング勉強記


苦労していること

4ヶ月目にしてRuby on Railsの課題に突入しましたが、ファイル・フォルダの多さに迷子になっています。 どこに何を書けばいいのかわからず、赤ちゃんが巨大なガンダムを操縦しているような感覚です💦

「独習Ruby on Rails」を半分ほど読みました。私にとってはかなり難しく、なかなか進みません😭 自宅に「現場で使えるRuby on Rails 5 速習実践ガイド」もあるので、適度に浮気しながら頑張ります💪


イベントや勉強会に参加!

  • TokyuRuby会議14
    飲み食いしつつ、Rubyに関わるLTをして盛り上がろうというイベントです。
    人生で一番LTを聞いたんじゃないかと思うぐらい、沢山のLTを聞きました!(飛び込みや抽選を含めると35回ぐらい??)みなさん素晴らしいLTで、Rubyの面白さを再認識できました✨

  • Rails Girls Tokyo, More!
    RailsGirls卒業生向けの勉強会です。
    真面目な勉強会を想像していたのですが、穏やかにおしゃべりしながら勉強を進める雰囲気でした😊 RailsRubyについて色々教えていただきました❣️
    毎月開催されているので、8月も参加します!


今の気持ち

7月はRuby Silverの合格やイベント参加、ブログでのアウトプットなど、色々と学びが多かったです!
ブログでプログラミング関係の記事を書くのはまだハードルが高いですが、継続できるよう努力します💪


8月の目標

Ruby Silverに合格しました!

Ruby技術者認定試験Silver(通称RubySilver)に合格できました😆
75点がボーダーで、得点は86点でした。

勉強記録をまとめたいと思います!

自己紹介

すずかと申します。
前職は高校教諭として勤務していました。4月からFJORD BOOT CAMP(フィヨルドブートキャンプ)でプログラミングの勉強を開始し、受験時の学習歴は約4ヶ月です。 IT企業の勤務経験・他のプログラミング言語経験は全くなく、大学も文系学部という、真のプログラミング初心者です。

受験目的

学習成果を目に見える形にしたかったからです。
プログラミングを勉強していて、前の知識が定着しないままどんどん新しい知識が入ってきて、消化不良に陥ってしまいました💦「Rubyの内容のここまでは理解している!」という自信を持ちたかったというのが、受験の一番の目的でした。

勉強期間

約2ヶ月で、1~2時間程度の勉強を毎日継続しました。
金銭的問題で絶対に一発合格したかったので、割と余裕を持ったスケジュールだったと思います。 暗記系の内容が多いので、効率的に合格を目指すなら、もう少し短期戦でも良かったかもしれません。(私は2ヶ月前にやった内容を忘れてしまい、もう一度やり直すことになりました💦)

勉強方法

  1. RExを解く。
    無料で解ける模擬問題です。受験に悩んでいる人は、まずは試しにこれをやってみるのが良いです。 私は初めて解いた時に50点で、9割取れるようになるまで解き続けました。
  2. Ruby技術者認定試験合格教本の基礎問題・模擬問題を解く。
    2題問題があります。RExで9割とれるようになってから初めて解いたのですが、半分も解けませんでした💦
  3. Ruby技術者認定試験合格教本にざっと目を通す。
    模擬問題で玉砕したので、「合格教本」の Silverの範囲に目を通しました。800ページぐらいあるのであまり真剣に読みませんでしたが、知らない知識が沢山あって面白かったです。(試験にはあまり出なかったけど。。)

  4. 公式の模擬問題を解く。
    Ruby技術者認定試験Silver模擬問題 version3
     公式サイトに載っていた模擬問題です。
    旧試験の模擬問題
     旧バージョンの時の模擬問題だと思われます。念の為こちらも解きました。

  5. 先人たちの学習メモに目を通す。
    以下のサイトには試験直前までお世話になりました。
    模擬試験ガチで1問も解けなかった私がRuby Silverに合格したお話
     勉強法がとてもよくまとまっています。
    【Ruby技術者認定試験】ポイントまとめ
     頻出の内容をまとめてくれています。
    Ruby Silver試験前に見直すと幸せになれるメモ
     難しめです。模擬問題を解き尽くした後に見てみましょう。

    時間がない人へ→ 2, 4からの出題が圧倒的に多いです。最低限、ここだけは固めておきましょう。

費用

  • 受験料
    税込16,500円(学生は税込8,250円)です。この受験料から「絶対に合格せねば」というプレッシャーがあり、前日に眠れませんでした😅
  • 公式模擬問題集の購入費用
    合格にはRuby技術者認定試験合格教本の演習が必須です。こちらは電子書籍版が3960円です(私は夫が持っていたので購入はしていません)。
    試験後に教科書的に使用でき、RubyGoldの試験勉強にも使えるので、それを考えればお得かも?

本番の試験

見直しを4回しました。
試験時間は90分とたっぷりあるので、それでも15分ぐらい余りました。 終了ボタンを押してすぐ、「合格」という文字が出て、ホッとしました😌 ただ解いている時には「90点代いけるかな?」と思ったので、若干悔しかったです。

模擬試験と難易度は同程度だったように思います。 「Ruby技術者認定試験合格教本」と公式模擬問題からの出題が多かったです。(数問そのままの出題もありました。)

試験を受けるときの注意

  • 破壊的メソッドか非破壊的メソッドかに注意!
    RubySilverは、「変更したと見せかけて、非破壊的メソッドだから実は変わっていないよ」系の問題が大好きです。必ず見直しましょう。
  • 「正しいものを選べ」「誤っているものを選べ」を必ず確認する。
    模擬試験から、ここだけ変更している出題が見られました。ちゃんと見直さないと引っかかります。
  • いくつ選ぶのか注意!
    複数選択を見逃しがちです。私は見直しで2問ぐらいミスを発見しました。

試験学習を経て変わったこと

  • Rubyの面白さに気づけた。
    今まであまり深掘り学習してこなかったのですが、何度も問題を解くことで、理解が深まりました。わかるようになってくると、「ここはなぜこんな書き方ができるの?」というように、Rubyへの興味が湧いてきます。
  • コードが変わっていくのが実感できた。
    フィヨルドブートキャンプのカリキュラムで、lsコマンドやwcコマンド作りを同時並行で進めており、学んだメソッドをすぐ使えるのが嬉しかったです❣️やりたいことのドンピシャのメソッドが思いつくと、とても気持ちがいいです。

まとめと感想

私は試験勉強に時間をかけた方だと思うのですが、その分色々と学びは多かったです。「こんなの知らなかった!」という驚きや感動がありました!

試験勉強中はフィヨルドブートキャンプのカリキュラムの進みが遅くなったので、今後はびしびし進めていきます💪