Python
プログラミング
初心者
数学
新人プログラマ応援
16
どのような問題がありますか?

投稿日

Organization

あなたは本当に「プログラミングができない、向いてない」のか? 〜うるう年判定プログラムで考える〜

この記事の目的

  • 「プログラミング学習につまずいている」
  • 「基礎的な式や文は覚えたけど、応用できずに悩んでいる」

そんな人達に、「自分がうまくいかない原因が何なのか」を考えるきっかけにしてほしいです。

特に、「プログラミングで何か問題を解く」的なことが苦手な人に、少しでも参考になればと思います。

「プログラミングができない」をもっと細かく切り分けてみる

「プログラミング難しい、向いてないかも...。」と思う前に、「自分が何につまずいているのか」を分析してみましょう。

実は、難しいのはプログラミングじゃない?

プログラミング自体は、あくまでコンピュータに何かを実行させるための命令でしかありません。

なので、そのやりたい「何か」自体が難しい場合、自ずとそれをプログラミングするのも難しくなります。

ただ、目の前で取り組んでいるものが「プログラミング」なので、その状態を「プログラミングが難しい」と考えてしまう人も多いのではないでしょうか。

例: 「うるう年判定プログラム」がうまく書けないケース

スクールの課題でもよくある(らしい)、「うるう年判定プログラム」を作る問題を例にとって見ていきたいと思います。

なお、言語はPythonを使用しますが、重要なのは考え方であり、その点は他の言語(JavaでもRubyでも)と共通です。

※あくまで解くこと優先なので、「うまい」「きれいな」書き方ではないことはご了承ください。

問題の概要

  • ある西暦(整数)を入力すると、それがうるう年か、そうでない(平年)か、を判定するプログラムを作成せよ。
  • うるう年と判定する条件は、以下のとおりである。
    • A: 4の倍数の年は、うるう年
    • B: ただし、100の倍数の年は、うるう年ではない(平年)
    • C: ただし、400の倍数の年は、うるう年

必要なプログラミングスキル

この問題を解く時に最低限必要なスキルは、大きく分けると

  • 変数への代入
  • 条件分岐(Pythonなら、 if - elif - else文)
  • (標準入力・標準出力)

のみです。

逆に言えば、「これらの書き方がわかるのにこの問題ができない場合、それはプログラミングができなくてつまずいているわけではない」のかもしれません。

主なハマりポイントとしては、

  • 倍数の判定方法がわからない
  • 条件が多すぎて、どうやって考えたらよいかわからない

あたりだと思います。

典型的な、「考える内容が難しい」問題であり、実は求められるプログラミングスキル自体は、それほど高くありません。

必要な要素・考え方

入力される西暦を、yearという変数に代入する前提で進めていきます。

「〇〇の倍数」の判定

  • 「〇〇倍数」は「〇〇で割り切れる(割った時に余りが0である)数」と言い換えることができます。
  • 例えば「2022を4で割った時の余り」は、 2022 % 4 で求められます。
  • なので、
    • yearが4の倍数かどうか」という条件は、「year % 4 == 0
    • 「100の倍数かどうか」は、「year % 100 == 0
    • 「400の倍数かどうか」は、「year % 400 == 0

条件同士の関係を考える

これが一番重要です。

条件が複数あるときは、その条件同士の関係をしっかり理解しましょう。

与えられた条件をもう一度整理すると、

  • A: 4の倍数ならばうるう年
  • B: 100の倍数ならば平年
  • C: 400の倍数ならばうるう年

になります。

ここで、AとBの条件に注目して、

  • 100の倍数ならば、4の倍数である

ことに気づくと、

  • 100の倍数は平年。そして100の倍数でない4の倍数はうるう年。

という形で、AとBの関係を整理することができます。

同様に、BとCについても、

  • 400の倍数ならば、100の倍数である

ので、

  • 400の倍数ならばうるう年。そして400の倍数でない100の倍数は平年。

という形で、BとCの関係を整理することができます。

まとめると、ある西暦に対して、

  • 400の倍数ならば、うるう年
  • 400の倍数でない、100の倍数ならば、平年
  • 100の倍数でない、4の倍数ならば、うるう年
  • 4の倍数でないならば、平年

ということになります。

ここまで整理できれば、上から順にif-elif-else文で書いていくだけになります。

year = int(input())
if year % 400 == 0:  # 400の倍数なら「うるう年です。」
    print("うるう年です。")
elif year % 100 == 0:  # 100の倍数なら「うるう年ではありません。」
    print("うるう年ではありません。")
elif year % 4 == 0:  # 4の倍数なら「うるう年です。」
    print("うるう年です。")
else:  # どれにも当てはまらなければ、「うるう年ではありません。」
    print("うるう年ではありません。")

※簡略化のため、main関数とか書いてないのはごめんなさい。

振り返り

この問題では、

  • 倍数についての知識
  • 条件間の関係性を考察する論理的思考力

が必要になります。

特に後者については、高校数学の「論理と集合」の考え方を理解しているかが大きな分かれ目になってます。
※勉強していないとできないわけではもちろんなくて、この考え方自体が自然にできるならば問題なく解けるはずです。

このように複数の条件を扱うときに、その条件同士の関係を整理できるかどうかは非常に重要で、一般的に、プログラミングには数学が必要と言われる背景の一つはこれではないかと考えています。

