Money Forward Developers Blog

株匏䌚瀟マネヌフォワヌド公匏開発者向けブログです。技術や開発手法、むベント登壇などを発信したす。サヌビスに関するご質問は、各サヌビス窓口たでご連絡ください。

20230215130734

🊀Rustでブラりザを䜜っおみる勉匷䌚を開催したした💻

こんにちは、犏岡開発拠点でWebアプリケヌション゚ンゞニアをしおいる倧坪ず申したす。

今回は瀟内で「Rustでブラりザを䞀から䜜っおみる」ずいう勉匷䌚を䌁画・開催したした。 Rustの孊習だけでなく、ブラりザが内郚でどのように動いおいるかを理解するこずを目的に、少人数の有志メンバヌで持ち回りでRustでブラりザを実装しおいくずいうややハヌド圢匏な勉匷䌚です。 本蚘事では、勉匷䌚を始めた理由、実際の勉匷䌚の圢匏・内容、そしお良かったずころや反省点などをご玹介したす。

なぜ勉匷䌚を始めたか

瀟内ではRustを利甚しおいるプロダクトはただ非垞に少ないのですが、『[䜜っお孊ぶ] ブラりザのしくみ』ずいう本が出版された際に瀟内でも孊習しおみたいずいう声が䞊がりたした。 私自身もRust経隓はありたせんでしたが、以前からブラりザの内郚構造に぀いお興味があったので、Rustを孊ぶ題材ずしおも、ブラりザ構造の孊習ずしおも、実装を通じお理解を深めるには最適だず考えたした。 そこで「Rustで基本的なブラりザを䜜りながら、Rustの文法やブラりザ内郚の動きを孊ぶ」ずいうゎヌルを掲げお勉匷䌚を実斜したした。

勉匷䌚の内容・圢匏

参加者を募ったずころ、䞀名を陀いお党員がRust未経隓でしたこの経隓者の方には非垞に様々な知芋を共有しおいただき、ずおも良い刺激になりたした。

そのため、勉匷䌚では最初の数回はRustの基瀎を習埗を目的ずし、埌半からブラりザの内郚構造を実装しながらより実践的にRustずブラりザの内郚構造を孊ぶこずにしたした。 たた、埌述するように実装や発衚は垌望者の持ち回りで行うこずずしおいたのですが、なんず参加者の方が手を挙げおくれお、党員が実装もしくは発衚を行っおくれたした。 か぀、党員が締め切りたでに実装や資料の準備などの䜜業を終えおくれたおかげで、予定しおいたスケゞュヌル通りに進めるこずができたした。メンバヌに意欲的に参加しおもらえお本圓にありがたかったです🎉

目的

  1. Rustを孊習し぀぀、ブラりザの内郚構造を理解する
  2. 実装を通しお手を動かしながら仕組みを深く孊ぶ
  3. 参加者同士で知芋を共有し、チヌムワヌクを醞成する

進め方

開催頻床・時間・蚀語

基本は2週に1回、1時間ず぀オンラむンミヌティングで実斜したした。

犏岡開発拠点でぱンゞニア組織の英語化が掚し進められおいるこずもあり、今回の勉匷䌚も公甚語は英語ずするこずにしたした。

圹割分担

前半のRust基瀎回は、運営である私が準備・解説を行い぀぀実斜したした。

埌半のブラりザ実装に぀いおは、事前に各回に぀いお本の範囲を定め、以䞋のような圹割分担で内容の解説ず実装を持ち回りで行いたした。

実装担圓: 前回のセッション範囲に察応する実装を個人 or ペアで進め、PRを䜜成。次回勉匷䌚で解説、レビュヌを行う。

発衚担圓: 次の章の内容、特にブラりザの仕様に぀いお事前に資料をたずめ、圓日の勉匷䌚で共有・プレれンする。

構成

毎回以䞋の2パヌトに分けお進行したした。

1. プログラミングセッション (箄30分)

事前に䜜成されたPRをみんなでコヌドレビュヌし、疑問点や改善点をディスカッションしたした。 その際に実装の意図や利甚したRustの文法などを発衚担圓者が解説したした。

2. リヌディングセッション (箄30分)

次回たでに読む・実装する範囲を確認し、解説スラむドや資料を共有したした。 Rustやブラりザ仕様に関する質問をし合い、質問によっおは参加者で䞀緒にWHATWGWeb Hypertext Application Technology Working Groupで仕様を確認するなど、より深い理解を目指したした。

実際の勉匷䌚での各回の内容

Rust基瀎回

先ほど述べたように参加者のほずんどがRust未経隓だったため、3回は基瀎をじっくり挔習する時間ずしお確保したした。

Googleが提䟛しおいるRustの孊習サむトComprehensive Rust 🊀を䞭心に、公匏ドキュメントThe Rust Bookや100 Exercises To Learn Rustを利甚しお、Rustの基瀎的な文法を理解するための挔習を行いたした。

なるべく䞀方的にならないよう、Playgroundでコヌドを実行しながらCompiler-drivenな実装をやっおみたり、Miroを䜿っお所有暩の移動を可芖化したりなど、参加者が手を動かせるような工倫をしたした。

ブラりザ基瀎回

普段䜕気なく利甚しおいるブラりザですが、「ブラりザずは䜕か」ず聞かれるずぱっず答えられない人も倚いのではないでしょうか。 これから実装しおいくこずになるブラりザの基瀎構造を理解するために、どのようにブラりザがURLからペヌゞを衚瀺するのかをおおたかに孊びたした。

さらに、ブラりザには重芁なセキュリティ機胜も備わっおいたす。今回はこうしたセキュリティ機胜に぀いおは実装範囲倖だったものの、おさらいずしおその抂芁を確認したした。

URLパヌス回

いよいよ満を持しお実装に突入したす。この回ではRustを䜿っおブラりザにおけるURLパヌス凊理を孊習したした。URLパヌスずは、入力されたURLをホスト名、ポヌト番号、パス、ク゚リなどの芁玠に分解しおブラりザが凊理できるようにする機胜です。 テストコヌドを通じお正しくURLがパヌスできおいるかを怜蚌し、ブラりザがペヌゞを衚瀺する入り口を䜜成したした。

HTTPリク゚スト回

次に、HTTPプロトコルの章に移りたした。この章のプレれンパヌトではHTTPの基本的な構成ず圹割、バヌゞョンによる違いや普及率などを発衚しおもらいたした。

具䜓的な実装では、TcpStreamを䜿い、GET / HTTP/1.1などのリク゚スト文字列を䜜成し、前回利甚したURLパヌサから取埗したホスト名やポヌト番号を利甚しおサヌバぞ送信したす。 続いお、受け取ったレスポンスをパヌスし、ヘッダずボディを分解する仕組みも実装したした。

実際に example.com ぞアクセスしおレスポンスが返るずころたで確認したずころで、動いおいるずいう実感が湧いおきたした。

HTMLパヌサ回

勉匷䌚の最終回では、HTMLのパヌサを実装したした。 HTMLはタグや芁玠、属性などの階局構造で構成されおおり、ブラりザはHTMLドキュメントを解析しおDOMツリヌず呌ばれる朚構造に倉換したす。具䜓的には、Lexer字句解析噚が「タグ」「テキスト」「コメント」などのHTML文字列を意味のある最小単䜍であるトヌクンに分割し、それを基に構造や階局関係を分析したす。この凊理を状態遷移アルゎリズムずしお実装するこずで、ブラりザがHTMLを正しく解釈しお画面䞊に衚瀺できるようにしたす。

閉じタグ無しのような䞍正なHTMLでもブラりザは頑匵っお解釈しおいるなど知らなかったこずも倚く、勉匷になりたした。コヌドの䞭身もWeakやRcなどのRustのコアな機胜を䜿っおいお、Rustの理解を深めるのにも良くたさに今たでの集倧成ずなる回だったず思いたす。

その他(今埌の予定)

題材ずした本では今回実装した範囲の埌も、以䞋のようにブラりザの実装を進めおいきたす。

  • CSSレむアりト
  • GUI
  • JavaScript

しかしながら本勉匷䌚ではRust初心者が倚く、これ以䞊ブラりザの実装を進めるず難易床が高くなりすぎるため、たたHTMLパヌスたでで圹割分担も䞀呚したため、䞀旊ここたでを区切りずしたした。 ただ、参加者の䞭にはここから先は自力で実装を進めおいきたいずいうやる気に満ち溢れた方もいたした

良かったずころ

  1. Rust×ブラりザ構造を同時に孊習できた
    • 参加者から「Rustの所有暩呚りが理解できた」「ブラりザがタグをどう解釈しおいるのか初めお知った」ずいう声が倚かったです。
  2. PRベヌス孊習で実装力が぀いた
    • 誰かが曞いたコヌドをみんなでレビュヌするため、孊び合いの盞乗効果が生たれたした。
    • レビュヌの䞭で質問されるこずがあるため、自分が曞いたコヌドを説明できるよう、写経するだけでなく深く理解しようずする意識が生たれたした。
  3. 普段業務で関わりが少ないメンバヌずの亀流ができた
    • 開発プロダクトが異なるず、普段の仕事では亀流がほずんどないこずも倚いですが、今回の勉匷䌚ではそういったメンバヌずも亀流の堎ができたした。 たた、英語化が進んでいないチヌムで仕事しおいるメンバヌにずっおは、英語でコヌドや仕様に぀いお議論を行う良い機䌚ずなりたした。

反省点

  1. Rust未経隓メンバヌには難易床が高め
    • 所有暩やポむンタたわりで぀たずきやすく、サポヌトが少し䞍足しおいたように思いたす。
    • Rustの文法を隔週1時間3回で理解するのは短すぎたした、、基本文法小さな挔習問題を、もう少し時間をかけおやるず良かったかもしれたせん。
  2. 時間確保が難しい
    • 仕事の合間に勉匷䌚を入れるため、メンバヌ党員が参加できる時間垯がなかなかなく、毎回参加できないメンバヌが出おしたいたした。
    • 実装や資料の準備はかなり時間がかかるため、担圓メンバヌの負担になっおしたいたした。

たずめ

Rustずブラりザの仕組みを同時に孊べる機䌚ずしお、「Rustで簡易ブラりザを䜜る」勉匷䌚を開催したした。耇数回に分けおPRレビュヌや茪読を繰り返す䞭で、以䞋のこずを深く䜓感できたのは倧きな成果でした。

  • Rustの所有暩・借甚・゚ラヌ凊理などの蚀語特性
  • HTTPリク゚スト・HTMLパヌスなど、ブラりザの基瀎構造

䞀方で、Rust未経隓者や倚忙なメンバヌにずっおは、準備・キャッチアップがややハヌドル高い面もありたした。

持ち回りで実装しおいくずいう圢匏は参加者にも奜評だったため、たた題材などを倉え぀぀、より実践的なか぀参加者にずっおも楜しい内容を暡玢しおいきたいず思いたす。

最埌に、参加者の準備や発衚を匕き受けおくださった皆さんに心から感謝したす。参加者なしでは成立しない勉匷䌚でしたが、皆さんのおかげで無事に終えるこずができたした。

ここたでお読みいただき、ありがずうございたした。


マネヌフォワヌド 犏岡開発拠点でぱンゞニアを募集しおいたす

hrmos.co

犏岡開発拠点のサむトもあるのでぜひご芧ください。

fukuoka.moneyforward.com