nbdev:探索的プログラミングをPythonで実現する開発環境(1/4)

調査研究

1.nbdev:探索的プログラミングをPythonで実現する開発環境(1/4)まとめ

・何らかのシステムを開発する際はプログラムコードやデータの挙動を探索する作業が大半を占める
・探索作業はコード内コメントとしては蛇足だが非常に重要な知見で共有する価値がある
・nbdevはこの探索作業の実行と知見の蓄積を容易にする事を目的とするPython用の開発環境

2.探索的プログラミングとは?

以下、www.fast.aiより「nbdev: use Jupyter Notebooks for everything」の意訳です。元記事は2019年12月2日、Jeremy Howardさんによる投稿です。私自身はまだ見つけたばかりなので実際に使い始めるまでに至ってないのですが、コンセプトが素晴らしいので導入すると思います。アイキャッチ画像のクレジットは(Photo by Simon English on Unsplash)

nbdevはプログラミング開発環境の大きな進歩だと思います
– Chris Lattner(Swift、LLVM、Swift Playgroundsの発案者)

私とfast.aiの同僚であるSylvain Guggerは、ここ2年ほど愛の労働(Labor of love:自分が好きな事に無償で取り組む事)に取り組んでいます。これはnbdevと呼ばれるPythonプログラミング環境であり、テストと表現豊かなドキュメントシステムを含む完全なpythonパッケージをすべてJupyter Notebooksで作成できます。nbdevを使用した大規模なプログラミングライブラリ(fastai v2)と、さまざまな小規模プロジェクトを既に作成しました。

Nbdevは、私達が探索的プログラミング(exploratory programming)と呼んでいるシステムです。探索的プログラミングは、私達が通常、ほとんどの時間を、コーダーとしてプログラムを探索し実験するために費やすという観察に基づいています。例えば、

・これまでに使用したことのない新しいAPIを試して、その動作を正確に理解する
・開発中のアルゴリズムの動作を調べて、様々な種類のデータに対してどのように機能するかを確認する
・様々な入力の組み合わせを調べることで、コードをデバッグする
などなど

nbdevによる探索的プログラミングとは?
私達は、探索プロセスそのものに価値があり、このプロセスを保存すれば、他のプログラマー(6か月後の自分自身を含む)は何が起こったかを見て、事例によって学ぶ事ができると信じています。

科学者が書く日記のようなものと考えてください。

これを使用して、試した事柄、何が機能し、何が機能しなかったか、何を試してみたのかを記録して、作業中のシステムの理解を深めることができます。

この探索中に、あなたはシステムを機能させるために重要な部分が何処であるかについてに気付くでしょう。それゆえ、探索には、動作を確認するためのテストや確認作業を追加で含める必要があります。

この種の「探索」は、コマンドプロンプト、またはREPL(Read-Eval-Print Loop:対話型インタプリタ)で開発する場合、またはJupyter Notebooksなどのノートブック指向の開発システムを使用すると非常に簡単です。

しかし、これらのシステムは「プログラミング開発」に関しては強力ではありません。このため、人々は主に初期の調査にこれらのシステムを使用し、その後、本格的なプロジェクト開発の際にはIDE(統合開発環境)または好みのテキストエディターに切り替えます。

統合開発環境やエディターは、関連マニュアルの参照、構文の強調表示、単体テストとの統合などに優れています。NotebooksやREPLが優れている過去の探索履歴の参照ではなく、最終的に配布可能なソースコードファイルを生成する機能が優先されるのです。

nbdevのポイントは、IDE/エディター開発の主要な利点をNotebooksシステムに取り入れていることです。そのため、開発サイクル全体にわたって妥協することなくNotebooksを使って作業できます。この種の探索をサポートするために、nbdevはJupyter Notebookの上に構築され(通常のエディターまたはIDEよりもPythonの動的機能のサポートがはるかに優れている事を意味します)、ソフトウェア開発のために以下の非常に重要なツールを追加します:

・Pythonモジュールは自動的に作成されます。エクスポートされた関数、クラス、変数を__all__を自動的に定義するなどのベストプラクティスに従った形式でです。

・標準のテキストエディターまたはIDEでコードを編集し、変更をNotebooksに自動的にエクスポートする事ができます。

・あなたのコードから検索可能で、ハイパーリンクされたドキュメントを自動的に作成します。バッククォートで囲んだ単語は適切なドキュメントにハイパーリンクされます。各モジュールへのリンクを含んだ貴方のサイトに掲載可能なサイドバーが自動的に生成されます。

・Pipによるインストーラー(pypiにアップロード)

・テスト(Notebooks上で直接定義可能で、並行して実行可能)

・継続的インテグレーション

・バージョン管理の競合処理

以下は、nbdevの実際の「ソースコード」の抜粋です。nbdevを使って書かれています(当然です!)


nbdevソースコードのノートブックファイル形式の調査

ご覧のとおり、この方法でソフトウェアをビルドすると、プロジェクトチームの全員が、ファイル形式、パフォーマンス特性、APIの限界などの問題とその影響範囲を理解するために行った作業を知り、恩恵を受けることができます。開発はNotebooksで行われるため、ライブラリのドキュメントに含まれるチャート、テキスト、リンク、画像、ビデオなどを自動的に追加する事もできます。

コードが書かれているセルが非表示にし、代わりに関数に関するドキュメントに置き換え、その名前、引数、docstring、およびGitHub上のソースコードへのリンクを表示させる事もできます。

機能、インストール、およびnbdevの使用方法の詳細については、ドキュメント(当然、ソースコードから自動的に生成されます)を参照してください。

近日中にステップバイステップのチュートリアルを投稿する予定です。この投稿の残りの部分では、その理由の背後にある歴史と状況について詳しく説明します。

何故それを構築したのか、そして何故私たちはそのように設計したのか。
最初に、少し歴史について話しましょう…
(そして、歴史について興味がない場合は、「Jupyter Notebookに欠けているもの」のセクションに進んでください。)

 

3.nbdev:探索的プログラミングをPythonで実現する開発環境(1/4)関連リンク

1)www.fast.ai
nbdev: use Jupyter Notebooks for everything

2)nbdev.fast.ai
Welcome to nbdev

3)github.com
fastai/nbdev

4)www.reviewnb.com
Code Reviews for Jupyter Notebooks

5)jekyllrb.com
Transform your plain text into static websites and blogs

コメント

タイトルとURLをコピーしました