まとめ:あなたに足りないのは、本当にプログラミングスキルなのか

以上、うるう年判定を例に上げて、「プログラミングの問題を切り分け」してみました。

ここでは高校数学の話に少し触れましたが、決して「数学やってなかったらプログラミングできない」と言うつもりはありません。

今回お伝えしたかったのは、以下の2点です、

  • 現実の問題に立ち向かうためには、数学に限らず幅広い知識や感覚が必要になることがある。
  • これらの知識・感覚が自分に有るのか・無いのかを自覚して、無いならそれを補っていくことが重要。

「プログラミング向いてない」と諦めてしまう前に、自分がなんで詰まってしまったのか、しっかり振り返って前に進んでもらえると良いな、と思います。

おわりに

弊社では、経験の有無を問わず、社員やインターン生の採用を行っています。
興味のある方はこちらをご覧ください。

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
kjm_nuco
ソフトウェアエンジニアリング・機械学習・データサイエンスを中心に活動しています。 株式会社Nuco:採用広報担当
nuco-inc
↓↓ 3倍速でエンジニアキャリアを駆け上がる方法はこちら ↓↓

コメント

「プログラミングができない」の前に、PCの使い方やOSの使い方、プログラミング言語の環境構築、プロジェクトの作成の仕方、コンパイルの仕方、実行コマンドでつまづいてる人も多そう。

3

@ringo-apo さん
コメントありがとうございます。
そこで躓いている人、めちゃくちゃ多いと思いますね...。

すぐ向き不向きの話になりがちですが、「ちょっと知ってる人に聞いたらすぐ解決できた」みたいなケースもあるので、わからないところを相談できる人が周りにいるか、とかも、学習を左右しそうですね。

2

カルノー図を書くと条件が理解しやすくなるのではないかと思います。

A:0 4の倍数でない
  1 4の倍数である
B:0 100の倍数でない
  1 100の倍数である
C:0 400の倍数でない
  1 400の倍数である
BC\A 0 1
00 0 1
01 - -
10 - 0
11 - 1
year = int(input())
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
    print("うるう年です。")
else:
    print("うるう年ではありません。")
0
(編集済み)

さすがにこれができない人は向いてないと思います。
プログラミングでつまずいてるわけではないと言うのは詭弁です。

プロレスに向いてないんじゃなく体が小さいだけだからうちのスクールに来なさいとか、歌手に向いてないんじゃなく声が悪いだけだから壺を買いなさいとか、そのレベルの話になってます。

0

これらの知識・感覚が自分に有るのか・無いのかを自覚して、無いならそれを補っていくことが重要。

と簡単におっしゃいますが、具体的にどうやれば補えますか?小学生のドリルからやり直しますか?

この記事レベルの問題が解けない人が、その後何らかの努力によって立派なプログラマーになった事例があるなら、どうやって学習したのか知りたく思います。

0
(編集済み)

コーディングと課題解決のためのアルゴリズム考案は普段プログラミング業務としてひとまとめにされる内容かと思うので、「文の書き方、オブジェクトや型の扱い方といった文法サイドの難しさ」のみを「プログラミング」として扱っていることに違和感があります

この記事を読んだ自分の感想は
・プログラミングは「文法」「アルゴリズム」の二面で難しさを評価するべき
・「アルゴリズム」は「文法」よりもプログラミングの本質に近い部分
・今回の問題は「アルゴリズム」の難しさが高いもので、むしろ「向いていなさ」がわかるだろう
という感じです

ある程度のアルゴリズム考案能力を持っているかという試金石には悪くないと思いますが、逆に数か月以上学習してきたプログラマがこの問題を解けないようであれば「あなたはプログラミングで一線級にはなれない」と断じられる難易度だとも思います
アルゴリズムの考案能力は文法の知識よりもずっと伸ばしづらいものなので……

1

個人的にはこの分け方は好きです。保守性、可読性、テストのしやすさなどプログラミングにおいては重要なスキルですから。

そう考えると本記事では、「上手く書くスキル」と「要求仕様を実装に落とし込むスキル」で分けているように感じます。

プログラマーにおいてこの2つのスキルは大事と感じます。(あ、もしエンジニアだったら要求仕様を満たせないって致命的か……)

ですが、センスという言葉だけで初心者を切り捨てたり挫折させたりと暗い未来を暗示する非建設な姿勢よりも、こういった分け方もあるという考えの提示の方が未来があって自分は好きです。

1

@fujitanozomu

カルノー図を書くと条件が理解しやすくなるのではないかと思います。

if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:

書いたあなたは良いけど別の初見の人は何してるのか分からないのでそういう書き方は辞めてください。

※うるう年問題ではなく、問題を汎化させて言っています。

0

@ashworth さん

書いたあなたは良いけど別の初見の人は何してるのか分からないのでそういう書き方は辞めてください。

えっそうなの?
カルノー図を知らなかった人は勉強する機会になるし、知ってる人は流せば良いのでは?
初見の人には理解されない書き方は控えるべきということであれば新しい知見に会う機会もなくすべきということだと思いますがそれが正しいのですか?? 自分はそうは思わないですね。

0

いやー、さすがにこの程度で何をしているかわかりませんとか言われると困ります...

0
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
新人プログラマ応援 - みんなで新人を育てよう!
~
データに関する記事を書こう!
~
16
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー