# 実績
Python用のコレクション操作ライブラリ(OSS)を開発しました。
- [参考URL(※開発中のため、参考として興味をお持ちいただけると幸いです)](https://sasano8.github.io/pnq/)
# 機能
- ストリームに対する多彩な操作
- 非同期ストリームへの対応
# 使用技術
- Python
- pytest
- Github Actions
リポジトリはGithubでホストされ、更新時にデグレードしないよう自動テストにより品質が保たれています。
# 開発の背景
データ分析において、データ収集と加工をいかに手早く行うかは重要な課題です。
このライブラリは、ストリーム(流れてくる複数のデータ)に対し、汎用的な機能を拡張し、様々な問い合わせを可能にします。
類似のライブラリとしてnumpyやpandasなどがありますが、本ツールは分析前フェーズのデータパイプライン構築に重きを置いています。
近年、Pythonでは非同期処理(asyncio)が導入され、ネットワーク通信など待機が生じる処理について、待機している間は別の処理にリソースを割り当てようという試みが行われています。
非同期処理はパフォーマンスに好影響を与える一方、非同期処理専用の構文も導入されました。
これは、開発者は同期処理と非同期処理をそれぞれ実装する、あるいは、使い分けなければいけないという新たな問題が生じました。
これは非常に億劫な問題で、非同期処理普及への妨げにもなっています。
本ライブラリは、このような問題を解決するために開発され、
同期ストリームと非同期ストリームを単にストリームとして抽象化し、同期コードと非同期コードの互換性を高め、
簡易的で汎用的なデータパイプラインの構築に使用できます。
# 工夫したこと
## 要件の整理
同期ストリームと非同期ストリームを1つのストリームとして抽象化するには、
次の要件に従い交通整理する必要がありました。
・始発点は同期ストリームか非同期ストリームのいずれかである
・ストリームは同期か非同期のいずれかで実行を要求される
・同期ストリームは非同期ストリームへ、強制的に、あるいは、要求に応じて連結することがある
・非同期ストリームは同期ストリームに連結することはない
・スレッドプール・プロセスプールで行われている処理は、メインスレッドで同期的にも非同期的にも待ち受けできる
Pythonの一般的なストリームは同期か非同期か決め打ちで実行されますが、
ストリームの特性決定を遅延させ、動的にパスを計画し内部に隠蔽することで、汎用性が高いインターフェースのみを公開することに成功しました。
## 同期コードと非同期コードのメンテナンスコスト削減
開発にあたり、同期コードと非同期コードの両方をコーディングする必要があり、
本質的に同じロジックのコピペ作業や、片方の更新漏れを気にする必要がありました。
そこで、非同期コードから同期コードを生成するライブラリ([unasync](https://github.com/python-trio/unasync))を用いて作業量を軽減しつつ、同期コードと非同期コードの整合性を担保しています。
(※現在はローカルリポジトリでのみ適用中)
## テスト失敗時の根本原因特定高速化
テストにはpytestを採用しており、得に大きな不満はありませんが、ひとつだけ気になる点がありました。
テストが失敗した時、何が根本原因でテストが失敗しているのか分かりにくいことでした。
ライブラリはいくつかの前提の上に、機能を積み重ねています。
そのため、テストに連番を振ることでテストの実行順序を制御(pytestは辞書順でテストを実行します)し、どの前提で失敗しているのかひと目で原因を特定できるようにしました。
# 今後の展望
概念実証が完了し、私個人で使う分には必要な機能が揃ってきました。
次のフェーズは、コードを小さくまとめ、テストを拡充させます。
品質の客観的な可視化ができていないため網羅率を導入したり、自信を持って使っていただけるような品質に到達するよう改善を続けていきます。