この記事では、Python開発者の役割のために競争している他の開発者に勝る最高の位置にあなたを置くと私が感じる私の意見と提案を与えた前回の記事Python開発者インタビューの準備のトピックの継続となります。この記事では、Nicolas GeorgesによるPython開発者面接の準備に関する人気のUdemyコース「Master the Python Interview – Get the senior & well paid job」をレビューしていきたいと思います。
始める前に、プログラミングの面接問題を練習する方法はたくさんあり、毎日新しい問題をメールで送ってくれるDaily Coding Problemのようなサービスもあることを述べておきます。
コース構成と対象トピック
このコースは、以下のトピックをカバーするセクションで構成されており、各セクションの最後には、1つまたは複数の演習またはクイズで教材が強化されています。
Nicolasのコースで扱うトピックは以下の通りです。
- リストとタプルを含むコレクション
- PythonのOOP入門
- ユニットテスト
- Pythonのイディオム – 許しを請うのではなく、許しを請う。
- Pythonプログラミングの構成要素を知っている必要があります。
- Pythonのデータ構造(Must know
- PythonのOOPの詳細
- データ構造の理解
この後のセクションでは、各セクションの内容を簡単に説明し、それぞれについて私が気に入った点、気に入らない点を述べます。最後に、このUdemyのコースに含まれる、または別の方法で行われた場合、私が感じる利点について議論する追加のセクションで終わります。
各セクションに入る前に、このコースは「レガシー」なPython 2.7を使って教えられていることを指摘しておきたいと思います。Pythonコミュニティは、Python 2のメンテナンスに関して、Core開発チームからのサポートを完全に失うまであと1年ちょっとです。このため、Pythonのコンテンツ制作者は、Python 3を100%採用し、使用することが必要だと感じています。
リストとタプルを使ったコレクション
コレクションは、すべての高レベルのプログラミング言語において非常に重要なトピックであり、Pythonも例外ではありませんので、このコースでカバーされていることを非常に嬉しく思います。ニコラスはリストとタプルに関連した不変性と変異性の区別をうまく行っています。
残念ながら、リストとタプルの実装について、非常に誤解を招きやすい、あるいはまったくもって間違っていると思われる指摘がありました。このセクションでNicolasは、「リストが均質なデータ型を含むのに対し、タプルは異質なデータ型を含むことを意図している」と述べています。しかし、このセクションの後半では、それが繰り返され、セクションの終わりのクイズの1つでさえ、それが強化されていました。
私は、Nicolasはおそらく、リストには同種のデータ型が多く含まれ、タプルには異種のデータ型が多く含まれるという一般的な使用傾向を説明しようとしたと思うので、この発言を訂正する時間をとりたいと思います。私の経験では、リストを使う場合、その中のデータはたいてい同じ型であることは事実である。しかし、リストとタプルは同じデータ型だけでなく、異なるデータ型も含むことができることを知っておくことが重要です。
ここでは、リストとタプルが同じデータ型を持つ例として、私の名前の文字列を表しているものを紹介します。
>>> x = ['a','d', 'a', 'm']
>>> y = ('a', 'd', 'a', 'm')
そして、以下は私の名前を表す文字列と年齢を表す整数という異なるデータ型を含むリストとタプルの例です。
>>> x = ['Adam', 30]
>>> y = ('Adam', 30)
Pythonで学ぶOOP入門
このセクションでは、NicolasがPythonプログラミング言語の非常に重要な特徴である、言語のすべての要素がオブジェクトの形式であることを説明します。このことから、この言語が完全にオブジェクト指向の言語であることが推測されます。Nicolasはさらに、プログラマがオブジェクトを検査できるようにする多くの組み込み関数の使用法と有用性を説明し、同様に dir()
, id()
, help()
や他の関数も紹介します。
しかし、Nicolasはこのセクションでリストのデータ型の均質性/異質性についての彼の以前の発言と矛盾しています。
ユニットテスト
私が最も感銘を受けたのは、このセクションです。プログラミングのコースの多くは、ほとんどではないにしても、自分のコードをテストすることの重要性を扱っていないことが多いと感じています。Nicolas は unittest
モジュールの基本を見事にカバーし、さらにテスト駆動開発の使用方法とそれがなぜ重要であるかを説明するのに多くの時間を割いています。
イディオムPython – 許しを乞うのではなく、許しを乞え
このパートでは、NicolasがPythonプログラミングコミュニティで一般的な慣習、またはイディオムに移行し始めるところです。なぜなら、彼は「許可を得るのではなく、許しを得る」とはどういうことか、そしてこの慣例がJavaなどの他の言語とPythonでどう違うのかを見事に説明してくれているからです。
Pythonのプログラミングコンストラクトを知っている必要があります。
なぜこのセクションが存在するのか、なぜコースの真ん中に配置されているのか、少し混乱しました。このセクションで扱うトピックは、ブール式、条件式、ループのような非常に基本的な構文について説明します。中級から上級のPython開発者を対象としたコースでは、このセクションは前提知識であるべきだと感じましたが、完全性のために含めることは不適切ではないでしょう。しかし、私は、この教材をコースの最初に置く方がより良い意味を持つだろうと思います。
以上、このセクションについて述べましたが、私が非常に肯定的に感じたことをもって、このセクションのレビューを残したいと思います。Nicolasが、Javascriptのコミュニティから言葉を借りて、truthy/falsyと見なされる言語の意味を説明したことがよかったです。Nicolasは、組み込みの bool()
関数の有用性を時間をかけて説明し、空リスト、空文字列、Noneなどの値をテストするためによく使われる条件式にブール値の等価性をテストするために素晴らしい仕事をしたのです。
Pythonのデータ構造を知っている必要があります。
Nicolas はここで、set
として知られる追加のコレクションデータ型を紹介し、セットとリストの比較について説明します。この説明の中で、彼はハッシュ可能であることが何を意味するのかという概念をカバーしています。
しかし、私がここで欠けていると感じたのは、セットを使用する大きな利点である、リストと比較してセットが値を含むかどうかを検索する際のパフォーマンス上の利点についての説明です。
PythonのOOPの詳細
このセクションでは、PythonのOOPについてさらに詳しく説明します。Nicolasは、カスタムクラスを定義し、そこからオブジェクトを作成する構文と意味について、さらに説明します。また、カスタムインスタンスの属性とメソッドを定義する概念を紹介し、さらにマジックメソッドとは何か、どのように使用されるのかについても触れています。一般的に、このセクションはよくカバーされており、中級から上級のPython開発者にとって重要な知識であると感じました。
データ構造理解
このコースは、私の好きなPythonicの機能の1つである内包のセクションで終わります。Nicolasは内包がどのように使われるのか、そしてリストや辞書を扱うときになぜ内包を使うのかを説明します。
コースに有益な追加すべきトピック
このコースのタイトルが、中級から上級のPython開発者を対象としていることを考えると、この言語の中級から上級の特徴をもっと説明するためのコンテンツが十分ではなかったように感じます。以下は、このコースをより対象者に適したものにするために、私が考える一連のトピックです。
A. より慣用的なPythonプログラミングのテクニックが必要である。その例として、タプルやリストを単純に構成要素に分解することが挙げられます。これは上級者向けのテキストやブログでよく実演されているのを見かけますが、個人的には「明示は暗黙に勝る」というよく知られたPythonのイディオムに合致するものだと感じています。
ここで、コーディングの例を挙げて、私の主張をより良く説明したいと思います。タプルのリストがあり、それぞれのタプルが長方形の長さと幅を表し、それらを反復してそれぞれの面積を計算して表示する場合を考えてみてください。1つはタプル要素のインデックスを使用するもので、もう1つはタプルを意味のある名前の変数にアンパックするものである。
インデックスを使用する
>>> shapes = [(1,1), (2,2), (3,2)]
>>> for shape in shapes:
... print "Area of shape %.2f" % (shape[0] * shape[1])
...
Area of shape 1.00
Area of shape 4.00
Area of shape 6.00
アンパッキングを利用する。
>>> for width, height in shapes:
... print "Area of shape %.2f" % (width * height)
...
Area of shape 1.00
Area of shape 4.00
Area of shape 6.00
私には、アンパッキングを使用する2番目の例がより読みやすく、より慣用的なPythonの実装を実証しています。
B. コレクションに対する操作を実行するPython組み込み関数についての議論は、このコースへの大きな追加になるでしょう。組み込み関数の多くは、一般的なプログラミングの問題に対する解決策を提供するために提供されていますが、高度に最適化された実装を持ち、しばしば大幅な性能向上を実現することができます。組み込み関数の中で特筆すべきは、zip、filter、mapです。
例えば、数字のリストをフィルタリングして、偶数のものだけを選択したいとします。この場合、2つのアプローチが考えられます。1つは、ループを使って項目を繰り返し処理し、各数値が偶数かどうかを条件付きでテストし、偶数の場合は偶数用に指定された別のリストにその数値を追加する方法です。これは、言語にあまり慣れていない若い開発者が取るアプローチでしょう。もう一つは、組み込みの filter()
関数とラムダ関数を使って、偶数かどうかをテストする方法です。
コードとしては、この2つのアプローチは以下のようになります。
最初の方法
>>> nums = [1, 2, 3, 4, 5, 6, 7, 8]
>>> even_nums = []
>>> for num in nums:
... if num % 2 == 0:
... even_nums.append(num)
...
>>> even_nums
[2, 4, 6, 8]
2つ目の方法
>>> even_nums = filter(lambda num: num % 2 == 0, nums)
>>> even_nums
[2, 4, 6, 8]
C. もうひとつ、既存のコンテンツに追加するのに有益なトピックとして、名前付きタプルや順序付き辞書などの高度なコレクションデータ型について取り上げたいと思います。私は、実世界のオブジェクトを表現したいが、カスタムクラスや過度に使用されるディクショナリを使用するのは厄介であるような場合に、名前付きタプルをよく使用しました。名前付きタプルは、実世界の何かを表現するデータを整理するのに最適な方法であるだけでなく、性能も優れており、特に辞書よりも優れています。
D. 最後になりますが、Python 2と3の違いについて言及してほしかったですね。特に、既存のシステムをPython 2からPython 3に移行する際のポイントについて言及することが重要だと思います。これは、多くの企業にとって急速に優先事項となっており、上級Python開発者の需要の増加につながっています。
結論
この記事では、現在約2,700人が受講しているUdemyコース「Master the Python Interview – get the senior & well paid job by Nicolas Georges」について、徹底的かつ正直なレビューを行うべく全力を尽くしてきました。
このコースの全体的な感想は、そのタイトルから、内容が中級から上級のPython開発者向けだと思われがちですが、私には少し物足りないということです。とはいえ、このコースでカバーされているいくつかの本当に素晴らしいコンテンツは、初心者やジュニアレベルのPython開発者にとって貴重なものだと思います。
また、コメントや批評をお待ちしています。