Upgrade to Pro — share decks privately, control downloads, hide ads and more …

今年やったこと_20年以上続くWebサービスのリプレイス_書いたコード_私がモダンかもと思うPerl

Masashi-Sutou
November 22, 2022

 今年やったこと_20年以上続くWebサービスのリプレイス_書いたコード_私がモダンかもと思うPerl

今回のテーマは「来年に向けて、今年やったこと、書いたコード」でお願いします at 吉祥寺.pm31 on 2022/11/22

Masashi-Sutou

November 22, 2022
Tweet

More Decks by Masashi-Sutou

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

  3. Diverseの をリプレイス

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. 実装例:その1

    View full-size slide

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

    View full-size slide

  12. 実装例:その2 - 1

    View full-size slide

  13. 実装例:その2 - 2

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 苦戦した例

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. cpan-outdatedをGitHub Actionsで実行

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide