こんにちは。エンジニアのid:kfly8です。
先日、技術研修のインタビュー記事を公開し、手を動かしつつ、コミュニケーションをよく取る技術研修といった主旨の内容でした。
こちらのインタビューでは具体的な研修内容は触れていませんでした。今回は、駅メモ!や駅奪取といった位置ゲームや着メロの月額コンテンツサイトなどで利用しているPerlの技術研修について紹介します。ブロックチェーン事業ではフロントエンド、バックエンドの両サイドで、TypeScriptを利用しているのですが、そちらの技術研修の話は追い追いできればと思います。
技術研修を受ける人は、どの言語でも良いのである程度プログラミング言語に慣れてることを想定しています。そのため、学ぶ意味、特徴は何か、良教材は何か、罠は何か、などポイントを掻いつまむように技術研修を進めています。
この記事でも、要所を掻いつまんで紹介をしたいと思います。
Perlの特徴は何か
モバファクの一部プロダクトではPerlが現役バリバリで動いているので、Perlを利用している部署に配属された人はPerlを学ぶ必要があります。もう少し味気ある説明にしたいので、Perlの特徴を書きたいと思います。
先に悪い話から書きます。 Perlのエコシステムは、例えばTypeScriptと比べると勢いが劣っています。開発者向けのツールで、Perlに対応していないことは日常です。ないものは作ろう!の精神で作っても、出来が悪かったり、利用ハードルは高いです。*1
動的に型が決まるので、ソフトウェアやチームの規模が大きくなると開発が難しくなります。動的型付け言語の共通の悩みでもあると思いますが、RubyのSorbet/Steepなどの型チェッカーなど素晴らしい進化しているなーと思ってみています。
他にはデプロイを容易に、そしてマシンのリソースを有効活用したいと思うと、Golangを羨ましく思います。
そんなこんなで、Perlを利用していることに疑問があっても不思議でないです。 モバファクの一部プロダクトで、当時Perlを採用した理由は、資産、知見が溜まっていることなどが理由ですが、現在も利用し続けることに強いこだわりはなく置き換えコストのバランスだと思っています。実際、新規事業だったブロックチェーン事業では、TypeScriptを選択していますし、状況次第なのかなと思っています。
Perlに良い点もあります。悪い点を上回るほど良いと言いたいわけではないですが、面白いところもあります。
- テキスト処理に強い
- 正規表現リテラル便利
- 後方互換性が高い
- バージョンアップして動かなくなる心配が少ない
- とはいえ、新しい言語機能を追加しにくいトレードオフが発生
- けれども最近のPerlをみていると、
v5.36
といった宣言によって、初学者が戸惑うような文法の曖昧さなど減らす向きがあるのは嬉しいです。例えば、間接オブジェクト機能の無効化など。
- 総じて、運用ツール作るのに便利
- GitなどがPerlに依存しているのもあり、たいていのUNIX系システムに入っています
- 出自がsed/awkをオーバーキルする形でLarry Wallが作ったという話も納得
- シュッと書くとき便利!
もう少し個人的な趣味で、2つあげると、スコープとコミュニティです。
まず、スコープに関して。スコープを使うと、例えば変数の生存期間を簡単にコントロールできます。変数だけでなく、警告の抑制なども切り替えできます。最近、deferが入りましたが、Scope::GuardモジュールがPerlのスコープの特性を活かしたモジュールで面白いです。
もう一つはコミュニティの寛容さ。以前、TPCiPに参加したとき、Golangのワークショップが複数日程を使って開催されていました。廊下で一休みしていたときは、Rustを嬉々と薦められました。先日運営したYAPC::Japan::Online 2022では、kimusonがTypeScriptのネタで登壇していました。
技術的に面白いかどうか、技術的課題を解決するかどうかが関心事に感じられて、懐の深さを感じます。自分はPerlコミュニティのこういうところが結構好きです。
研修の中身
Perlの言語学習
まず言語学習を1,2日で実施しています。次の教材を読み進めてもらい、軽い演習問題を解いて手触りを確かめてもらっています。
- Minimum Viable Perl
- Perlでアプリケーションを書くための最小限の知識を入れるためのテキストで、Perlの構文、ライブラリの使い方、依存ライブラリ管理の仕方、デバッグ方法、テストの書き方を学ぶ
- はてなの教科書(Perl)
- Perlでつまりがちな所をポイントを抑えたテキスト
- 公式ドキュメントでも特に大事なドキュメント
演習問題は、FizzBuzzやすごろくです。
もう少し体系だった言語知識をいれる場合は、リャマ本、ラクダ本を読んでもらいます。
PerlでWebアプリケーションを作る研修
Perlに限らないですが、Webアプリケーション開発の研修では「HTTPリクエストからレスポンスが返り、クライアントがコンテンツを体験するまでに何が行われてるか」この解像度が高まるといいと思って教材を作っています。
そういった思いがあるので、かなり素朴な実装から徐々にWeb Application Frameworkを使って実装をリッチにしていく研修プログラムにしています。最初からおんぶに抱っこなフレームワークにのっかると「フレームワークのルールはわかるけれど、Webアプリの全体像が掴めない」といったことが起きがちなためです。具体的には、次の通りです。
- まず、netcatコマンドを使い、HTTP/1.1のプロトコルを地力で喋って、素朴なテキストやりとりで遊ぶ。
- PSGI/Plackを生で利用して、簡単なWeb APIを作る
- 次にWebアプリケーションフレームワークとしてAmon2を利用
- 業務ロジック、データ操作が複雑になった時を想定してアーキテクチャを変更する
- 素朴なサービス層を作るところから、CQRSやInteractorsなどの(表面的に)理解しやすい分割手法を試す
ソフトウェアアーキテクチャが開発に与える影響が大きく、重要だと思います。新人への教え方は試行錯誤の段階ですが、面白みを感じてもらえたらいいと思っています。
Perlの技術研修でよくあるFAQ
教材を読み進め疑問に思ったことを雑に話す場を設けて、理解度向上を狙っています。ここでは例年よくあがる話を紹介したいと思います。
1;
は何を意味している?
モジュールのコード実行がうまくいったことを示すため。require
の実装内容を見ると良い。
https://perldoc.jp/func/require
unlessを使う必要ある?
ケースバイケースだが、否定は認知負荷を上げるので基本は使わない方がいいと思う。けれど、異常系で早期リターンしたいときはよく使う。
return unless good1 return unless good2 return !!1
関数呼び出しの::
と ->
の違い
->
は、インスタンスメソッドやクラスメソッドとして使う場合に利用$user->name
、User->list
::
は、単純に関数として使う場合に利用POSIX::abs(-3)
::
と->
の関係性Hello->message('yeah')
は、Hello::message('Hello', 'yeah')
と等価$some_object->method('waiwai')
は、SomeObject::method($some_object, 'waiwai')
と等価
EXPORT_TAGはどういうケースで利用する?
まとまった意味があれば使うことはあるけれど、使うことは例外だと思ってもらいたい。というのも、どこから関数がインポートされたかわかりづらくなるから。
アプリケーション側のコードを書く時は、何をインポートしているか、できる限り明示する。 基盤のコードの場合は、学習が完了すれば、便利に使えるので、タグや暗黙的なインポートをする場合も許容する場合がある。
そんな感じで私は考えてる。
コンテキストとは?
次を読む。
引数バリデートは実装する関数やメソッド全てに対して行うべき?
チームで認識が揃っていない場合もあるので、注意は必要だけれど、 全てではないと思う。
外部から渡ってきた値は、正しい値かどうかできるだけ早く検証する。これがバリデーション。 システム内部での値の受け渡しなど、システムを正しく利用していれば、正しくなる値に関しては、バリデーションする必要はない。 そういった場合は、アサーションを書き、開発環境だけで動かす(≒本番環境では動かさないで済む)のが適切だと思う。
$, @, %ってわかりずらい
次のように覚える
- $calar - Scalar
- @rray - Array
- %ash - Hash
$@
, $_
この記号は何?ググりにくい。
perldoc -v $@
のようにperldoc の variable optionで特殊記号のドキュメントを調べられる- perldoc.jp を使うと、
http://perldoc.jp/$@
のようにすると日本語ドキュメントを調べることもできるperldoc.jp/{キーワード}
で、ドキュメントをよしなに探してくれる。
さいごに
モバファクのPerlの技術研修の事情をお伝えしました。少しでもイメージが湧けば嬉しいです。
カジュアル面談のリンクはコチラです。ぜひお話しましょう!
*1:逆に他の言語にPerlのアレがないといったこともあるある