拝啓 クソ記事を書いた私
はじめに
こんにちは。 昨日こんなアドベントカレンダーの記事を書きました。
この記事についてちょっとした裏話があるので簡単に簡単に記録してみようと思います。
もともとはこんなはずじゃなかった
元はアドベントカレンダーの記事を書くついでにJavaScriptの非同期処理についてしっかり勉強し、「【JavaScript】非同期処理完全に理解した」という記事を書く予定でした(ひどいタイトル…)。
公開した記事の中で作っているクリスマスプレゼント選定プログラムも、機能を付け加える過程で非同期の処理について説明し、最終的にはnpmにして公開できるようなものを想定していました。
昨日の早朝までコードを書いて試していたんですが、なかなか動くものが書けないし、非同期処理の仕組みも書き方もnpmの公開手順も全く分かってない自分に気づきました。 能力と時間を甘く見積もりすぎた結果ですね。
そこでギリギリだけど軌道修正するしかないと考え、今動いているコードを使って書けそうなことがないかと悩んだ結果、ちょうど輪読会で読んでいる『リーダブルコード』を切り口に軽いTipsが書けるんじゃないかと思いつき構成を変えて書き直しました。
何がそんなにショック?
私は昔から自分への期待値がめちゃくちゃ高いほうで、困難なことも「自分ならできる」と思っている一方、期待通りにできないときのショックがかなり大きいです。
昨日はショックで寝込んでいたんですが、布団の中で思っていたのは「何も分からないって事実に向き合わずにクソ記事を手癖で書いてしまった」ということでした。
書きたいコードが書けないし非同期処理が分からないようなダサい自分にがっかりした以上に、納得の行ってない記事を公開する厚顔無恥さ(笑)にショックを受け、告知もしたくないし反応も見たくないのでTwitterアプリを消して、参加している輪読会も休んでひたすら寝てました。
でも冷静になってみると、「文豪でもないのに何をそんなに大げさにがっかりしてるんだろう…」という感じがします。
締め切りを守っただけ100点じゃん。残り物アレンジしたわりにはちゃんとした記事になっているし。
おわりに
締め切りを守ってそこそこ読める記事を書いた自分をそれでも「ダサい」と感じるのだとしたら、それは単にクソ記事を書く経験が足らないだけ!!!
なのでこれを機にもっともっとしょうもないアウトプットを粗製乱造して自己肯定感を上げていこうな!
【リーダブルコード】自作プログラムの無関係の下位問題抽出に取り組みたい
はじめに
こんにちは。これはフィヨルドブートキャンプ Part 1 Advent Calendar 2021の6日目の記事です。 フィヨルドブートキャンプ Part 2 Advent Calendar 2021 - Adventarもあります。
5日目はharuna (id:napple29)さんのオンラインでのコミュニティ参加についての記事でした。
今となってはフィヨルドに馴染むというのはなんだかしっくり来ず、色々と参加している人が側から見ると馴染んでいるように見えるだけなのでは、と思います。
本当に自分もそう思います…。
私も今でこそコミュニティに積極的に参加している方ですが、最初に質問タイムに入ったときは、ガチガチに緊張してペアプロしてもらってる1時間ずっと正座していましたし、(輪読会を通じて知り合いができるまで)ミートアップは話すこともないし話にもついていけないからほとんど行ってませんでした。
多分ほとんどの人はそうだと思うので、億劫でなければ何かに一度飛び込んでみるのはそんなに怖くないって知っておいてほしいし、誰も話す人がいないから参加しづらいって方は私に話しかけてくれたらいいと思いますよ😄
ちなみに12/18(土)の初めてのLT会vol.10は私も登壇するのでよろしくおねがいします🙏
もくじ
自己紹介
トミーと申します。インターネット上ではeatplaynapもしくはeatplaynap329というアカウント名で活動しています。
2020年10月1日にフィヨルドブートキャンプに入って1年以上が経過しました。 現在はJavaScriptのプラクティスをやっています。
去年のアドベントカレンダーにも参加していて、あれからDuolingoの継続日数は900日を超えましたが、卒業はまだ遠そうです…😇
無関係の下位問題抽出 is what
以前こんな記事を書いたんですが、現在私は2つの『リーダブルコード』の輪読会に参加しています。
(日本語で読む会を主催したところ、英語で読む会も爆誕したのでそっちにも参加している)
2つの輪読会両方にコンスタントに参加しているのは今のところ私だけなので、おそらく現在フィヨルドブートキャンプ内で1番リーダブルコードを読み込んでいる人間なのではないかと思います。
読んでいる中で、どうしても気になったのが10章の「無関係の下位問題を抽出する」のこんな文面です。
ほとんどのコードは汎用化できる。一般的な問題を解決するライブラリやヘルパー関数を作っていけば、プログラムに固有の小さな核だけが残る。
この技法が役に立つのは、プロジェクトの他の部分から分離された、境界線の明確な小さな問題に集中できるからだ。こうした下位問題に対する解決策は、より緻密で正確なものになる。それに、あとでコードを再利用できるかもしれない。
Dustin Boswell/ Trevor Foucher『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)』角 征典訳、オライリージャパン、2012年、141頁
つまり、些末な詳細をどんどん切り分けていけば、そのプログラムによって本当に解決しなくてはいけない問題だけが残るので、集中して取り組むべき点が明確になるということだと理解しました。なんて美しい考え方なんだ!
そのために、コードを書くなかで「無関係の下位問題」がないかと常に考え、あれば積極的に関数に切り出すことが推奨されています。
自分はRubyでもJSでも関数への切り出しを積極的にやっていないので、後で自分の書いたものを読むと読みづらいなあと思うことがしばしばあります。
しかしリーダブルコードガチ勢として、もっとリーダブルなコードが書けるようになりたい。
なのでこの記事では自分の書いた簡単なプログラムを、関数への抽出という観点からセルフリファクタリングしていこうかと思います。
書くプログラム
Node.jsでコマンドラインで動く「クリスマスプレゼント選定プログラム」を書いてみようと思います。 流れとしては↓のような感じ。
- 標準入力から年齢を受け取る
- 15歳以下かどうか判定
- 15歳以下だったらJSONファイルから年齢に応じたおもちゃをプレゼント
- 16歳以上だったらMath.random()で計算した金額をプレゼント
- プレゼントをコンソールに出力する
ちなみに自分は10歳までサンタクロースを信じていて、10歳のクリスマスプレゼントが電子辞書だったことに不信感を抱いて親を問い詰めたら「いつまで信じているんだろうとヒヤヒヤしていたのでやっと気づいてよかった」と言われました🤔
本編
ベタ書きで書いてみる
年齢と対応するプレゼントのデータが入ったJSONファイルをつくり、思いつくままコードを書いてみました。
#! /usr/bin/env node const fs = require('fs') console.log('年齢を教えてね') const input = parseInt(fs.readFileSync('/dev/stdin', 'utf8')) if (input < 0 || isNaN(input)) { console.log('HOHOHO 正しい年齢を入力してね') } else if (input <= 15) { const presents = JSON.parse(fs.readFileSync('gifts.json', 'utf8')) const result = presents.find(present => present.age === input) console.log(`メリークリスマス!${result.name}を贈ります${result.emoji}`) } else { const gift = Math.floor(Math.random() * 100) * Math.floor(Math.random() * 100) console.log(`メリークリスマス!${gift}円を贈ります🎉`) }
↑を実行すると、標準入力で受け取った数値を元にJSONファイルの検索が行われ、↓のような結果が得られます。
❯ ./ver1.js 年齢を教えてね 0 メリークリスマス!ぬいぐるみを贈ります🧸 ❯ ./ver1.js 年齢を教えてね 15 メリークリスマス!ノートパソコンを贈ります💻 ❯ ./ver1.js 年齢を教えてね 28 メリークリスマス!4940円を贈ります🎉 ❯ ./ver1.js 年齢を教えてね -1 HOHOHO 正しい年齢を入力してね
関数もないし同期的な処理なので、上から順に処理させるだけです。
簡単なプログラムなのでこのままでも別に読みにくくて大変とは思わないんですが、工夫してもっと読みやすくできればいいな。がんばります。
関数を導入
先程のコードは上から順に処理を書いているだけだったので、標準入力から年齢を受け取る部分と、年齢に応じてプレゼントを選ぶ部分を関数にしてみます。
#! /usr/bin/env node const fs = require('fs') const getAge = () => { console.log('年齢を教えてね') const input = parseInt(fs.readFileSync('/dev/stdin', 'utf8')) return input } const selectGift = (age) => { if (age < 0 || isNaN(age)){ console.log('HOHOHO 正しい年齢を入力してね') } else if (age <= 15){ const presents = JSON.parse(fs.readFileSync('gifts.json', 'utf8')) const result = presents.find(present => age === present.age) console.log(`メリークリスマス!${result.name}を贈ります${result.emoji}`) } else { const gift = Math.floor(Math.random() * 100) * Math.floor(Math.random() * 100) console.log(`メリークリスマス!${gift}円を贈ります🎉`) } } selectGift(getAge())
標準入力から値を受け取る部分をgetAge関数、プレゼントを選ぶ部分をselectGift関数にしてみました。
ただ各関数には無関係の下位問題がまだありそうです。
たとえばselectGift関数の中では年齢に応じたプレゼントを選ぶ処理と、結果を出力する処理が同時に行われていて読みづらいです。この関数はプレゼントを選ぶ処理に専念させて、出力用の関数を別途作りたいです。
関数をさらに導入
selectGift関数でひとまとめにしていた処理を、下記の3つの関数に書き換えてみました。
- giftForKids関数: 引数で受け取った年齢に応じてJSONファイルからプレゼント情報を取ってきて返り値に持ちます。
- giftForAdults関数: Math.random()して出た数2つをかけ合わせ、プレゼントとして渡される金額を取ってきて返り値に持ちます。
- printOutput関数: 引数で受け取った年齢に応じて出力処理を行います。
#! /usr/bin/env node const fs = require('fs') const getAge = () => { console.log('年齢を教えてね') const input = parseInt(fs.readFileSync('/dev/stdin', 'utf8')) return input } const giftForKids = (age) => { const gifts = JSON.parse(fs.readFileSync('gifts.json', 'utf8')) const gift = gifts.find(gift => age === gift.age) return gift } const giftForAdults = () => { const money = Math.floor(Math.random() * 100) * Math.floor(Math.random() * 100) return money } const printOutput = (age) => { if (age < 0 || isNaN(age)) { console.log('HOHOHO 正しい年齢を入力してね') } else if (age <= 15) { console.log(`メリークリスマス!${giftForKids(age).name}を贈ります${giftForKids(age).emoji}`) } else { console.log(`メリークリスマス!${giftForAdults()}円を贈ります🎉`) } } printOutput(getAge())
関数に切り分けるとコードがきれいになっているような気持ちになってきました!
ただ、printOutput関数の中のメリークリスマス!${giftForKids(age).name}を贈ります${giftForKids(age).emoji}
の箇所がめっちゃ読みづらいのと、fs.readFileSync()が2箇所で重複しているので、共通化できるかも?とも思います。
これでどや
#! /usr/bin/env node const fs = require('fs') const getData = (resource) => { return fs.readFileSync(resource, 'utf8') } const getAge = () => { console.log('年齢を教えてね') const input = getData('/dev/stdin') return parseInt(input) } const giftForKids = (age) => { const gifts = JSON.parse(getData('gifts.json')) const gift = gifts.find(gift => age === gift.age) return `メリークリスマス!${gift.name}を贈ります${gift.emoji}` } const giftForAdults = () => { const money = Math.floor(Math.random() * 100) * Math.floor(Math.random() * 100) return `メリークリスマス!${money}円を贈ります🎉` } const printOutput = (age) => { if (age < 0 || isNaN(age)) { console.log('HOHOHO 正しい年齢を入力してね') } else if (age <= 15) { console.log(giftForKids(age)) } else { console.log(giftForAdults()) } } printOutput(getAge())
う〜ん、getData 関数は名前もよくないし、あんまり必要なさそうな感じがしました。『リーダブルコード』には無理やり必要のない箇所まで関数にすると可読性を損なうと書いてあったので、これはやりすぎなのかもしれないです。
おわりに
プログラムの出来はともかく、自分的にはかなりアグレッシブに無関係の下位問題抽出に取り組めたのでとりあえず満足しました。
JS本当に難しいので、これからも簡単なプログラムを書いて遊びながら慣れていきたいし、いつかはリーダブルなJSを書けるようになれるといいな。
コードの中身で気になるところがある方がいたら教えて下さい🙏
明日はpofkuma(id:pofkuma)さんです!
参考資料
- リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
- 日本語版と英語版を読みくらべても、私はこの日本語訳かなり好きです。簡潔で読みやすいと思います。
- The Modern Javascript Bootcamp Course (2022) | Udemy
- Udemyで1番人気のあるJSコースなんですけど、私も大好きです。コードの説明がめっちゃ具体的なのが好き。
- JavaScript Primer - 迷わないための入門書 #jsprimer
- fsモジュールのことは第二部を読むととても分かりやすいです。
JavaScript Primer合宿とは何か
はじめに
こんにちは。 所属するフィヨルドブートキャンプ(以下FBC)にて、先週木曜まで10日かけてJS Primer合宿と称した短期集中型の輪読会を行いました。
JavaScriptの入門書である↑の書籍を、数名の方と一緒に読み進めました。 合宿と言っても泊まり込みで何かをしたわけではなく、Discord上で1日5-7時間の輪読会を10日間(途中休みあり)で読み続けるというイベントです。
予想通りめっっちゃ疲れたんですが、最終的にはやってよかったな〜と思ったので、どう進めたのか軽くメモしておきます。 JS Primerをこれから読む方、合宿を主催してみたい方、次の合宿に参加したい方の参考になったら嬉しいです!
目次
開催まで
以前から、ブートキャンプの新しいプラクティスに入ったとき、参考資料を読んでもあまり頭に入ってこなくてモチベーションを保てず、集中して取り組めずダラダラしてしまうという悩みを抱えていました。 プラクティスの取り組み方についてすでに完了している方に聞いてみたり、動画教材を使ってみたりと自分なりに工夫してはいたのですが、やっていることや取り組み方に確信が持てずいろんな教材に手を出して時間やお金を無駄にする日々でした。
しかし、日々他の受講生と雑談する中で、こういう悩みを抱えている方は自分だけじゃないことを知りました。
そこで、同じくらいのプラクティスの進捗の方と一緒に、おすすめされている教材を輪読形式で読むという案が思いつきました。 どうせ1人で何日も読むことになるのであれば、人と一緒に読んだ方が理解も進むし、記憶にも残るし、何より強制力があるのできちんと読み終えられそうです。
多少無理なスケジュールで集中して数日で読み終えようと考え人を募集したところ、異常にやる気のある方が3人集まってくださりすぐに開始させることができました(開始後に追加で3人ほど増えました)。
全日程
当初の予定は5時間*5日(1日6章)で進めるつもりだったのですが、案の定計画通りに進みませんでした。 実際に進んだ範囲とかかった時間について軽くまとめてみようと思います。
10月10日(日) 1日目
読んだ範囲
- はじめに · JavaScript Primer #jsprimer
- JavaScriptとは · JavaScript Primer #jsprimer
- コメント · JavaScript Primer #jsprimer
- 変数と宣言 · JavaScript Primer #jsprimer
- 値の評価と表示 · JavaScript Primer #jsprimer
- データ型とリテラル · JavaScript Primer #jsprimer
- 演算子 · JavaScript Primer #jsprimerの文字列結合演算子の最後まで
初日から6章終えられていない!
学習時間
5時間
一言
初日なので各自目標を立ててもらいました。私の目標は↓の通り。
JS Primerを一周して、頭の中にインデックスを作りたい
ケンカ別れのないよう穏やかにやる😌
10月11日(月) 2日目
読んだ範囲
学習時間
5時間
一言
合宿参加者のやつはしさん(以下Yatz)がJS Primerのリポジトリに誤字修正のPRを送ってマージされていた!
誤字修正だけど、初めての外部リポジトリへのプルリクがマージされた、嬉しい🙌https://t.co/zDsNJrnkCe
— やつはし (@yatsuhashi168) 2021年10月10日
10月12日(火) 3日目
読んだ範囲
- 文と式 · JavaScript Primer #jsprimer
- 条件分岐 · JavaScript Primer #jsprimer
- ループと反復処理 · JavaScript Primer #jsprimer
- オブジェクト · JavaScript Primer #jsprimer
学習時間
5時間
一言
参加者のタマキ (id:shirotamaki)さんも誤字修正のPRを送り、その日中にマージされていました!
私も気になったところがあったので、issueの登録をしてみました!(後日Yatzが修正PRを送ってくれてclose済み)
10月13日(水) 4日目
読んだ範囲
- プロトタイプオブジェクト · JavaScript Primer #jsprimer
- 配列 · JavaScript Primer #jsprimer
- 文字列 · JavaScript Primer #jsprimer
学習時間
6時間
一言
当初は木曜で終わる予定ではじめましたが、全く終わりが見えずちょっと疲れが溜まってきました!
10月14日(木) 5日目
読んだ範囲
- 文字列とUnicode · JavaScript Primer #jsprimer
- ラッパーオブジェクト · JavaScript Primer #jsprimer
- 関数とスコープ · JavaScript Primer #jsprimer
- 関数とthis · JavaScript Primer #jsprimerの関数とメソッドにおけるthisまで
学習時間
6時間30分
一言
関数の範囲に入ってから、参加者の中でもJSに馴染みがある人と知識ゼロの人との間で理解度に大きな差が生まれてきた感じがしました。
主催者の私自身が知識ゼロ側の人間だったので、分かっている方には申し訳ないと思いつつも、復習を挟んだり理解度を確認したりして、進み方を意図的に遅らせるように変えました。
10月15日(金) 6日目
読んだ範囲
- Arrow Function以外の関数におけるthisから関数とthisの章の最後まで
学習時間
6時間くらい
一言
thisの章がとても難しく、まる1日かけてコードを読み進めましたが、最終的には「今のJSは分かりづらいのでなるべくthisを使わない方向に進化している」というがっかりなオチでした😭
※FBC卒業生のMashioSano (id:mashoo1101)さんが書かれた記事にも、thisを変数に入れる手法を「徹底的に消していきたい」と書かれています…😭
しかし、この日の副産物として、thisを理解するためにコールバック関数の動きやメソッドの呼び出し方を復習しながら丁寧に読み、結果かなりJSのコードが読めるようになったので無駄ではなかったと思いたいです…!
10月18日(月) 7日目
読んだ範囲
学習時間
6時間
一言
やっとクラス・例外処理まで終わりました! 前日のthisが大変だった分、この日はあまり苦労せずに済みました。
10月19日(火) 8日目
読んだ範囲
学習時間
7時間
一言
山場の非同期処理なので、最初から2日に分けて読むことに決めていたので時間をかけてコードを読み解きました。 参加者のMaedaさんも誤表記修正のPRを出してくれました。Gitの履歴を見て修正していて偉い!
10月20日(水) 9日目
読んだ範囲
- Promise.allで複数のPromiseをまとめるから非同期処理:コールバック/Promise/Async Functionの章の最後まで
- Map/Set · JavaScript Primer #jsprimer
学習時間
6時間
一言
やっと非同期が終わり、後1日で終わりそうなのでみんなホッとしました!!
10月21日(木) 10日目
読んだ範囲
- JSON · JavaScript Primer #jsprimer
- Date · JavaScript Primer #jsprimer
- Math · JavaScript Primer #jsprimer
- ECMAScriptモジュール · JavaScript Primer #jsprimer
- ECMAScript · JavaScript Primer #jsprimer
- 第一部: おわりに · JavaScript Primer #jsprimer
学習時間
5時間
一言
やっと終わりました!この日はほぼ落ち穂拾い的な章だったので、リラックスして最終日を迎えられました。
初日に決めた目標に対しては、↓のような感想。
ケンカ別れせず楽しくできたのでよかった!
頭の中にインデックスも作れたので、これから迷った時どう調べていけばいいか、MDNどう読めばいいかは分かった!
良かったこと
1番良かったのは楽しく学習ができたことです!ひとりで5〜6時間本を読むのは辛いと感じることのほうが多いですが、人と一緒にワイワイしながら読むと時間がすぎるのがあっという間でした。
そして、JSをまだ自由に書けるには程遠いですが、かなり基礎知識が付いてコードが読めるようになったのは良かったです。 全部で9個あるFBCのJSのプラクティスのうち7個は、合宿後すぐに終わらせることができました。
JS Primerを1度読んだからといってメチャクチャJSが書けるようになるかというと私の場合そうでもなかったですが、合宿中に分からない箇所を周りの人にしつこく聞いたり、自分が理解できたところをコードを解説しながら人に教えた経験によって、普通に読むより理解が深まったとは思います。
あともちろんJS Primerに微力ながらコントリビュートできたのもとても良かったことのひとつです〜!
反省点
反省点はめちゃくちゃあります…。まず時間をかけすぎました。 最初から10日の予定で進めていたわけではなく、「終わるまで」という適当すぎる日程で進めてしまったため、メンバー全員の精神的負担になっていた気がします。 次やるときは、事前に決めた日程をきっちり守るようにしたいです。
そしてJS Primerに関して言うと、難しい範囲だけ輪読会で読むような進め方でも良さそうだったと思います。 個人的に難しいと思った範囲は↓です。
- オブジェクト · JavaScript Primer #jsprimer
- プロトタイプオブジェクト · JavaScript Primer #jsprimer
- ラッパーオブジェクト · JavaScript Primer #jsprimer
- 関数とスコープ · JavaScript Primer #jsprimer
- 関数とthis · JavaScript Primer #jsprimer
- クラス · JavaScript Primer #jsprimer
- 非同期処理:コールバック/Promise/Async Function · JavaScript Primer #jsprimer
また、事前告知をほぼしないまま知ってる方に声をかけてスタートさせてしまったため、もっと多くの方に周知した方がよかったなとも思いました。 同じくらいの知識・モチベーションの方がもっと集まれるような工夫をしていけたら最高ですね!
おわりに
合宿スタイルのオンライン勉強会はためになるし楽しいので、これからも頻繁に開催したり参加したいと思ってます〜!
次は私がJSのプラクティス終わり次第、Vue.jsの合宿をやろうと思いますので、参加希望者は心の準備だけしておいてください!!!
英語を学ぶ楽しみ
ボロい会社の話
5年ほど前、当時通っていた歯医者の近くに、年季の入った建材会社がありました。 虫歯治療をしていたので、1.5ヶ月ほど週1でその会社の前を通っていたのですが、通るたびに「ボロい会社だな」くらいにしか思ったことがありませんでした。 それから1年後、今度はマウスピースを作りに同じ歯医者に通い始めました。
同じ道を通って同じ建材会社の前を通ったとき、あることに気づきました。この会社、なんかボロいなあと思ってたけど外壁がパレットだ…!!
(↑を一面に並べて針金で固定していた)
1年前もおそらくパレット外壁だったのだと思うのですが、当時の自分はパレットというものを知りませんでした。 1年間商社で働き、輸入業務に携わる中でパレットが身近になり、実際のパレットを意外な場所で見ても、「あ、あれだ!」と思えるようになったのだと思います。
変なエピソードでスタートしてすみません。自分は英語を勉強するのが趣味なのですが、英語を勉強していると、こういう驚きに日常の中で頻繁に出会えるから楽しくて仕方ないという話をしようと思います。
ドラァグレースの話
私は日本だとNetflixで見られるリアリティショー、ル・ポールのドラァグレースが大好きです。 全米から集まったドラァグクイーンがAmerica's Next Drag Superstarの称号と賞金をかけて戦うコンペティション番組で、昨年頭には日本でも公演を行う世界的人気の番組です(私も行った)。
クリエイティビティとアナキズムに満ちたメイクやファッション、ダンスや歌などのパフォーマンス、「これが私」「私最高」という自信満々のアティテュードなど大好きな要素はたくさんあるのですが、個人的に1番好きなのはドラァグカルチャー独特の言葉遣いです。
私は結構真面目に英語を勉強してきたので、日常的な内容の映像作品だったら字幕なしでも7割くらい理解できます。 ですが、ドラァグレースのS1を初めて見たときは、日本語字幕なしでは文字通りひとことも理解できませんでいた。
文法も使う単語もアクセントも、英語なのに全然わからん…でも楽しいから見る!とS1からS6までを見続けていたら、Netflixの字幕がバグって日本語字幕が途切れるようになってしまいました。
仕方ないので字幕なしで見るはめになったのですが、いつの間にか全部分かるようになってる自分に気づきました…!!
バグったとき見ていたのはちょうどランウェイの品評のシーンで、ランウェイシーンはドラァグレースの中でも1番下品な言葉遊び・スラング・派生文化への言及が多く、英語の難易度はめちゃくちゃ高いと思います。でも言葉が分かるようになると1番面白いと思うようになりました。これがチャクラが開くってやつ??
ドラァグレースは日本ではまだマイナーな存在ですが、アメリカではエミー賞常連のメインストリームな番組なので、ドラァグカルチャーの英語が分かるようになると、実は結構他の場面でも日常的に使われていることに気づきます。
具体的に言うと自分はカーディ・Bの英語とかが聞き取れるようになり、インスタライブで景気よくやっている姿を楽しめるようになりました(アメリカ人の若者の英語、クィアカルチャーとヒップホップカルチャーに対する理解は不可欠な気がする)。 Sashay shante panther on the runway!
やっとプログラミングの話
このエントリを書くことになったきっかけは、最近私が参加しているThe Art of Readable Codeの輪読会がめちゃくちゃ楽しいのに、私からパワハラオーラが出ているせいか英語という点にハードルが高く感じられる人が多いのか、誘ってもなかなか人が集まらない・せっかく来ても居着いてくれないためです😭
あなた英語が得意だから楽しいんでしょうと思っている方がいたら、私は「日本語で読めるのと同じくらいのレベルの英語だったら読める」だけなので、普通にプログラミングに関する文章は、英語が得意ではない方と同じくらい難しいです。
なので、輪読会中も分からない単語たくさんありますし、読んでみて文意が取れずDeepLにかけることもしばしばあります。
ただ、実は自分でも『リーダブルコード』日本語版の輪読会を主催していて、並行して日本語版も読んでいるんですが、英語版を読んでいるときの方があきらかに楽しいです。
なんでかなと考えてみると、プログラミング学習をしてると、知らない言葉や知らない概念に毎日のように遭遇します。多くの場合は英語で、その概念について詳しく調べようとすると、更に新しく耳慣れない英語の概念が出てきて、敗北感と大量のタブに日々打ちのめされています。
プログラミングの文脈でなんとな〜〜く理解した気分になっている言葉も、きちんと腹落ちしているわけではなく、「こういう用途で使う」と覚えているに過ぎないので、モヤモヤしつつ使っているものばかりです。
そんな中、輪読会でわからない言葉を丁寧に拾いながら英文を読んでいると、ぼんやりとした理解に言葉という明確な形が与えられる感覚があります。
例えば、The Art Of Readable Codeの中に、下記のような一節があります。
Attach important details to variable names — for example, append
_ms
to a variable whose value is in milliseconds or prependraw_
to an unprocessed variable that needs escaping.
Boswell, Dustin; Foucher, Trevor. The Art of Readable Code (p.42). O'Reilly Media.
私はappendとprependという言葉の意味が分からなかったので辞書で調べ、appendは「後ろに付ける」、prependは「前に付ける」という意味だと知りました。 日常的に使う言葉じゃないし覚えられるかは微妙だなと思っていたところ、RubyのArrayクラスに同名のメソッドがあると教えてもらい、メソッド名通りの動きをするのですげ〜!と感動し、その場で覚えてしまいました。
こういうふうに知識が増えると世界の解像度が上がり、今までとは全く別のものに興味を持てたり、同じものを見ていても別の面を見出すことができるから楽しいんだと思います。
なんか全くとりとめのない文章になってしまったので、もうちょっとは役に立つかも知れない過去に書いた自分の英語学習についての記事を最後に置いておきます。