見出し画像

プログラミングの素人が、10分で自分にプログラミングが向いてるか適性を診断する方法。(課題付き)

前置き

こんにちは。九条です。

今回は、タイトルの通り、プログラミングの素人が、10分で自分にプログラミングが向いてるか、チェックする方法について解説します。そのための、具体的な「課題」も提示します。

この記事の対象読者は、プログラミングに興味がある全ての人とさせていただきますが、プログラミングに興味が無い方やプログラミングがそもそも何なのか分からないという方でも、パズルのように楽しめると思います。

この課題は特に本に掲載されているものではなく、私が独自に閃いたもので、会社の新人研修にも使用したことがあります。また、プログラミングの教育をしている方は、この課題を自分の講義や授業で使っていただいても構いません。

今回は有料記事とさせていただきました。課題と課題の説明までは無料で読めますが、課題の解答と解説の部分は有料とさせていただきました。

「課題」の言語は、C#を想定しますが、C#を知らない人でも全く問題ありません。必要な文法事項はごく僅かで極めて短いサンプルプログラムを使うので、必要な文法事項は記事内でその場で説明ができます。需要があれば、他の言語のバージョンも有料記事として出します。

また、言語処理系をセットアップして、実際に動かすには手間がかかりますが、その必要性すらありません。実行するまでもない課題だからです。

そもそもこんな記事を書こうと思った背景について説明しておくと、最近、素人がプログラミングを学んで、転職して人生一発を狙うことが流行っています。そのためのプログラミングスクールも存在しており、スクールの中には、「転職に成功すれば年収1000万円も夢じゃない」と、数値目標を掲げて集客しているところもあります。

プログラミングで年収1000万円稼ぐことが現実的かどうかについては、次の記事で考察しておりますので、参考にしてみてください。
(参考記事)

そこで、最近大変よくお受けする質問で、「全くの素人なのですが、頑張ればプログラマに転職できますか?」というのがあります。

これに対しては色々な答え方が考えられるのですが、私は、適性があって向いているかどうかにかかっている(※ただし、向いていてもそれは最低限の条件であって、年齢や努力や学歴や運等、様々な要素に左右され、向いていても就職できる保証はない。)と、回答するようにしています。

私の考えでは、スクールに投資するよりもまず、独学でプログラミングを学んでみるべきと考えています。プログラミングはある程度は独学で学べて、独学で学べば、自分にプログラミングが向いているかどうかもある程度は分かってくるからです。

スクールに高額な投資をして学び始めたけど、自分にプログラミングが向いていなくて、実際に勉強を始めたら全く付いて行けなかったとなると取り返しがつきません。

以上から、まずは独学で学ぶと言うことを推奨しています。

それでも何をすればいいかよくわからない、もっと手軽に自分に向いているかチェックする方法はないの?と思う方もいるかもしれません。そこで、本記事では、具体的な課題を提示します。この課題が簡単に解けてしまうようであれば、プログラミングに向いています。未経験、高年齢、低学歴のような不利な条件を抱えていても、努力と運次第ではプログラマになれる可能性があります。逆に、この課題を解けなかった人は、仮にプログラマへの就職が決まったとしても、仕事について行けずに、業界を早々に退場する可能性があります。

※なお、そもそも向いていても、現実にプログラマになるのは非常に難しいとか、プログラミングスクール自体をお勧めしないとか、色々な意見があります。私もこれらに賛成の立場ではあるのですが、それについてはこの記事では詳しく述べません。機会があれば記事にしますが、私の主張の一部は、リンクを示すことはしませんが、ブログに書いておりますので、興味がある方は探してみてください。

課題

それでは、具体的な課題を見ていきます。まずは、次のサンプルコードを見てください。

using System;

namespace KeisanDrill
{
    class Program
    {
        static void Main(string[] args)
        {
            Random random = new Random();
            int a = random.Next(0, 10);
            int b = random.Next(0, 10);

            int ans;
            ans = a + b;

            Console.Write("{0}+{1}=", a, b);

            int userAns = int.Parse(Console.ReadLine());

            if (ans == userAns)
            {
                Console.WriteLine("○");
            }
            else
            {
                Console.WriteLine("×");
            }
        }
    }
}

このプログラムは、小学生向け足し算の計算練習ドリルプログラムです。実行すると、1問だけ足し算の問題が出題され、キーボードから答えを入力し、正解ならば「○」、間違っていれば「×」と画面に表示します。1問分の問題と採点結果を表示したらプログラムは終了します。

では、この問題を掛け算の問題に変化させるには、どうすれば良いでしょうか?

これは簡単です。プログラミングを全くやったことが無くてもフィーリングで分かると思います。

(手順①)次の部分を、

ans = a + b;

このように修正します。

ans = a * b;

(手順②)次の部分を、

Console.Write("{0}+{1}=", a, b);

このように修正します。

Console.Write("{0}×{1}=", a, b);

一応、注意事項としてはプログラミングで掛け算をやる場合は、×の記号ではなく、半角の*(アスタリスク)を使うと言うことがあります。これは、Excel の仕様でもそうなっているため、普段からパソコンを使っている人であれば、違和感もなく、フィーリングで分かる話だと思います。

では、ここからが本題です。

(課題1)このプログラムを引き算の問題に変化させなさい。

(課題2)このプログラムを割り算の問題に変化させなさい。

この正解は、掛け算の問題に変化させたときのように、引き算であれば「+」を「-」に、割り算であれば「+」を「/」に変えれば良いと思った方がいるかもしれません。これは間違いであり、そう思った方はプログラミングに向いていない可能性があります。

何故間違いなのかというと、このプログラムの前提を思い出してください。このプログラムは小学生向けです。

もし、引き算で「+」を「-」に変えただけだと、正解に負の数が出てしまう可能性があります。負の数は小学校では習いません。

また、割り算の場合はどうでしょうか?「+」を「/」に変えただけだと、余りや少数が出てしまいます。

余りや少数は小学校でも習いますが、それをどうやって入力すれば良いかと言う問題があります。例えば、このプログラムのユーザ(小学生)に、「2あまり3」と入力させることはできるでしょうが、それが正解かどうか判定するのは、プログラミングの難易度が上がります。プログラムを、少し変化させれば良いというレベルを超えてしまいます。

少数の場合は、循環小数の問題があります。「10÷3」という問題を提示してしまった場合、その回答は3.33…と無限に3が続きますが、それ(循環小数)をどうやって入力すれば良いかという問題があります。

そこで、割り算については、余りや少数を出さない仕様にします。

よって、もう少し問題を正確に書くなら、次のような問題になります。

(課題1)このプログラムを引き算の問題に変化させなさい。(但、正解が負の数となるような問題を出題してはならない。)

(課題2)このプログラムを割り算の問題に変化させなさい。(但、正解が余りや少数となるような問題を出題してはならない。)

実は、この問題は、最初に挙げた足し算のプログラムに使った文法事項だけで、足し算のプログラムを少し変化させるだけで作ることができます。

さて、この答えがすぐに想像できた方は、プログラミングに向いています。逆に、考え込んでも分からない人はプログラマに向いていない可能性が高いです。

プログラミングはフィーリングも大事なので、あえて、足し算のプログラムの文法事項を解説せずに考えてみた方が勉強になるかもしれませんが、この記事は有料記事なので、もう少し責任を持った方が良いと思ったので、足し算のプログラムの文法事項の解説を行います。

解説を読んだら、改めて問題に取り組んでみてください。

課題の説明

ここでは、足し算のプログラムの文法事項を、問題を解く上で必要な範囲に限って解説します。namespace や関数の定義の仕方は、問題を解く上で必要ではないので、今回は飛ばします。(ここで解説していないことは変化させる必要が無いと言うことでもあります。)

Random random = new Random();

この部分は、乱数生成器を作っています。乱数生成器はサイコロだと思ってください。ユーザにランダムな問題を提示するためには、ランダムな数値を何らかの方法で得る必要があります。通常のサイコロは1~6までの数しか出せませんが、C#の乱数生成器を使えば、1~6以外のもっといろいろな数を得ることができます。

C#はオブジェクト指向型言語に分類されます。オブジェクト指向型言語では、何か処理をやるためには、その前にその処理をしてくれる部品を作り出すと言うことが必要なパターンが多いです。「Random random = new Random();」の1行は、ランダムな数値を得る処理をする前に、その仕事をしてくれる乱数生成器を作っています。

int a = random.Next(0, 10);
int b = random.Next(0, 10);

この2行は、実際にランダムな数値を2個得て、それを、それぞれ別の変数に格納しています。変数とは、何らかのデータを一時的に保存する箱のようなものだとという説明がされることが多いです。箱には名前を付けることができ、今回はそれぞれ「a」「b」という名前を付けています。

int ans;
ans = a + b;

この部分は、「a」と「b」を足した結果、つまり足し算の問題の正解を「ans」という名前の変数に格納しています。実は、この行は「int ans = a + b;」と書くことも可能ですが、あえてそれを分解して書いています。「int ans;」で、変数をまず作ります。そして、「ans = a + b;」で、足し算の問題の正解を変数「ans」に格納しています。

Console.Write("{0}+{1}=", a, b);

この部分は、実際にユーザに問題を提示しています。Console.Write は、続く括弧で与えられた文字列を、ユーザに提示する機能があります。括弧の中が「"{0}+{1}=", a, b」となっていますが、これは「{0}」の部分に、変数「a」の中身を「{1}」の部分に、変数「b」の中身を当てはめて表示するという意味になります。

int userAns = int.Parse(Console.ReadLine());

この部分は、ユーザの入力した数値を変数「userAns」に格納しています。少し複雑になっていますが、この課題を解く上では変化させる必要はなく、特に意識する必要もないので、そんなものなんだと思ってください。

if (ans == userAns)
{
    Console.WriteLine("○");
}
else
{
    Console.WriteLine("×");
}

この部分が少し難しいです。「ans」(足し算の正解が格納されている)と、「userAns」(ユーザの入力した回答が格納されている)の値が、同じかどうかを見ています。

同じならば、if (…) の直下の中括弧の中にある「Console.WriteLine("○");」が実行され、画面に「〇」と表示されます。それ以外の場合は(等しく無ければ)、else の下にある中括弧の中の「Console.WriteLine("×");」が実行され、画面に「×」と表示されます。

「==」は等しいという意味ですが、この他に「>」(大なり)や「<」(小なり)のような条件も書くことができます。

なお、Console.Write と Console.WriteLine の違いは、末尾で改行してくれるかどうかですが、細かいところで今は気にする必要はありません。

この解説はかなり端折っていますが、それでもこの課題を解く上では十分なものになっています。ここで解説した文法事項を応用すれば課題を解くことが可能です。

ただこの問題は、少々発想の転換が必要なところもあり、頭を柔らかくしておかなければ解けません。そこのところを注意しながら考えてみましょう。

ここから先は

2,502字

¥ 300

この記事が気に入ったらサポートをしてみませんか?