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 Slide

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

    View Slide

  3. Diverseの をリプレイス

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. 実装例:その1

    View Slide

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

    View Slide

  12. 実装例:その2 - 1

    View Slide

  13. 実装例:その2 - 2

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. 苦戦した例

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. cpan-outdatedをGitHub Actionsで実行

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide