2K Views
February 11, 25
スライド概要
「比較は物事の本質を知る手段の1つである」、これは私が大学時代に英語学を専攻して学んだ大切な金科玉条である。
この手段は自然言語だけではなく、プログラミング言語にも応用出来る。
今回は私のメイン言語の Ruby と第二言語の Python の共通点・相違点を比較によって明らかにし、Ruby という言語をより深く知るためのきっかけ作りを目的としている。
「外国語を1つも知らない者は、自らの母語について何も知らないに等しい」
某教育系サービスの内製開発にソフトウェアエンジニアとして携わっています。 使用技術スタックは、サーバーサイドは Ruby on Rails、フロントエンドは React.js + TypeScript です。 プライベートでは Python も少し書きます。 学部生時代は英語学を専攻していたので、言語に強い興味を持っています。 私の所属する部署ではテーマフリーの LT 会や技術トーク会があり、そこで利用した資料をこちらにアップしています。 ご興味があれば是非ご覧下さい。
比較言語学のススメ -Ruby vs. Python に学ぶ言語のアイデンティティ作成者: 石田 隼人 英語版はこちら 最終更新日: 2025年02月13日 1
自己紹介 • 各種アカウント • • • • • Linkedin: @hayat01sh1da GitHub: @hayat01sh1da Speaker Deck: @hayat01sh1da Docswell: @hayat01sh1da HackMD: @hayat01sh1da • 職業: ソフトウェアエンジニア • 趣味 • • • • • 語学学習 カラオケ 音楽鑑賞 映画鑑賞 卓球 2
免許 / 資格 • 英語 • TOEIC® Listening & Reading 915点: 2019年12月 取得 • エンジニアリング • • • • 情報セキュリティマネジメント: 2017年11月 取得 応用情報技術者: 2017年06月 取得 基本情報技術者: 2016年11月 取得 IT パスポート: 2016年04月 取得 • その他 • 珠算2級: 2002年06月 取得 • 暗算3級: 2001年02月 取得 3
スキルセット • 言語 • 日本語: 母語 • 英語: ビジネスレベル • 開発 • Ruby: 中上級(FW: Ruby on Rails) • Python: 中級 • TypeScript:中級(Library: React.js) • HTML:中級(Library: Bootstrap) • CSS:中級(Library: Bootstrap) • SQL:中級 • その他 • ドキュメンテーション: 上級 4
職歴 1. システムエンジニア @SES • レガシー Windows Server 運用・保守 • 社内アカウント管理 • 社内セキュリティ啓蒙 • 英語通訳(海外拠点とのオンライン会議・ベンダー対応・海外スタッフのアテンド) 2. ソフトウェアエンジニア @受託開発会社 • サーバーサイド開発(Ruby on Rails, RSpec) • フロントエンド開発(HTML / CSS, JavaScript) • QA(Native iOS / Android Apps) • 企業技術ブログ記事執筆 3. ソフトウェアエンジニア @チャットボットプラットフォーム開発会社 • 既存チャットボットプラットフォーム開発・運用・保守(Ruby on Rails, RSpec) • 新規チャットボットエンジン性能検証(Ruby, Ruby on Rails, RSpec, Python) 4. ソフトウェアエンジニア @メガベンチャーの教育系サービス内製開発部門 • 学事・進路支援機能開発(Ruby on Rails, RSpec, Minitest, TypeScript + React.js, TypeScript + Vue.js) • 年次高校マスタデータ更新(Ruby on Rails, RSpec) • ドキュメンテーション執筆・啓蒙活動 5
国際交流活動 • 大学時代 • • • • 英語学ゼミ(マスメディア英語) 国際交流サークル兼部(2年次) 内閣府主催国際交流プログラム(2013年 - 2016年) 日本語学の授業の S 単位取得(最終年次) • 海外生活 • オーストラリアでのワーキングホリデー(2014年04月 - 2015年03月) • • • 2ヶ月間のシドニーの語学学校通学 6ヶ月間の Hamilton Island Resort での就労 1ヶ月間の NSW 州の St Ives High School での日本語教師アシスタントボランティア活動 • その他活動 • • • • • 英語での日々の日記(2014年04月 - 現在) Sunrise Toastmasters Club 参加(2017年02月 - 2018年03月) Vital Japan 参加(2018年01月 - 2019年07月、2022年10月 - 2023年02月) 英語自己学習 オーストラリアの友人とのビデオ通話 6
1. 言語比較の意義 8
1. 言語比較の意義 私は大学生時代は英語学を専攻していた。 そこでの一番の大きな学びは「物事の本質は比較によって理解出来る」と いうことであった。 そのことを表す格言を以下に引用する。 "He who knows no foreign language knows nothing of his mother tongue." by Johann Wolfgang von Goethe (外国語を1つも知らないものは自身の母語について何も知らないのと等しい。 by ヨハン・ ヴォルフガング・フォン・ゲーテ、ドイツ人文豪) 9
1. 言語比較の意義 自然言語においては、英語をはじめとした外国語を勉学・生活・仕事で使 うことによって日本語との違いを嫌でも意識することになるので、自身と 母語のアイデンティティについて深く考察することになる。 ※ 詳細は拙作「現代英語を知ろう Vol.5 -ことばの側面-」を参照。 10
1. 言語比較の意義 プログラミング言語においては、『プログラマが知るべき97のこと > 26. 言 語だけでなく文化も学ぶ』においても Anders Norås 氏が同様のことに言及 している。 Andy Hunt と Dave Thomas は、多くの人に影特を与えた著書「逮人プログラ マ」の中で、「毎年、新たなプログラミング言語を1つは学ぶこと」と勧め ています。私はそのアドバイスに従い、過去何年かの間に実際に数多くの 言語を学んできました。そして、その中で「言語を学ぶというのは、ただ 文法、構文を学ぶことではなく、その背景にある文化も学ぶこと」という 重要な教訓を得ました。 11
1. 言語比較の意義 昨今はソフトウェアエンジニアの責務の広さ・深さともに大きくなってい るため、我々が複数言語を扱えることは事実上の必須要件のようになって いると感じている。 折角複数言語を扱うのであれば、言語比較を通じて第一言語への理解を深 めることには、スキルセット以上に大きな意義があるはずだ。 LT という特性上時間の制約を大きく受けるため、今回は我々(私とオーディ エンスの皆様)の第一言語である Ruby が何者であるかを意識するきっかけを 作るのがゴールである。 12
2. Ruby と Python の三大共通点 13
2. Ruby と Python の三大共通点 Ruby と Python には以下3つの大きな共通点がある。 1. オブジェクト指向である 2. 動的型付け言語である 3. 開発者体験重視である 14
2. Ruby と Python の三大共通点 ① オブジェクト指向である オブジェクト指向の三原則は以下の通りである。 1. 継承: 親クラス(基底クラス)の抽象度の高いメソッドや属性を子クラスが継承。子クラスは 親クラス(基底クラス)の性質を受け継ぐため、差分のみ実装をすれば良いので再利用性によ るコーディング効率化が可能 2. ポリモーフィズム(多様性): メソッド呼び出しというメッセージを受け取るレシーバーに よ っ て 挙 動 が 異 な る こ と (e.g., Doctor#practice は 「 ~ を 開 業 す る 」 と い う 行 為 を 、 Athlete#practice は「~を練習する」という具合) 3. カプセル化: 内部の詳細な処理やデータを隠蔽し、I/F を通じたレシーバー間のメッセージ (メソッドコールや属性へのアクセス)に起因する外側から見た振舞いのみに関心を持つ仕様 のこと。内部処理への強結合を仕様レベルで防ぐことで保守性を担保出来る側面を持つ 15
2. Ruby と Python の三大共通点 ② 動的型付け言語である コンパイル時にデータ型が決定するのが「静的型付け」、実行時にデータ 型が変数のデータによって決定するのが「動的型付け」である。 前者は C ・Java・TypeScript、後者は Ruby・Python・JavaScript・PHP などが 当てはまる。 Ruby や Python などの動的型付け言語は実装者である人間が干渉できないた め、実行時まで変数にどんな型のデータが入っているかが分からない。 そのため、それが一見して分かるような変数の命名は特に重要である。 『プログラマが知るべき97のこと > 107. 名前重要』において Ruby の生みの 父であるまつもとゆきひろ氏(以降、Matz)が言及しているが、適切な命名は 適切な設計の鑑である。 16
2. Ruby と Python の三大共通点 ③ 開発者体験重視である Ruby や Python は実行が容易である、動的プログラミング(e.g., `eval` 関数・ `Module#class_eval`)が可能であるなど、その強力な特長を活かした良質な コーディング体験を開発者に提供してくれる。 雑に書いたプログラムですら動いてしまうので、「大いなる力には大いな る責任が伴う」の格言通り、一定以上の力量を持って駆使しなければ低い 可読性の低下と煩雑なデバッグ体験などのトレードオフに痛いしっぺ返し を食らうことになる。 要件に基づいて仕様を明らかにし、そこから逆算して必要な実装をクラ ス・メソッドあたりの責務のスコープを最小限に絞って行う必要がある。 ここまで話せばテストコードの重要性は言わずもがな、自明であろう。 17
3. Ruby と Python の三大相違点 18
3. Ruby と Python の三大相違点 ① Private フィールドの概念の有無 Ruby には `private` キーワード以下を Private フィールドして扱う機構が存 在する。 一方、Python には Private フィールドの概念そのものがない。 20
3. Ruby と Python の三大相違点 ① Private フィールドの概念の有無 21
3. Ruby と Python の三大相違点 ① Private フィールドの概念の有無 「2. Ruby と Python の三大共通点 > ① オブジェクト指向である > 3. カプセル 化」で言及した内部の詳細な処理やデータを隠蔽する機構がオブジェクト 言語の大きな特徴だが、Python にはこれが存在しない。 これはクラス外でもデータの書き換えやメソッドコール・オーバーライド が可能なので、バグが混入する可能性が高く危険である。 また、`def _method` や `def __method__` のように定義して暗黙的にプライ ベートメソッドとして扱うことは出来るが、機構に保障されていないので 安全ではない。 また、ライブラリのメソッドは `_` で始まる命名が多いため、思わぬオー バーライドを誘発することも Python ユーザーには嘆かれていることは X と Quora で観測している。 22
3. Ruby と Python の三大相違点 ② 遅延評価での返り値キャッシュ手法 言語によって利用可能な記号が異なる。 その1つが `||` である。 Ruby において当該記号は返り値のメモ化(キャッシュ)でよく使われる。 一方、Python では当該記号は使えないため、Ruby のようにメソッド定義で遅延評 価でのキャッシュを行うことは出来ない。 私はコンストラクタ内でインスタンス変数で初期値をキャッシュしておき、メ ソッドをコールすることでインスタンス変数の状態を変化させていた。 最近 Copilot がコンストラクタ内でメソッドの返り値を直接キャッシュする記法を Suggest してきて、実際に機能することが確認出来た。 しかし、コンストラクタ内でパラメーターや初期値のキャッシュ以外の処理を行 うのは、責務以上の処理を行っているので悪手だと考えているため、次スライド のようには書くべきではないと考える。 23
3. Ruby と Python の三大相違点 ② 遅延評価での返り値キャッシュ手法 24
3. Ruby と Python の三大相違点 ③ レシーバーと引数 Ruby と Python を交互に書いていて、同じ用途・同じ名前の組込みメソッド をコールする際にレシーバーと引数を逆に書いてしまうことがよくある。 その一例が Ruby の `Array#join`、Python の `String#join` だ。 • `Array#join` in Ruby: 結合対象の配列をレシーバーに、区切り文字を引数に 取る • `String#join` in Python: 区切り文字をレシーバーに、結合対象の配列を引数 に取る 25
3. Ruby と Python の三大相違点 ③ レシーバーと引数 26
3. Ruby と Python の三大相違点 ③ レシーバーと引数 英語として解釈すると以下のようになる。 • `Array#join` in Ruby: The target elements are split by the delimiter you provide. • `String#join` in Python: The delimiter you provide splits the target element. こう見ると Ruby は受動態、Python は能動態なので、後者の方が自然に読み 下せるはずなのだ。 しかし、実際の体験としては「区切られる対象は何か」が文法上の主語、 「何で区切るのか」を意味上の主語にした Ruby の方が解釈しやすいと感じ る。 27
3. Ruby と Python の三大相違点 ③ レシーバーと引数 ここからは完全な私見である。 これは、プログラミング言語も自然言語の英語と同様に、最も重要な情報 を末尾に置く文末焦点の法則(End-Focus)が働くからではないだろうか。 その意味で、「何で文字列を区切るのか」を引数に取ることで文末焦点の 法則に適合している Ruby の方が英語を読むように自然に解釈出来る。 自然言語同様、第二言語や外国語の習得難易度は母語(第一言語)に依存する ため、個人的な感覚かも知れない。 しかし、Ruby の方が英語を専門にしていた人間の感覚からしても自然言語 により近い「書き味」と「可読性」を提供しているのだ。 28
5. おわりに 29
5. おわりに 5分間という限られた時間の中ではあったが、Python という比較対象を明 らかにすることで、普段開発で使っている Ruby がどのような特徴や性質 を持つプログラミング言語かを各自で考えるきっかけになっただろうか。 『プログラマが知るべき97のこと > 43. プログラミング言語は複数習得す べき』の中ではパラダイム(仕組み・枠組み)が異なる言語を習得すること が推奨されている。 自然言語でいえば、アルタイ語派の日本語を話す我々がゲルマン語派の 英語を習得するようなものである(「?」な方は拙作「 現代英語を知ろう Vol.1 -英語という言語- > 2. 言語と語族と習得難易度の関係 」を参照)。 両者の文法・語彙・コロケーションが全く異なるので習得難易度は高い。 同じことがプログラミング言語でも言えるということだ。 30
5. おわりに (言語であるかは怪しいが) GitHub Actions でワークフローを組む際に Shell Script を書くことがある。 いつも書いている Ruby の感覚でオブジェクト指向の要領で書こうとすると大抵 無理が来る。 配列などは多用せず、単純な処理を共通化する程度の実装が推奨されている。 これもパラダイムの違いによるものだ。 Go や Rust など、データ指向言語は扱ったことがないが、こういった言語を扱う 機会があれば同じテーマでまた発表したいと考えている。 すでに習得済みの方がいれば、比較言語学の成果を共有して頂けるととても参 考になるので嬉しく思う。 31
6. 参考文献 32
6. 参考文献 • プログラマが知るべき97のこと • 最終アクセス日: 2025年02月10日 • He who knows no foreign language knows nothing of his mother tongue - La Academia Language School • 最終アクセス日: 2025年02月10日 • オブジェクト指向とは? 基礎から用語の意味まで分かりやすく解説 - エン ジニア type • 最終アクセス日: 2025年02月10日 • コンパイラ言語とインタプリタ言語の違いとは?各言語のメリットも解説 - RENTEQ BLOG • 最終アクセス日: 2025年02月10日 33
EOD 34