かおるノート

cordx56のブログです

ピクシブさんでインターンをしておりました

こんにちは。 あけましておめでとうございます。 よく冷える日が続いていますね。 皆様も体調には気をつけてお過ごしください。

さて、タイトルの通り、昨年11月から今年1月までピクシブ株式会社さんでインターンをさせていただいておりました。 今回はピクシブさんでのインターンについて振り返る記事を書こうかと思います。

応募

元々は夏に開催されていた短期のインターンに申し込み、人数の関係でそのインターンには参加できず、ということだったのですが、ピクシブさんの方から冬または春のインターンか長期インターンもしくはアルバイトでの参加を提案していただき、最終的に長期インターンで参加させていただくこととなりました。

配属

配属先の部署決定に際しては、私の興味を持っていることなどを面談でしっかり確認していただきました。

最初はGoなどの静的型付き言語を扱っている部署が良いかななどと思っていたのですが、面談などで私がPythonの型注釈の研究をしていることなどを話したことから、ソースコードの静的解析を行ってる部署への配属をご提案いただき、その部署へ配属ということになりました。

開発環境

開発環境はフルリモートだったため、LinuxAmazon WorkSpacesでした。 PhpStormのライセンスを割り当てていただき、ほとんどの開発をPhpStorm上で行うといった感じでした。

慣れない環境ではありましたが、そんなに苦労することもなかったなという印象です。

課題

課題については、メンターさんと相談しながら、そう長くはないインターン期間を有意義に過ごせるようにと課題を設定していただきました。 課題のほとんどはpixivやピクシブ百科事典といったサービスの開発を静的解析で支援するといった内容で、非常に面白かったです。

取り組んだ課題の中で一番面白く達成感があったのは、PHPの静的解析ツールであるPHPStanの拡張を書く、という課題でした。 pixivでは、ユーザ情報の取得を行う関数があり、その引数に渡すことによって返り値が変わるオプションが存在しているのですが、そのオプションの値を見て、返ってくる連想配列の型が変わるのをPHPStanに教える、というものでした。

例えば、次のようなユーザデータの取得を行う関数があるとすると、

User_Common::getGenericDataById(11)
// array{user_id: string, user_status: string, user_account: string, user_name: string}|false

返り値の型はコメントで示したようになります。

この関数には第二引数にオプションを渡すことができ、オプションによって返ってくる連想配列が変わります。

User_Common::getGenericDataById(11, ['expand_serialized_field' => true, 'additional_fields' => ['serialized']]);
// array{user_id: string, user_status: string, user_account: string, user_name: string, user_contact: array{Twitter: string}, show_foobar: bool, foobar: array}|false

返り値の型はコメントで示したようになります。

こういったオプションによる型の変化は通常の静的解析では知ることができず、詳細な型をつけることができません。 実際、現状のpixivのソースコードでは array|false としか型をつけられていませんでした。

PHPStanの拡張を書くことにより、このオプションの値が静的に求まる場合は、詳細な型をPHPStanに教えることができます。

ということで、実際にPHPStanの拡張を書き、ユーザ情報の取得に関わる関数について、詳細な型をつけることができました。

PHPを書いたのはかなりしばらくぶりで、静的解析となると全く触ったことがなかったですが、メンターさんに優しく詳しく教えていただき、たくさんの学びがありました。

最終課題発表

最終日には取り組んだ課題について発表する場を設けていただきました。 私が取り組んだ課題はPHPStanを利用したPHPでの静的解析に関するものがほとんどだったため、「静的解析とpixiv開発支援」という課題テーマで発表させていただきました。

さいごに

ピクシブさんでのインターンは面白く、多くの学びが得られたインターンでした。 ピクシブの皆様、長いようで短かった三か月間、ありがとうございました。

これからもどうぞよろしくお願いします。