Slide 1

Slide 1 text

個人開発OSSが世界に勝て なかった話 yukinarit (Yukinari TANI)

Slide 2

Slide 2 text

自己紹介 * yukinarit (https://github.com/yukinarit) * MapboxというアメリカのIT企業でソフトウェアエンジニアをしています 地図会社 カーナビ / 経路探索Webサービス ゲーム会社 MMORPGゲームサーバ 証券会社 Market Data / 先物オプション取引 Mapbox 広告 / EVプラットフォーム開発 Rust何も分からない... #7 「Rustで高速な広告配信サービスを作っている話」

Slide 3

Slide 3 text

きっかけは、ゆーすけべー氏のブログ。 カッコいいと思った。

Slide 4

Slide 4 text

pyserde * RustのserdeにインスパイアされたPython用シリアライズフレームワーク * serdeはRustのすごいすごいフレームワーク (lib.rsでは人気No.1)

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

JSONからデシリアライズ “country”がMaxLen(3)に違反しているためエラー

Slide 7

Slide 7 text

pyserdeでできること * Data Format: dict, tuple, JSON, YAML, TOML, MsgPack, Pickle * Supported types   * dict, list, set, frozenset, defaultdict, Union, Optional, Any   * NewType, Literal, Generic, ClassVar, InitVar, Enum   * pathlib, decimal, uuid, datetime, ipaddress, numpy … * Case conversion, Rename, Alias, Skip, Flatten * Custom field/class/global (de)serializer * Strict type check, type coercing

Slide 8

Slide 8 text

pyserdeをつくった動機 * 証券会社時代にC++17, Rust, Pythonで使える社内RPCフレームワークを開発 * Serialization: MsgPack * Transport: ZeroMQ (TCP, Uni/Multicast, IPC etc.) * Rustのserdeのようなライブラリがほしかった * python 3.7のdataclassesをベースに作れそうだったので始めてみた

Slide 9

Slide 9 text

pydantic * 型アノテーションを利用したデータバリデーションライブラリ * FastAPIにも使われている

Slide 10

Slide 10 text

なんで世界と勝負しようと思ったの? ありがたいことにXやGithubでpyserde vs. pydanticを言及してくれる人がいた こういう声はやっぱりうれしい

Slide 11

Slide 11 text

あれ、もしかしてpydanticに勝てるかも?🤔

Slide 12

Slide 12 text

結果

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

全然勝てませんでした\(^o^)/

Slide 16

Slide 16 text

勝てなかった理由ってなんだろう?🤔

Slide 17

Slide 17 text

理由1: 1人対企業 * pydanticは法人になっており、10人のフルタイム開発者がいる * ライブラリバックエンドはRustで実装、mypyプラグイン、他パッケージ (numpy, sqlalchemy)とのインテグレーション、ランディングページ .. etc

Slide 18

Slide 18 text

理由1: 1人対企業 普通にやっても勝てないので、 * シリアライズ・デシリアライズの問題解決に集中する * ランタイムの型チェックはbeartypeに任せる * サードパーティーのパッケージのインテグレーションは、本体に入れずなるべ くExtensionでやる でも、個人的には開発力の差は大きな問題ではない

Slide 19

Slide 19 text

理由2: 広報活動 自分はインフルエンサーでもないし、勉強会やカンファレンスで発表することは 滅多にない Kobzol氏が書いたWriting Python like it's RustがHacker Newsランキング入り

Slide 20

Slide 20 text

理由2: 広報活動 プロダクトを作る情熱以上に発信することが重要 HackerNewsランキング入りで 一週間で300スターぐらいUP 😲

Slide 21

Slide 21 text

理由: Rust 2017年からRustを使いはじめ、今ではほぼRustで書くようになってしまった WebAPI IaC HTTP以外のサービス (TCP, UDP etc) スクリプティング データエンジニアリング CLI 2017年以前 2024年現在 WebAPI IaC HTTP以外のサービス (TCP, UDP etc) スクリプティング データエンジニアリング CLI OSSのユーザーであり続け、ドッグフーディングするのが重要

Slide 22

Slide 22 text

ここまでやってきて良かったこと 学んだこと

Slide 23

Slide 23 text

ドキュメントを英語でちゃんと書く * README: 概要、機能一覧、ライセンス、コントリビュータ一覧等 * Guide: 主にチュートリアルや機能の説明等 * API documentation: 内部APIのドキュメント ドキュメント書くのはかなりつらいです😅 でも大事なので頑張っています。

Slide 24

Slide 24 text

とことん自動化 * CIでユニットテスト、Linter、スタイルチェック、コードカバレッジ * ドキュメントのビルド * Github ReleaseでCHANGELOG生成、PyPIでパッケージ公開 * .github/release.yml, poetry-dynamic-versioning GitHub Actionsでいい感じのリリースノートを完全自動で作成する poetryを利用した動的なバージョン管理とGitHub ActionsによるPyPIへのrelease

Slide 25

Slide 25 text

とことん自動化

Slide 26

Slide 26 text

全部自分でやらない * OSS活動したい人はコントリビュートできるし、OSS側はコントリビュータを 増やせるのでwin-win * Good first issueラベルを付けておくと、彼らが探しやすい

Slide 27

Slide 27 text

でも何でもいれたらいいわけではない プロジェクトの方針に合わない場合はちゃんと断りましょう。過去になんとなく 変更を入れてしまってテストが不十分だったり、あとで意図が分からなくなって しまったことがありました。

Slide 28

Slide 28 text

思い切ってある程度の互換性は捨てる * Python 3.8サポートをEOLより数ヶ月前に停止したらコードも綺麗になって、 生産性もやる気も上がった

Slide 29

Slide 29 text

機能毎に超簡単なexampleを作る リグレッションテストにもなるし、機能のshowcaseにもなる alias.py any.py class_var.py collection.py custom_class_serializer.py custom_field_serializer.py custom_legacy_class_serializer.py default_dict.py default.py enum34.py env.py field_order.py flatten.py forward_reference.py frozen_set.py generics_nested.py generics_pep698.py generics.py global_custom_class_serializer.py init_var.py jsonfile.py kw_only.py lazy_type_evaluation.py literal.py msg_pack.py nested.py newtype.py pep681.py plain_dataclass_class_attribute.py plain_dataclass.py primitive_subclass.py python_pickle.py recursive_list.py recursive.py recursive_union.py rename_all.py rename.py simple.py skip.py tomlfile.py type_check_coerce.py type_check_disabled.py type_datetime.py type_decimal.py type_ipaddress.py type_numpy.py type_pathlib.py type_uuid.py union_directly.py union.py union_tagging.py user_exception.py variable_length_tuple.py yamlfile.py

Slide 30

Slide 30 text

自作OSSを業務で使っていく 可能であれば自分の業務でどんどん使っていくことをおすすめします。業務で使 うと足りない機能や問題点がつかみ易いです。

Slide 31

Slide 31 text

無理をしない 過去に家族との時間を犠牲にしてまでOSS開発していたことがありました。自分 の妻や子供の人生の方が自分のキャリアより大事だということに気が付き、家族 優先で空いた時間にマイペースにやるようにしています。

Slide 32

Slide 32 text

おわりに せっかくpyserdeのことについて知ってもらえたので、良ければ使ってみてくだ さい! また、コントリビュートしたいんだけど何したらいい?ここの設計どうなってん の?みたいな質問でもいいし、その他、相談、質問、コメントがあったら以下に どうぞ。 * https://x.com/pyserde * [email protected]