give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

フィヨルドブートキャンプのメンターとしてやっていること、感じていること #fjordbootcamp

はじめに

このエントリはフィヨルドブートキャンプ Part 2 Advent Calendar 2020 22日目の記事です。
昨日はYuki Watanabeさんの「Gitちんぷんかんぷんな私がGitを学ぶ!そこから学習のコツを見つけるところまで」という記事でした。
フィヨルドブートキャンプのアドベントカレンダーにはPart 1もあります。

さて、僕は2020年2月からフィヨルドブートキャンプでメンターをやっています。
僕がメンターをやってみようと思ったのは、プログラマ界隈で定期的に話題になる「プログラミングスクールって、ちょっとどうなのよ?」というややネガティブな評価について、実際に中の人の立場で体験していろいろ考えてみたいと思ったからです。

フィヨルドのお二人とは以前から知り合いですし、フィヨルドブートキャンプについてはネット上であまり悪い噂を聞かない(むしろポジティブな評価の方が多い)ので、「ちょっと混ぜて〜」的なノリでメンターとして参加してみました。

というわけで、このエントリでは10ヶ月ほどフィヨルドブートキャンプでメンターをやってみた感想をあれこれ書いてみようと思います。

用語や人物関係の整理

フィヨルドブートキャンプをあまりご存じでない方のために、用語や人物関係を少し説明しておきます。

フィヨルドブートキャンプ
株式会社フィヨルドが提供するプログラミングスクール
フィヨルド
株式会社フィヨルドを指す(フィヨルドブートキャンプはプログラミングスクール、フィヨルドは企業)
駒形さん
株式会社フィヨルドのプログラマであり、フィヨルドブートキャンプのメンターでもある
町田さん
株式会社フィヨルドのデザイナーであり、フィヨルドブートキャンプのメンターでもある
メンター
フィヨルドブートキャンプで生徒の指導にあたるプログラマ。駒形さんと町田さん以外は現役プログラマが副業としてやっている
筆者(僕)
株式会社ソニックガーデンで本業のRubyプログラマをやりつつ、副業としてフィヨルドブートキャンプでメンターをやっている
f:id:JunichiIto:20201222155549j:plain
フィヨルドブートキャンプのマスコットキャラクター、ピヨルド(本文とは関係ありません)

【もくじ】

メンターとしてやっていること

提出物のレビュー

フィヨルドブートキャンプでは様々な実践的なプラクティスが用意されています。「Rubyでlsコマンドを再実装する」といったプログラミング問題はメンターがコードレビューをします。

僕も生徒さんが書いたコードをレビューして、ここがどうだ、あそこがどうだ、といろいろ細かいレビューをやってます。
ちなみに僕はテキストで書くのが面倒なので、スクリーンキャスト形式の動画を収録し、口頭で改善点を指摘することが多いですw

f:id:JunichiIto:20201222075939p:plain

日報の確認、およびコメントの記入

フィヨルドブートキャンプの生徒さんは勉強が終わったら毎日日報を提出するように言われています。
メンターにはその日報を確認し、確認済みボタンを押していく業務があります。

日報の中で生徒さんが困りごとを書いていたり、とてもいい話を書いていたりしたときは、コメントを返します。
生徒さんの心の内がわかるような日報は読んでいて興味深く、とても面白いです。

Q&Aの回答

フィヨルドブートキャンプにはスクール内teratail、またはStackOverflowともいうべきQ&Aコーナーがあります。
生徒さんが書き込んだ疑問点に答えられそうな場合は回答を書き込みます。
メンターが回答を書く前に生徒さん同士で疑問を解決してしまうときもあります。
生徒さんが書いた回答もしっかり内容が書けているので、さすがだなー、すばらしいなーと思いながら見ています。

Slackで雑談

フィヨルドブートキャンプには生徒さんやメンターが自由にやりとりできるSlackがあります。
卒業生やアドバイザー(フィヨルドブートキャンプとご縁のある企業のエンジニア)の人たちもSlackに参加しています。
ときには真面目な話を、ときには他愛もない雑談を、みんなでキャッキャウフフと楽しんでいます。

オンラインミートアップへの参加

フィヨルドブートキャンプでは毎月オンラインミートアップを開催しています。
都合が合うときは僕もミートアップに参加して受講生のみなさんとオンラインでお話ししたりしています。

メンターミーティングへの参加

フィヨルドブートキャンプでは毎月メンターだけで集まるメンターミーティングを開催しています。
このミーティング内でKPTふりかえりを行い、今の課題を共有したり、今後の具体的な改善策を考えたりしています。

f:id:JunichiIto:20201222071819j:plain
メンターミーティングの様子です
プラクティスの改善

今のプラクティスの内容だとわかりにくい、必要以上に時間がかかる、といった問題点が見つかった場合は、随時改善策を検討して実施しています。
プラクティス上の問題点は生徒さんの日報に書かれた困りごとなどから発覚することが多いです。
また、数ヶ月に一回、生徒さん向けのアンケート調査を行っているので、そこで共通して挙げられている困りごとが改善対象になるケースもあります。

