Slide 1

Slide 1 text

今年やったこと 20年以上続くWebサービスのリプレイス 書いたコード 私がモダンかもと思うPerl 吉祥寺.pm31 on 2022/11/22

Slide 2

Slide 2 text

自己紹介 masashi-sutou @kurotyann9696 CTO at diverse-inc.co.jp Perl歴は半年 / 以前はSwift,Dart,TypeScriptが多め

Slide 3

Slide 3 text

Diverseの をリプレイス

Slide 4

Slide 4 text

来年(これから)に向けて目指したのは? 画面とAPIを疎結合にして開発できること モダンなPerlとモジュールでAPIを開発できること 段階的にv2にリプレイスできる仕組みをつくること つまり、売上と開発環境を同時に改善できるようにしたい

Slide 5

Slide 5 text

といった目標を 今年の4月ごろに決めて モダンなPerlを書き始めることに

Slide 6

Slide 6 text

しかし、私はPerlを書いたことがない

Slide 7

Slide 7 text

モダンなPerlてどこにあるのか?

Slide 8

Slide 8 text

とにかく調べる、試してみる 1. 現状のv1のPerlはどういう背景と負債をもつのか 2. 他社のPerlの移行事例や活用事例 1と2は時間の関係でスキップ 3. v2に改善するなら、何が足りない、何が必要? 先人(Perl Monger)の記事やコードを読み漁る日々

Slide 9

Slide 9 text

結果、こんな感じのPerlになった

Slide 10

Slide 10 text

実装例:その1

Slide 11

Slide 11 text

モダンPerl = 型定義を付与して堅牢に use strictures 2; で必要なものだけ警告に Types::Common -types で型を使う Function::Parameters で fun と引数の型を定義 明示的に $self か $class を書く( method は禁止) Function::Return は見送りに 返値型のメリットが少なく、引数の型とテストでOK 高速な書き方、より良い書き方に置き換える

Slide 12

Slide 12 text

実装例:その2 - 1

Slide 13

Slide 13 text

実装例:その2 - 2

Slide 14

Slide 14 text

モダンPerl = OOPとPerlの新機能を使う Moo で実装の意図を集約したりコメントできる aliased で冗長なアーキテクチャ名を最小限に クラス名ぽく大文字で定義 Variable interfaceだとIntellijで定義ジャンプ可 能に IntellijのPerlプラグインがそこそこ優秀 5.34.0から可能な try-catch で例外処理

Slide 15

Slide 15 text

Test2でDomainとControllerをテストする is ok like dies ok lives でだいたい書けて楽 Test::Mojo も Test2::V0 と併用して大丈夫だった

Slide 16

Slide 16 text

ORM(DBIx::Mint, Moo, Sub::HandlesVia)の実装で苦戦 苦戦した。一応期待する振る舞いは実装した でも、関数の呼び方が複数あり、良くない実装が残る 15分では時間が足りない どこかで全部アウトプットしてアドバイスがほしい

Slide 17

Slide 17 text

苦戦した例

Slide 18

Slide 18 text

例えば、話せる言語を記録するとして...

Slide 19

Slide 19 text

MySQLのSET型を扱いやすくしたい MySQLのSET型をPerlでは配列で参照する型変換 保存時は別処理で配列からcsv文字列に変換

Slide 20

Slide 20 text

型制約(coerce)が効かないときがある

Slide 21

Slide 21 text

.perlcriticrcと.perltidyrcに合わせる git commit時にlintとformatを実行する privateな関数の先頭に _ をつけてルールに合わせる Subroutines::ProtectPrivateSubs Subroutines::ProhibitUnusedPrivateSubroutines

Slide 22

Slide 22 text

cpanfileをメンテできる状態にする

Slide 23

Slide 23 text

cpan-outdatedをGitHub Actionsで実行

Slide 24

Slide 24 text

Perlを半年書いてみて -> 学びがある 世の中がWeb3.0!て言ってるなか、Web2.0にいた Perlを通して、Web2.0の技術を復習できて良い 良い記事を書いてるPerl Mongerたち今も活躍してる 普段書かない言語を書くと学びが多くて楽しいが他にも 仕事が...

Slide 25

Slide 25 text

最後に もっといい方法があるなら、教えてください そもそも、なぜバックエンドをPerlのままに? 続きは来年3月のYAPC Kyoto オンラインで! と言いたいけど、来年2月は第一子が産まれる可能性 オフライン発表とかできるんかな?

Slide 26

Slide 26 text

続きに興味ある方はカジュアル面談で!