クラス(オブジェクト指向)は難しい?
こんにちは、paiza株式会社で「paizaラーニング」のディレクターをしている長谷康司です。
新しい施策や学習コンテンツの宣伝のためや、プログラミング学習者の悩みや意見などの情報を収集するために、TwitterなどのSNSは仕事上よく使用しています。
先日、学習し始めて間がないと思われる方の投稿に「クラス(オブジェクト指向)が難しい」という趣旨のものを見かけました。たしかにクラスは難しいですよね。このような場合はこう設計し、こう実装すべきだと、自信を持って第三者に説明できるか自問自答してみるとなかなかに難しいことだと気付かされます。
例えばJavaのように、プログラミング言語によってはクラスを作ることを強制させられる場合もあります。このような場合は早くからクラスに触れる機会はあるものの、文法的・概念的にもまだそのほとんどが学習前であることから、内容を理解する以前に決まりごととして記述する必要があります。これらはよくおまじないと言われたりもしますね。また、そうではないプログラミング言語の場合は、学習していく中であるとき唐突に出現することになります。
そこでpaizaでは、「クラスが難しく感じられる理由」「クラスを習得するにはどうしたらいいか」について、調査することにしました。
クラスについて「使いこなせている」自信がない人が多数
現在プログラミングの学習中、もしくは既に ITエンジニアとして就業中のpaizaユーザーに対して、クラスについてのアンケートを取得してみました。質問した項目は以下のものです。
1. 趣味や業務でのプログラミング歴はどのくらいですか
- 3年以内
- 4〜6年以内
- 7〜9年以内
- 10年以上
2. クラスについてどの程度理解していますか
- 知らない・聞いたことがない
- 理解していない
- あまり理解していない
- ある程度理解している
- 深く理解している
3. クラスをどの程度使いこなせていますか
- 使いこなせていない
- あまり使いこなせていない
- かなり使いこなせている
- 完璧に使いこなせている
4. クラスを扱う練習問題があったらどう思いますか
- 使わない
- やや使ってみたい
- とても使ってみたい
それぞれの回答結果については以下のようになりました。
アンケートの結果から、クラスやオブジェクトについて「理解している(深く理解している、ある程度理解している、を選択)」という人の割合は高めとなりました。また「理解している」の割合に比べると「使いこなせている(かなり使いこなせている、完璧に使いこなせている、を選択)」という人の割合は低めとなりました。もう少し横断的に調べてみると、クラスについて「使いこなせていない」「あまり使いこなせていない」を選択している人のうちの4割は「ある程度理解している」と答えていることもわかりました。
その特徴及び文法としてクラス・オブジェクトは理解できていると思えているけれど、その使用についてとなると自信がなくなるような結果となりました。また、経験年数が増えると、使いこなせていると回答する割合も徐々に増えていくこともわかりました。これはなぜでしょうか。
クラスが難しい背景
まず特徴および文法の理解という点においては、プログラミング言語、または使用しているフレームワークによってクラスの使用が強制させられることになり、触れる機会が多いからではないでしょうか。しかしながらこれらの多くは、開発者の明確な目的意識があってクラスを使用しているわけではなく、使用せざるを得ないから使用しているに過ぎない、というわけです。
使いこなすという点においては、オブジェクト指向のよくある説明の文脈と実装が綺麗に合致しないということもありそうだと感じています。例えば、よく目にする機会があるであろう車や鯛焼きの例えが、実際の設計・実装と乖離してはいないでしょうか。イメージを掴む分には良いのかもしれませんが、鯛焼きの金型と鯛焼きの話をされたとて、いざ目の前の実装にどう役立てて良いのかよくわかりません。
設計や実装を経験できる場がそもそも少ないということも言えそうです。これはアンケートの結果から、経験年数が増えると「使いこなせている」と言える割合が徐々に増える傾向があることからも伺えます。さまざまな要因があるでしょうが、業務やアプリケーション開発を通じ、自身による設計やレビューなどの経験を経て、徐々に勘所が生まれてくるのだと思われます。私個人の経験だと、ゼロからの設計というよりもリファクタリングをしていく過程で徐々に理解していったことを覚えています。
これはつまり、ある程度自由な設計が可能な環境下においての実装経験が足りていないだけではないでしょうか。であるならば、これらが経験できる場があればより理解が進むものと思われます。