たとえばフィヨルドブートキャンプには「課題図書を読む」というプラクティスがいくつかあるのですが、単に「本を読みましょう」というだけでは、覚えることがたくさんありすぎてしんどい、という苦痛の声がたくさんありました。
そこで、「なんのために読むのか」「大事なポイントはどこか」「最悪読み飛ばしてもいいポイントはどこか」といった説明を、各課題図書について追記していったりしました。

僕が以前作った「チェリー本の読み方」という動画もその一環で作成したものです。

著者自身が語る「プロを目指す人のためのRuby入門」の効果的な読み方 #チェリー本

メンターとして感じていること

ここから下は実際にメンターをやってみて感じていることをつらつらと書いていきます。

総じてみんなのモチベーションが高い

フィヨルドブートキャンプの生徒さんは真面目でモチベーションが高い人が多いな〜、という印象があります。
また生徒さんのみならず、フィヨルドの駒形さんと町田さんをはじめ、他のメンターやアドバイザーのみなさんもモチベーションが高く、みんないい人です。
みんな真面目でいい人でモチベーションが高いので、フィヨルドブートキャンプは雰囲気と居心地がいいコミュニティになっています。

僕が「とりあえずやってみっか」で始めてみたアドベントカレンダー企画があっという間にPart 2まで埋まってしまったところにも、みんなのモチベーションの高さを感じています😊

adventar.org
adventar.org

男女比が非常に良い

IT業界は男性中心なイメージがありますが、フィヨルドブートキャンプは男女比がほぼ半々ぐらいだと思います。(具体的な数字は知らないのでただの推測ですが)
僕はこの業界にもっと女性が増えてほしいと思っているので、フィヨルドブートキャンプの男女比はとても健全だな〜と思うことがよくあります。

僕は去年、TokyoGirls.rbという女性Rubyプログラマのためのイベントを主催しましたが(今年はコロナ禍の影響で未開催😣)、フィヨルドブートキャンプでメンターをやっていると「女性プログラマをたくさん増やす」という目的はもう達成できたんじゃないかと錯覚してしまいます(苦笑)。

Ruby業界とのつながりが強い

フィヨルドブートキャンプではRuby on Railsをメインに据えて教えています。
「プログラミングスクールといえばどこもかしこもRuby on Rails」という雰囲気なので、これだけだと「よそと同じ」に見えるかもしれませんが、フィヨルドブートキャンプでは「Rubyが大好きな人たち」がRubyやRuby on Railsを教えています。

「Rubyが大好きな人たち」は総じて「Ruby界隈のすごい人たち」なので、RubyやRuby on Railsを教えるプログラミングスクールとしては日本一かもしれません。(注:個人の感想です)
Ruby超入門の著者である五十嵐さんも技術顧問として参加されていますし、先日は角谷さんがブートキャンプ生のために「FJORD BOOT CAMP AS A GATE」という講演を開催してくださったりしました。

他にもudzuraさんやjune29さんなど、Ruby界隈ではお馴染みの面々がSlackやミートアップに参加してくれたりしています。

あ、そうそう、僕も「プロを目指す人のためのRuby入門(通称・チェリー本)」の著者なので、「まあまあすごい人」にカウントしてもいいかも(苦笑)。

そんなこんなで、Rubyを学ぶことにおいては、世にたくさんある「Rubyを使っているスクール」の中でもダントツに優れた学習環境が用意されているのではないでしょうか。(注:個人の感想です)

メンター陣が優秀

こう書いちゃうと自画自賛になっちゃいますが、フィヨルドブートキャンプはメンター陣がとても優秀です。
だって、フィヨルドブートキャンプは現役のRubyエンジニアが教えてくれるからです!

・・・と書いちゃうと、IT業界の人は「現役エンジニア?あー、あれね……(意味深)」という反応を示しそうですが、フィヨルドブートキャンプのメンターは正真正銘の現役エンジニアです。はい。

僕もそうですし、他のメンターもみんな、長年Rubyのコードを書いてご飯を食べてきている人たちです。
フィヨルドブートキャンプのメンターはみんな、本職の仕事(もちろんコードを書く仕事です)を持ちつつ、副業としてメンター業をやっています。
ちゃんと開発の現場の仕事を知っているので、開発の現場に即した実戦的な知見を提供してくれます。

スクラム開発のプラクティスがとても実践的

フィヨルドブートキャンプのカリキュラムの後半には、スクラム開発というプラクティスがあります。
これはフィヨルドブートキャンプ内で実際に利用している、Ruby on Rails製のEラーニングシステムを題材にして、実際のissueをスクラム形式で開発するというものです。

f:id:JunichiIto:20201222190616p:plain
Rails製のEラーニングシステム

対応するissueも「ここに新機能を追加したい」「この不具合を直してほしい」というリアルなissueそのものですし、生徒さんがそのissueを対応すればそれがそのまま自分が使っているEラーニングシステムに反映されます。

コードの規模もそれなりに大きいですし、フロントエンドにはVue.jsを使ったりしているので、あたかも新人として開発の現場に配属されたような気分が味わえます。
個人的にはこの超実践的なプラクティスが、フィヨルドブートキャンプのプログラミングスクールとしての大きな魅力の一つだと考えています。

月謝制なのが良心的

フィヨルドブートキャンプは入会金もなく、まとめて大金を用意する必要もない、月謝制です。
「自分にはちょっと合わないな」「入ってみたけど全然時間がなくて続けられなかった」と思ったら、いつでも退会できます。

最初にどーんと大金を払った方が自分に対するプレッシャーになる、という人もいるかもしれませんが、そうは言っても実際にやってみたら「あれれ??」と思うこともあるはずなので、月謝制になっているのはとても良心的だなと思います。

bootcamp.fjord.jp

退会されるとちょっと寂しい

月謝制ゆえに、途中で退会してしまう生徒さんもときどきいます。
退会した生徒さんの名前を見て「あー、この人、いっぱいコードレビューしたのにな……」と切ない気持ちになることも多々あります。

生徒さんにもそれぞれ事情があるので、ある程度クールに割り切る必要がありますが、それでもやっぱり僕も人の子なので、「○○さんが退会しました」という知らせを聞くのはちょっと寂しいものがあります😢

生徒さんの就職が決まると嬉しい

フィヨルドブートキャンプの生徒さんの多くは、プログラマとして就職するためにフィヨルドブートキャンプに入ってきます。(一部にはそうでない生徒さんもおられますが)

なので、「○○さんの内定が決まりました!という知らせを聞くと、「おお〜、おめでとう!!🎉🎉🎉」という気持ちになります。
そのあともたまに「就職後も楽しくやってます」という報告を聞いたりすると、「うんうん、良かったね〜」と、どこかのお母さんみたいな気持ちになります。

アフィリエイト広告を使っていないところが好き

プログラミングスクールをネットで検索すると、かなりの高確率でアフィリエイトブログに遭遇します。
中には実際にそのスクールを体験した上でアフィリエイトリンクを付けている人もいるのかもしれませんが、僕が見かけるのはホームページに載っている表面的な情報を集めて、「ここがオススメ!」みたいなランキングを勝手に付けているブログばかりです。

その点、フィヨルドブートキャンプは今のところアフィリエイト広告を使っていないので、僕は「誠実なプログラミングスクールだなあ」と思っています。

ただ、その代わりネット上の露出が少なく、「知る人ぞ知るプログラミングスクール」みたいになっている点がちょっと問題です。
この点については、もう少し状況を改善するためのマーケティング施策を打っていこう、という話をメンター内でしています。

(補足)
アフィリエイト広告を利用している=すべて不誠実なスクール、と言いたいわけではありません。ただ、アフィリエイト広告を見るとその情報が真実なのか、成果報酬だけを狙ったサクラ情報なのか見分けが付かなくなるので、僕はそのブログ上に並んだ評価を素直に受け入れられなくなります。

メンターの僕もいろいろ勉強になる

かれこれ15年以上、プログラマとして働いてきた僕ですが、生徒さんから出た何気ない質問に「えっ、そう言われたらたしかに変ですね。考えたこともなかったけど」みたいに思うことがあります。
そういった内容を調べて、答えが見つかって、「なるほど〜!勉強になった!!」と思ったことが何度もあります。

他にもフィヨルドブートキャンプの生徒さんがRubyの仕様に関する質問をQuoraに投稿して、それにMatzさんが答えてくれる、ということもありました。
僕も普通に知らなかった話で「へ〜、そうなんだ!!」と思ったことがあります。

jp.quora.com

jp.quora.com

そんなわけで、メンターである僕もときどき生徒さんから学ばせてもらっております。ありがたや〜🙏

質を上げるとコストがかかる、でも質は下げたくない、というジレンマ

提出物のレビューをしたりするときは、僕はついつい細かいところまで見てしまいます。

なんかイヤなんですよね。
「え、フィヨルドブートキャンプ出てるんでしょ?あの伊藤さんに教えてもらってるのに、そんなことも習わなかったの?」
みたいなツッコミを就職したあとに受けたりしたらどうしよう、なんて想像しちゃうと。

なので、「僕の中では最低限これぐらいはできてほしい」というハードルがあって、そこをクリアできていないと、ついついツッコミを入れてしまいます。

ただ、そうするとすごく時間がかかります。
僕はメンター業にかける時間を毎日30分から1時間ぐらいに制限しているので、1人か2人ぶんの提出物をレビューするとその日はそれで終わり、ということが多々あります。

ビジネスの観点から言えば、もうちょっと1人あたりのレビュー時間を短く抑えて数をこなした方がいいんでしょうけど、性格上なかなかそれができません😅
他のメンターも僕と同じような悩みを抱えているようです。

今のところは駒形さんと町田さんからは「今のペースでも大丈夫です」と言われているので、とりあえず質重視で提出物のレビューをしています。
いやー、でもなかなか悩ましい問題ですね、これは。

本当に900時間いるの?問題

フィヨルドブートキャンプでは「プラス戦力として就職できるエンジニア」を目指します。
「プラス戦力」と「マイナス戦力」の定義は駒形さんのブログで説明されています。

「多少の教育コストはかかるけど、レビューをしっかりやればトータルで見れば助かる」
このレベルがプラス戦力です。

「Railsのコードは書かせられないけどテスト仕様書を書いててもらおう」
こんな工夫が必要な場合、マイナス戦力です 😅

Railsエンジニアとして就職できるレベルとは - komagataのブログ

そして卒業生が「プラス戦力」となるために、かなりしっかりとしたプラクティスを用意しています。
全プラクティスを修了するためには、人によって大きく前後することはあるものの、一つの目安として「900時間ぐらいの学習時間が必要」と言われています。

Q. 学習を終えるのにどれくらいの時間がかかりますか?
A. かかる時間は人それぞれですが、プログラム経験が全くない人の場合、大体900時間弱の時間がかかります。

FAQ | FJORD BOOT CAMP(フィヨルドブートキャンプ)

生徒さんの中には学習時間が1000時間を超えている人もよく見かけます。

入念にしっかり学習するので、カリキュラムをすべて修了した生徒さんはプラス戦力になりますし、就職先も決まりやすいです。

ですが、もう少し短い時間でプラス戦力になれる方法はないかな〜と漠然と思ったりします。
全プラクティスを完走するまでめちゃくちゃ時間がかかるし、カリキュラムもそれなりにハードなので、それが途中退会してしまう一因になってるんじゃないかな〜、なんて思ったりもしますし。

「1ヶ月でエンジニア転職!」みたいな話は極端ですが、短すぎる「1ヶ月」と長すぎる「900時間」の間に、「もうちょっと効率よく○○時間でプラス戦力になれる勉強方法」が隠れているのでは?ということを考えたりします。
が、具体的な方法についてはまだノーアイデアです・・・😣

関東圏以外の就職先が見つかりにくい問題

フィヨルドブートキャンプはRailsエンジニアを育成しているので、就職先もRailsを使っている企業さんが中心になります。
ただ、Railsを使っている企業さんはやっぱり東京が中心です。
ですので、関東圏に住んでいる人とそれ以外の人を比べると、やはり就職のしやすさが変わってくる感は否めません。(僕も兵庫県に住んでいるので、その問題は肌で良く感じています)

もちろん非関東圏の就職先が皆無というわけではないですし、最近は最初からリモートで就職してしまう人もいます。リモート就職であれば住んでいる地域は関係なくなります。

格差がゼロになることはないかもしれませんが、そういった努力や工夫でその差が少なくなっていくといいなあ、と思っています。

改善のアイデアはたくさん出てくるけど、時間が足りない問題

毎月やっているメンターミーティングでふりかえりをすると、たくさんの改善ポイントが見つかります。
メンター全員で「そうだよね、ここがボトルネックだよね、改善したいね」という話はするのですが、いかんせんメンターも限られた時間の中でメンター業をやっているので、出てきたアイデアを実行に移す時間がなかなか取れません。

費用対効果の高そうな施策は優先順位を上げて取り組んでいるので、日々ちょっとずつは改善していってるのですが、それでもまだまだ時間が足りないと感じています。

とはいえ、「あれもやりたい、これもやりたい」と言ってるだけではいくら時間があっても足りないので、メンター内では「あえて、やらないことを決めていくのも大事なことなのでは」という意見もあります。
これもたしかにそのとおりなので、限られたリソースをうまく使う方法を日々考える必要があるよなーと思っています。

まとめ:フィヨルドブートキャンプはスクールというよりコミュニティっぽい

というわけで、このエントリでは僕がフィヨルドブートキャンプのメンターとしてやっていることと、感じていることをあれこれまとめてみました。
少しネガティブな感想も混じってはいますが、「ネガティブ=ダメ」というよりも、僕としては「これから改善していけばいいよねー」という気持ちでいます。

ちなみにフィヨルドブートキャンプはいちおう「プログラミングスクールのひとつ」という立ち位置になると思うのですが、実際中に入ってみるとあまりスクールっぽくないんですよね。
講師がいて、生徒がいて、教材があって、テストがあって・・・みたいな学校とはちがって、すごくコミュニティっぽいです。

じゃあ、「コミュニティってなんやねん」と聞かれると説明が難しいのですが、メンターも生徒さんもみんなで仲良くわいわいプログラミングの勉強をする集まり、みたいな感じがします。
id:ksmxxxxxxさんが先日書いてくれたアドベントカレンダーの記事が、うまくコミュニティっぽさを説明してくれている気がするので引用します。

オンラインスクールですが、授業とかレッスンみたいなものはありません。

各自でカリキュラムに取り組んで、わからないことがあればまず自分で調べて、わからなければSlackやオンライン上に質問したりするシステムがあるのでそこで質問してみたり、毎日夕方あたりにDiscordで雑談会を開いているのでそこで質問したりします。

つまり、学習はすべて自習ベースです。講師の方がいて、手取り足取り0から100まで教えてもらうという感じではないです。

(中略)

学習中はもくもくと進めますが、詰まったり、発見があったりするとカジュアルに「〇〇がわからんけど、これってどういうことなんだろう」とか独り言をつぶやいています。
つぶやくことで、メンターさんや他の学習している生徒さんが教えてくれたりなどしてくれます。
図書館に集まって、各自自習してるけど、わからないことあったりしてぼそっと呟くと、一緒に学習してる人が気がついてわかる範囲であれば「ここはねぇ」って感じで教えてくれる…みたいな感じです。

プログラミング学習サービスに参加して100日経過した話 - improve.design

カリキュラムは少しハードですが、メンター陣は優しいですし、生徒さん同士の仲もよいので、このノリや雰囲気が合う人は楽しく勉強できるかもしれません。
最初の3日間は無料でお試しできるので、興味を持った方はちょっと様子を覗いてみてください。

bootcamp.fjord.jp

って最後で急にステマっぽくなってしまいましたが(汗)、僕の感想は以上です。
最後まで読んでいただき、どうもありがとうございました!

【アウトライン版】サンプルコードでわかる!Ruby 3.0の主な新機能と変更点

お知らせ

毎年恒例の(?)Rubyの新機能解説記事を公開しました。
型チェックについてまとめたPart 1と、それ以外の新機能についてまとめたPart 2があります。

qiita.com

zenn.dev

お気づきかもしれませんが、Part 2はQiitaではなくZennを使って書きました。
その理由は読者の方が記事に対してお金を振り込めるからです!・・・といっても僕がそのお金を独り占めするわけではありません。
2021年1月31日までに集まったお金はRubyの普及と発展のためにRubyアソシエーションに寄付する予定です。
また、こういった技術記事に対して、どれくらいの人が対価を支払う意思があるのかという、調査・実験の目的も兼ねています。
そんなわけで、上記の記事が良かった、役に立った、と思った人はぜひサポート(対価)の支払いをお願いします🙏

さて、それはそれとして、今回書いた記事はどちらもかなり長いので、このブログではそれぞれの記事の見出しをリストアップしておきます。
記事のアウトラインをざーっと見て面白そう、と思ったら元記事の内容をチェックしてみてください!

Part 1 - Rubyで型チェック!動かして理解するRBS入門

  • はじめに
    • 本記事の情報源
    • 動作確認したRubyのバージョン
    • フィードバックお待ちしています
  • Ruby 3.0の概要(というか、個人的な印象)
    • 後方互換性を窓から投げ捨てるような大きな変化はないが、マニアックな仕様変更がちょこちょこある
    • Rubyの未来を担う新機能が導入された
    • その他の注目ポイント
    • Ruby 2.7.2以上を使っている場合は「見えない警告」に注意!
    • 参考情報:アウトライン版もあります
  • 言語上の変更点
    • キーワード引数とハッシュオブジェクトの自動変換が廃止された(キーワード引数と通常の引数の分離)
    • Procの引数展開の仕様が少し変わった
    • ... 引数を使う際に通常の引数も併用できるようになった
    • case/inを使うパターンマッチングが正式に導入された
    • 1行パターンマッチングの構文がin=>の2種類になった(実験的機能)
    • パターンマッチングにFindパターンが追加された(実験的機能)
    • endlessメソッド定義構文が導入された(実験的機能)
    • frozen-string-literal: trueのマジックコメントが有効なとき、式展開された文字列が凍結されなくなった
    • shareable_constant_valueマジックコメントが導入された(実験的機能)
    • 静的型解析の基盤が導入された(RBS、TypeProf)
    • 非推奨警告がデフォルトで出力されなくなった(Ruby 2.7.2から導入された変更点)
    • $SAFE$KCODEがただのグローバル変数になった
    • メソッド内で特異クラスを定義する際にyieldを呼ぶことが禁止された
    • 親クラスと親モジュールで同じクラス変数を書き換えると実行時エラーが発生するようになった
    • トップレベルでクラス変数を読み書きしようとすると実行時エラーが発生するようになった
    • 変数やメソッド名に_1_2を使うと構文エラーが発生するようになった
  • 後方互換性が失われる変更点
    • 正規表現リテラルで作られた正規表現オブジェクトが凍結されるようになった
    • 範囲オブジェクト(Range)が凍結されるようになった
    • Hash#eachが必ず2要素の配列を渡すようになった
    • pipeが閉じられてSTDOUTに書き込みできない場合に、エラーメッセージが出力されなくなった
    • 定数のTRUE/FALSE/NILが削除された
    • 最適化のためInteger#zero?Numeric#zero?をオーバーライドするようになった
    • Enumerable#grepEnumerable#grep_vに正規表現オブジェクトを渡し、ブロックを使わなかった場合、Regexp.last_match/$~を変更しなくなった
    • open-uriをrequireしても、openメソッドではURLが開けなくなった
  • バックトレース出力に関する変更点
    • バックトレースがRuby 2.4以前の表示順に戻った
  • コマンドラインオプションの変更点
    • ヘルプの表示が1画面ずつ表示されるようになった
    • --backtrace-limitでエラー発生時に表示されるバックトレースの行数を制限できるようになった
  • コアライブラリの変更点
    • ArrayクラスのサブクラスもArray#flattenなどのメソッドが常にArrayクラスのインスタンスを返すようになった
    • Array#[]Enumerator::ArithmeticSequenceを受け取って要素をスライスできるようになった
    • Dir.globDir.[]がデフォルトでソートされた結果を返すようになった
    • HashとENVに指定されたキー以外の要素を返すexceptメソッドが追加された
    • WindowsでENVのキーと値がUTF-8になった
    • WindowsでEncoding.default_externalがUTF-8になった
    • Hash#transform_keysHash#transform_keys!でキーの変換ルールをハッシュで指定できるようになた
    • freeze: falseオプション付きでcloneすると、内部的に呼ばれるinitialize_cloneメソッドにもfreeze: falseオプションが渡されるようになった
    • freeze: trueオプション付きでcloneすると、cloneで得られたオブジェクトも凍結されるようになった
    • Bindingオブジェクト付きでevalを呼んだ場合、__FILE____LINE__が、それぞれ"(eval)"の文字列と、評価される文字列内での行番号を返すようになった
    • 引数1個でBinding#evalを呼び出したときの__FILE____LINE__の出力内容が変わった
    • ブロックリテラルを使わずにラムダでないprocオブジェクトをlambdaメソッドに渡すと警告が出るようになった
    • モジュールAにモジュールBをあとからinclude/prependした場合も、すでにモジュールAをincludeしているクラスにモジュールBの内容が反映されるようになった
    • public, protected, private, public_class_method, private_class_methodが引数としてメソッド名を列挙した配列を受け取れるようになった
    • attr_accessor, attr_reader, attr_writer, attrが戻り値として定義されたメソッドのシンボルの配列を返すようになった
    • alias_methodが戻り値として定義されたエイリアスメソッドのシンボルを返すようになった
    • Procクラスに==eql?メソッドが実装された
    • 並行・並列処理プログラミングをサポートする新しいライブラリ、Ractorが追加された(実験的機能)
    • Random::DEFAULTがRandomクラスオブジェクトを返すようになり、なおかつ警告対象となった
    • StringクラスのサブクラスもString#upcaseなどのメソッドが常にStringクラスのインスタンスを返すようになった
    • Symbol#to_procがラムダのProcを返すようになった
    • 凍結された文字列を返すSymbol#nameメソッドが追加された
    • Warning#warncategoryオプション付きで呼ばれるようになった
  • 標準ライブラリの主な変更点
    • OpenStructが遅延初期化されなくなった
    • OpenStructのpublicなビルトインメソッドが!付きで呼び出せるようになった
    • OpenStructのYAMLサポートが改善された
    • OpenStructはなるべく使わない方がよい、という公式見解が出された
    • SortedSetクラスがsetライブラリから削除された
    • 要素を連結して文字列を返すSet#joinが実装された
    • Set同士の大小を比較する<=>演算子が追加された
  • その他
    • ruby2_keywordsを使った場合の空のハッシュを引数に渡したときの挙動が変わった
    • 初期化されていないインスタンス変数にアクセスしても警告が出なくなった
    • マルチスレッド関連/GC関連の変更点(見出しのみ)
    • その他の細かい変更点
  • まとめ
    • お願い:サポート(対価の支払い)をぜひお願いします!

zenn.dev

まとめ

Ruby 3.0は便利な新機能の追加よりも、重箱の隅をつつくような言語仕様の変更が多かったので、NEWS.mdの説明やissueを読んでもぱっと理解できず、何がどう変わったのか、なぜその変更が必要だったのか、といった点を把握するのにとても時間がかかりました。

それだけにプログラミング言語のあるべき仕様を考え、それを実装する大変さをネット越しに感じたので、それが記事の収益を寄付しようと思った大きな理由のひとつになります。

そんなわけで、Rubyコミッタのみなさんに感謝しつつ、僕の書いた記事も参考にしつつ、まもなくやってくるRuby 3.0時代を一緒に楽しみましょう〜😄

Rubyプログラマが勢いで仕事用のMacをBig Surにアップグレードしてみた

↑昨日こんなツイートをしてみたんですが、なぜか「さっさとBig Surに上げてしまいたい!」という欲求が勝ってしまい、勢いでBig Surにアップグレードしてみました。

f:id:JunichiIto:20201129071239p:plain

自分が人柱になってみたので、人柱情報を書いてみます。

ちなみに、結論から先に書くと、今のところBig Surにアップグレードしたことによる致命的な問題はありません。(注:アップグレードして3時間後の感想です)

事前の情報収集

Big Surに上げたい!といっても、何も考え無しにアップグレードしたわけではありません。
いちおう、情報収集はしておきました。

  • 会社の同僚が一人Big Surにアップグレードしていたので、彼の情報から致命的な問題はないことを確認。(ただし、彼の場合はクリーンインストールでBig Surに移行した)
  • 1週間ほど前に自宅用のMacをBig Surにアップグレードして、日常的なwebブラウジング等では特に大きな問題が起きないことを確認済み
  • 「よく使うアプリ名 + Big Sur」といったキーワードで、Big Sur関連のサポート情報やトラブル情報を検索 → リリース直後はいくつかトラブルがあったようだが、それも解決してるっぽい

上記のような情報収集の結果、総じて「何か致命的な問題が起きることはなさそう」と判断しました。

アップグレード前の準備

アップグレード前に以下のような準備をしました。

  • VirtualBoxを最新版にアップデート(バージョンが古いとBig Surで動かないという情報を見つけたため)
  • TimeMachineで最新のバックアップを取る
  • 一部のファイル群を外付けハーディスクに移動して、SSDの空き容量を100GB以上増やす

SSDの空き容量を増やしたのは以前Catalinaにアップグレードする際に以下のようなトラブルに遭遇したからです。

blog.jnito.com

アップグレード実施

以下のような手順でアップグレードを実施しました。(クリーンインストールではなく、データを保持したままのアップグレードです)

  • 昨日の晩、10時頃にアップグレードを開始して就寝(インストーラのダウンロードが始まる)
  • 今朝の午前3時頃、インストーラを実行(で、また寝た)
  • 今朝の午前4時半頃、インストールが完了していることを確認

すぐに動いたアプリ一覧

以下のアプリは特に問題なく起動しました。

  • Evernote
  • Excel/Word/Powerpoint(Version 16系なのでちょっと古いかも)
  • Quiver
  • RubyMine
  • やるぞ!青色申告
  • CotEditor
  • Karabiner Elements
  • Zoom(最新版にしないとCPU使用率が上がるので注意)
  • ATOK
  • Kindle
  • Krisp
  • Docker
  • Spotify
  • RubyMine
  • Railsの開発用サーバー(puma-dev)
  • RSpecの実行
  • PostgreSQL
  • git
  • Slack
  • MS Teams
  • Skype
  • Homebrew
  • Recordit
  • OmniDiskSweeper

あと、USB接続しているHappy Hacking Keyboard(HHKB)もちゃんと動いています。

PFU HHKB Professional2 Type-S 英語配列/白 PD-KB400WS

PFU HHKB Professional2 Type-S 英語配列/白 PD-KB400WS

  • 発売日: 2011/06/15
  • メディア: Personal Computers

最初はトラブったがなんとか起動したアプリ

MacVim

僕は普段macvim-kaoriyaをターミナルではなく、GUIアプリとして使っているのですが、BigSurでは画面が真っ黒になって使い物にならなくなりました。(真っ黒な画面と正常な画面を点滅するように切り替わったりするような動きもしていた)

f:id:JunichiIto:20201129081439g:plain

.vimrcや.gvimrcを削除して完全ノーマル状態で起動しようとしても現象は変わらず。
GitHubのissueも見ましたが、該当するようなissueは見当たらず、というか、「最近あまり活発にメンテされてない?」という印象。
(ちなみにターミナルから起動するVimは普通に動いていました)

というわけで、macvim-kaoriyaではなく、本家MacVimをインストールすることに。
GitHub issueにBig Sur関連のトラブル報告もあったので「大丈夫かな?」と思ったけど、無事に起動しました。

f:id:JunichiIto:20201129082733p:plain:w350

kaoriya版とどれくらいの違いがあるのかはあまりちゃんとわかってないのですが、とりあえず本家MacVimでも普通に使えそうな印象です。

VirtualBox

「Big Surに対応するために」と、事前に最新版にアップデートしていたのですが、Windows 10の仮想マシンを起動しようとしたら、以下のようなエラーが出ました。

Failed to open a session for the virtual machine win-10.

The virtual machine 'win-10' has terminated unexpectedly during startup with exit code 1 (0x1).

Result Code: NS_ERROR_FAILURE (0x80004005)
Component: MachineWrap
Interface: IMachine {85632c68-b5bb-4316-a900-5eb28d3413df}

エラーメッセージでググるといくつか情報が見つかるのですが、それを試しても効果無し。
いろいろ情報を探しまくった結果、最終的には以下のページの情報が解決策になりました。

virtualbox.org • View topic - NS_ERROR_FAILURE (0x80004005) on Mac VirtualBox

どうやらMacのSIPという設定を有効化(enabled)にする必要があるみたいです。
僕のMacの設定を見ると一部が無効化(disabled)になっていました。(無効化した記憶がないのになぜ??)
で、以下のページを参考にしてSIPを有効化すると無事にVirtualBoxのWindows 10が起動しました。

OS X 10.11 El Capitanのシステム保護機能「Rootless」を無効にするcsrutilコマンドの使い方。 | AAPL Ch.

一段落したあとにやったこと

