Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby: "uselessシンタックスシュガー"シリーズ記事のあらましと予告(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

Ruby: "uselessシンタックスシュガー"シリーズ記事のあらましと予告(翻訳)

近況更新

前回書いた最後のRubyの型アノテーション記事の後、訓練を終えて戦線の近くで4か月を過ごし(最後の数か月はロボティネ近郊だった)、そこで自分ができるベストを尽くした。現在もウクライナ軍(AFU)に所属している点は変わらないが、先ごろコンピュータにもっと関連の深い職位に移ったので、以前よりもRubyを書いたりRubyに関する文章を書いたりする時間を取れるようになった。だからそうしている。

20年ほど前にRubyと出会って以来、ずっとRubyが好きです。

「エンジニアリングツール」に感傷的な気持ちを抱くべきではないと主張する人もいるかもしれませんが、表現手段そのものを愛でることを禁止する法律を私は知りません。ここで言っている手段とは、私が新しい方法でものを考え、楽しみながら問題を解決し、これまでになかった新しい概念を発明できる手段のことです。

私はRubyと付き合い続けながら、この言語の変遷を(おおむね)楽しく観察してきました。そして言語の変遷にささやかながら助力できたことを誇りに思っています。

私は信じています(し、これまでも何度となく表明してきました)。言語が変遷するプロセスは自然なものであり、どんな表現手段においても避けては通れないと。世界が移り変われば問題も移り変わり、表現したいものや表現方法についての私たちの理解も移り変わります。かつては難解でアカデミックな領分だった作業も、日常の作業に変わりました。以前なら長々と説明しなければならなかった複雑なアイデアも、手短に参照を示すだけで事足りるほど普及しました。

「Ruby Evolution」という用語を考案したのは私だと思っています(でなければ、少なくともこの用語を自然でポジティブなものとして広めたと思っています)。これについては以下のような多くのブログ記事にも書き、RubyConfに登壇したときにもこの話題を中心にし、Rubyの進化をドキュメント化するWebサイトも運営しています。

近年のRubyでは、言語構文や標準ライブラリにかなり多くの追加が行われました。

コミュニティでは、主観に正直な意見("好きじゃない"、"自分には美しく見えない")から客観を装った意見("可読性を損なう")まで、さまざまな反発が頻繁に巻き起こりました。中には、一見測定可能な話に聞こえても実際には誰も測定方法を知らない主張("メリットが少なく、欠点が多い")や、新機能を完全に禁止するlinterルールを定義するという極端な反発もいくつかありました。

ほとんどの場合(すべてとは言いませんが)、この種のフィードバックについて議論しても実りはありません。最終的に私たちの個人的な好みや感情に左右されることが多すぎるのです。そういえば、我が家には「クロコダイルはニシンを食べない。だってクロコダイルはニシンなんか食べたくないから。」ということわざが伝わっていました。

しかし、私が頭の体操として関心を寄せている対象は、新しい構文や言語機能を目にしたときに、それがどんな原因や理由があってできたのか、そこから何を推論できるか、その結果がどうなるかを理解する助けとなる「思考のフレームワーク」を提供することです。

言葉を変えて言えば、最新バージョンのRubyを通じて、最も有名な(つまり最も物議を醸している)構文や機能に関する私なりの分析を読者にお目にかけたいということです。

しかしその前に、一般的な考慮事項について軽く説明しておきます。

🔗 私は(プログラミング)言語をどのように考えているか

つまり、私がコーディング(近年は「明瞭なコード」と呼ぶようになってきましたが)に関して「どんなことが可能であるべきか」を述べるときは、次のようなアプローチを取ります。

  • 可能な限り明確にコードの意図や意味が伝わること。
    ざっと読むだけで、そこで行っていることの概要を良い形で理解できる。
  • 大まかな全体像を把握して追いかけるのが楽であること。
    読み進めるだけで「予測が効く」という体験を得られる。
  • わかりきったことをわざわざ書かずに済むこと。
    コードを読む人の視線を不必要に引き寄せないようにする(「これは意味があるから書かれているのか?」「それともツールで必要だから書かれているのか?」などをいちいち考えさせないようにする)。
  • 探せば必ずすぐに見つかる辞典があること。ある要素が「どこから来たのか」「他の要素とどう関連するのか」を手軽に調べられる。
  • 可能であれば、深みがあること
    今読んでいるコードに関連するシステムの作りはきっとこうに違いないという「気づき」を呼び覚まし、「こう書けるということは、こう書くことも可能なのでは?」とたやすく想像できる。

上で述べた価値観は、きわめて非形式的なものであり、高レイヤかつ人間目線であることにご注意ください。

私が話題にしたいのは「"わかりきったこと"を書かない」ことであり、「コードを徹底的にDRYにして定型文をすべて排除する」ことではありません(伝統的に"定型文"とみなされているものは、実際には読者に暗黙のコンテキストを追加しています: コードが明確になる効果のある、"価値のある繰り返し"もあるのです)。

私は「コードは短ければ短いほどよい(あるいはその逆)」みたいな話をしているのでもありません。冗長な記述や、インデントを整えるスペースが、明快なコードの品質に貢献することもあるのです。私たち人間は、そうやって読んだり書いたりしているのです。

つまり、すべては「いかにコードを快適に読めるようにするか」にかかっているのです(ただし、ここで言う「快適」は、コードを把握すること、つまり、部分を把握すればシステムの大部分をただちに把握できるという快適さに関連します)。

だからこそ、私は「可読性(readability)」という用語を避けてきたのです。可読性という用語は相反する意味で使われることがとても多いのですが、「1行のコードだけを取り出したときに、どれだけ楽に読めるか」という点に着目されがちで、場合によっては「初心者が楽に読めなければならない」点が強調されることすらあります。

念のため申し上げておきますが、「初心者が楽に読めるべき」という主張は、少しも不愉快なものではありません。とは言うものの、「他の言語にも過去のRubyにもないような目新しいものは取り入れるべきではない」と狭く捉えれば、そうなる可能性もありますし、そもそも初心者に失礼です。私は初心者のメンターを長年務めてきましたが、やる気に満ちた若手プログラマーたちが新しい構造に触れれば、それを理解して「これで作業が楽になる!」と喜びを感じてくれると断言してよいと思います。

言語の直感に逆らわずに素直に沿うことで、コードを読む人やコードを書く人にとって計り知れない助けになります("言語の直感"も私にとって大事なフレーズです: 戦争が終わったら、その名もRuby Intuitionsという本を書くつもりです)。

念入りに設計された、一貫性のある言語は、「基本的に何がどう行われるのか」「これとこれを組み合わせるとどういう意味が生まれるのか」「この名前は何と関連しているのか」といった直感的な知識を豊富にもたらしてくれると私は信じています。言語がそうした直感を獲得すれば、コードの続きを読んだり書いたりするときの「滑らかさ」がそこに生まれるのです。

注意深いプログラマーなら、こうした言語的直感が現実を追い越してはるか先を見通せるようになるかもしれません。「ふむふむ、この言語の他の場所ではこんな書き方もできるな」「なるほど、普段はこれを何度も書かなくてもいいのね」「(初めて見たコードでも)これは意味のある正しいコードに見える」といった具合です。こういうところから新機能が続々と生まれてくるのです!

つまり新しい言語機能では、既存の言語で養われた「可能な書き方」「楽な書き方」という直感に逆らわずに素直に従って、その直感をさらに推し進め、その途中で新たな直感が次々に生み出されるのが理想です。

🔗 詳しい話に戻ります

今後数週間にわたって、ささやかな記事(たぶん!私が書くといつも長くなってしまうのですが)をいくつか公開する予定です。記事では、最近物議を醸した機能や、激しい論争を巻き起こした機能をいくつか取り上げます。記事の構成は以下のように揃えるつもりです。

  • 機能の説明
  • その機能が求められた理由
  • 機能の設計とその理由
  • (可能なら)他の言語ではどう解決しているか
  • 新しい構文が「Rubyの直感」に何をもたらしたか、コード内でどうみなされているか、機能で発生した癖や問題点

扱う機能は以下を予定しています。

Rubyが進化の過程で獲得したその他の機能について記事で取り上げて欲しいものがありましたら、お気軽にメンションしてください。


お読みいただきありがとうございます。ウクライナへの軍事および人道支援のための寄付およびロビー活動による支援をお願いいたします。このリンクから、総合的な情報源および寄付を受け付けている国や民間基金への多数のリンクを参照いただけます。

すべてに参加するお時間が取れない場合は、Come Back Aliveへの寄付が常に良い選択となります。

本記事(あるいは過去の私の仕事)が有用だと思えたら、Buy Me A Coffeeサイトにある私のアカウントまでお心づけをお願いします。戦争が終わるまでの間、ここへのお支払いは(可能な場合)私や私の戦友たちが必要とする装備または上述のいずれかの基金に100%充てられます。

関連記事

Ruby: "uselessシンタックスシュガー"シリーズ: numbered block parameters(翻訳)

Ruby: "uselessシンタックスシュガー"シリーズ「パターンマッチング(1/3)」(翻訳)

Ruby: "uselessシンタックスシュガー"シリーズ「パターンマッチング(2/3)」(翻訳)

Ruby: "uselessシンタックスシュガー"シリーズ「パターンマッチング(3/3)」(翻訳)

Ruby: "uselessシンタックスシュガー"シリーズ「キーワード引数やハッシュの値省略」(翻訳)

Ruby: "uselessシンタックスシュガー"シリーズ「引数のforwarding」(翻訳)

Ruby: "uselessシンタックスシュガー"シリーズ「endレス(1行)メソッド」(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。