万一Macが起動しなくなったときにそなえて、起動用USBメモリを作成しました。
ちなみにUSBメモリは16GB以上の容量が必要です。(8GBだと容量不足で入りません)

macOS の起動可能なインストーラを作成する方法 - Apple サポート

まとめ

MacVimとVirtualBoxが起動しなくなったときは「うわ、ヤバい」と思いましたが、なんとか無事に解決できました。
というわけで、今のところBig Surで致命的な問題は発生していません。(繰り返しますが、アップグレードして3時間後の感想です)

もし新たな問題に遭遇したときはこの記事にまた追記していきます!

(独り言)今使ってるMacBook Proはデュアルコアなんだけど、「もっとコア数が欲しい」と思うことが増えてきたので、M1チップのMacBook Proにも移行したい・・・。

おまけ

あの「ジャーーン」音、単純にMacらしい体験ができるだけじゃなくて、Safeブート起動時にキーボードを押さえるタイミングを把握したり、Macが生きてるか死んでるかを確認したりするのにとても有用なんですよね〜。

いろいろ追記

Big Surを使い始めて困った点と解決策をまとめていきます。

libv8がインストールできない問題

とあるプロジェクトでbundle installしようとすると以下のようなエラーが発生しました。

Installing libv8 3.16.14.19 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/ext/libv8
/Users/jnito/.rbenv/versions/2.7.2/bin/ruby -I /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/2.7.0 -r ./siteconf20201129-8361-165txge.rb extconf.rb
creating Makefile
Applying /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/patches/disable-building-tests.patch
Applying /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/patches/disable-werror-on-osx.patch
Applying /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/patches/disable-xcode-debugging.patch
Applying /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/patches/do-not-imply-vfp3-and-armv7.patch
Applying /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/patches/do-not-use-MAP_NORESERVE-on-freebsd.patch
Applying /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/patches/do-not-use-vfp2.patch
Applying /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/patches/fPIC-for-static.patch
Compiling v8 for x64
Using python 2.7.16
Using compiler: c++ (clang version 12.0.0)
Unable to find a compiler officially supported by v8.
It is recommended to use GCC v4.4 or higher
Beginning compilation. This will take some time.
Building v8 with env CXX=c++ LINK=c++  /usr/bin/make x64.release ARFLAGS.target=crs werror=no
GYP_GENERATORS=make \
	build/gyp/gyp --generator-output="out" build/all.gyp \
	              -Ibuild/standalone.gypi --depth=. \
	              -Dv8_target_arch=x64 \
	              -S.x64  -Dv8_enable_backtrace=1 -Dv8_can_use_vfp2_instructions=true -Darm_fpu=vfpv2 -Dv8_can_use_vfp3_instructions=true -Darm_fpu=vfpv3 -Dwerror=''
  CXX(target) /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/vendor/v8/out/x64.release/obj.target/preparser_lib/src/allocation.o
clang: warning: include path for libstdc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
In file included from ../src/allocation.cc:33:
../src/utils.h:33:10: fatal error: 'climits' file not found
#include <climits>
         ^~~~~~~~~
1 error generated.
make[1]: *** [/Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/vendor/v8/out/x64.release/obj.target/preparser_lib/src/allocation.o] Error 1
make: *** [x64.release] Error 2
/Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/ext/libv8/location.rb:36:in `block in verify_installation!': libv8 did not install properly, expected binary v8 archive
'/Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_base.a'to exist, but it was not found (Libv8::Location::Vendor::ArchiveNotFound)
	from /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/ext/libv8/location.rb:35:in `each'
	from /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/ext/libv8/location.rb:35:in `verify_installation!'
	from /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19/ext/libv8/location.rb:26:in `install!'
	from extconf.rb:7:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/libv8-3.16.14.19 for inspection.
Results logged to /Users/jnito/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-19/2.7.0/libv8-3.16.14.19/gem_make.out

An error occurred while installing libv8 (3.16.14.19), and Bundler cannot continue.
Make sure that `gem install libv8 -v '3.16.14.19' --source 'http://rubygems.org/'` succeeds before bundling.

In Gemfile:
  therubyracer was resolved to 0.12.3, which depends on
    libv8

こちらのissueに「このシェルスクリプトを使え」という参考情報が載っていますが、僕が使っているlibv8は3.16.14.19 というかなり古いgemなのでこのスクリプトが使えませんでした。
いろいろ探した結果、こちらのページに載っていた以下のインストール手順が役に立ちました。

$ brew install v8@3.15
$ bundle config build.libv8 --with-system-v8
$ bundle config build.therubyracer --with-v8-dir=$(brew --prefix v8@3.15)
$ bundle install
Bug Surでお仕事したけどトラブル無し

Big Surで初めて仕事に挑みましたが、コードを書いたりビデオ会議をしたりする上で特にトラブルは発生しませんでした😄

月〜水と3日間仕事で使ったけどトラブル無し

3日間仕事でバリバリ使いましたが、特にトラブルは起きませんでした。
僕の開発環境においては、ふつうに使えると言っても大丈夫そうです ✌️

1週間使っても問題なし

でした!