この記事の目的
- 「プログラミング学習につまずいている」
- 「基礎的な式や文は覚えたけど、応用できずに悩んでいる」
そんな人達に、「自分がうまくいかない原因が何なのか」を考えるきっかけにしてほしいです。
特に、「プログラミングで何か問題を解く」的なことが苦手な人に、少しでも参考になればと思います。
「プログラミングができない」をもっと細かく切り分けてみる
「プログラミング難しい、向いてないかも...。」と思う前に、「自分が何につまずいているのか」を分析してみましょう。
実は、難しいのはプログラミングじゃない?
プログラミング自体は、あくまでコンピュータに何かを実行させるための命令でしかありません。
なので、そのやりたい「何か」自体が難しい場合、自ずとそれをプログラミングするのも難しくなります。
ただ、目の前で取り組んでいるものが「プログラミング」なので、その状態を「プログラミングが難しい」と考えてしまう人も多いのではないでしょうか。
例: 「うるう年判定プログラム」がうまく書けないケース
スクールの課題でもよくある(らしい)、「うるう年判定プログラム」を作る問題を例にとって見ていきたいと思います。
なお、言語は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点です、
- 現実の問題に立ち向かうためには、数学に限らず幅広い知識や感覚が必要になることがある。
- これらの知識・感覚が自分に有るのか・無いのかを自覚して、無いならそれを補っていくことが重要。
「プログラミング向いてない」と諦めてしまう前に、自分がなんで詰まってしまったのか、しっかり振り返って前に進んでもらえると良いな、と思います。
おわりに
弊社では、経験の有無を問わず、社員やインターン生の採用を行っています。
興味のある方はこちらをご覧ください。
コメント
@ringo-apo3
@kjm_nuco2
@fujitanozomu
BC\A
0
1
00
0
1
01
-
-
10
-
0
11
-
1
0
@Zuishin(編集済み) 0
@error_401
0
@Third_Kei(編集済み) 1
@mutuya1
@ashworth
0
@fujitanozomu0
@error_4010
@ashworth0
@error_4010
@ashworth0
@fujitanozomu0
@ashworth(編集済み) 0
@error_4010
@Zuishin(編集済み) 0
@error_401「60%の人間はプログラミングの素質がない」という論文は撤回されていた | catch.jp blog https://www.catch.jp
1
@osorezugoing
4
@lensouko(編集済み) 1
@Zuishin(編集済み) Reference Source https://referencesource.microsoft.com
0
@ashworth1
@ashworth
0
@ashworth0
@Zuishin(編集済み)
0
@ashworth0
@error_4010
@jintz
1
@fujitanozomu2
@fujitanozomu- 100の倍数ならば、4の倍数である
- 400の倍数ならば、100の倍数である
0
@ashworth0
@ashworth(編集済み) 0
@ashworth0
@ashworth0
@ashworth(編集済み) 0
@ashworth(編集済み) 0
@ashworth- A: 4の倍数ならばうるう年
- B: 100の倍数ならば平年
- C: 400の倍数ならばうるう年
0
@ashworth0
@ashworth0
@Zuishin0
@ashworth0
@Zuishin0
@ashworth(編集済み) 0
@ashworth0
@ashworth
0
@ashworth(編集済み) 0
@ashworth(編集済み) 0
@ashworth0
@ashworthQiitaのクソ記事研究スレッド2 ゴミ記事量産
https://medaka.5ch.net
0
@ashworth0
@fujitanozomu
2
@ashworthあなたのコード複雑怪奇になっていませんか? - Qiita https://qiita.com
0
@ashworth0
@ashworth0
@ashworth0
「プログラミングができない」の前に、PCの使い方やOSの使い方、プログラミング言語の環境構築、プロジェクトの作成の仕方、コンパイルの仕方、実行コマンドでつまづいてる人も多そう。
@ringo-apo さん
コメントありがとうございます。
そこで躓いている人、めちゃくちゃ多いと思いますね...。
すぐ向き不向きの話になりがちですが、「ちょっと知ってる人に聞いたらすぐ解決できた」みたいなケースもあるので、わからないところを相談できる人が周りにいるか、とかも、学習を左右しそうですね。
カルノー図を書くと条件が理解しやすくなるのではないかと思います。
さすがにこれができない人は向いてないと思います。
プログラミングでつまずいてるわけではないと言うのは詭弁です。
プロレスに向いてないんじゃなく体が小さいだけだからうちのスクールに来なさいとか、歌手に向いてないんじゃなく声が悪いだけだから壺を買いなさいとか、そのレベルの話になってます。
と簡単におっしゃいますが、具体的にどうやれば補えますか?小学生のドリルからやり直しますか?
この記事レベルの問題が解けない人が、その後何らかの努力によって立派なプログラマーになった事例があるなら、どうやって学習したのか知りたく思います。
コーディングと課題解決のためのアルゴリズム考案は普段プログラミング業務としてひとまとめにされる内容かと思うので、「文の書き方、オブジェクトや型の扱い方といった文法サイドの難しさ」のみを「プログラミング」として扱っていることに違和感があります
この記事を読んだ自分の感想は
・プログラミングは「文法」「アルゴリズム」の二面で難しさを評価するべき
・「アルゴリズム」は「文法」よりもプログラミングの本質に近い部分
・今回の問題は「アルゴリズム」の難しさが高いもので、むしろ「向いていなさ」がわかるだろう
という感じです
ある程度のアルゴリズム考案能力を持っているかという試金石には悪くないと思いますが、逆に数か月以上学習してきたプログラマがこの問題を解けないようであれば「あなたはプログラミングで一線級にはなれない」と断じられる難易度だとも思います
アルゴリズムの考案能力は文法の知識よりもずっと伸ばしづらいものなので……
個人的にはこの分け方は好きです。保守性、可読性、テストのしやすさなどプログラミングにおいては重要なスキルですから。
そう考えると本記事では、「上手く書くスキル」と「要求仕様を実装に落とし込むスキル」で分けているように感じます。
プログラマーにおいてこの2つのスキルは大事と感じます。(あ、もしエンジニアだったら要求仕様を満たせないって致命的か……)
ですが、センスという言葉だけで初心者を切り捨てたり挫折させたりと暗い未来を暗示する非建設な姿勢よりも、こういった分け方もあるという考えの提示の方が未来があって自分は好きです。
@fujitanozomu
書いたあなたは良いけど別の初見の人は何してるのか分からないのでそういう書き方は辞めてください。
※うるう年問題ではなく、問題を汎化させて言っています。
@ashworth さん
えっそうなの?
カルノー図を知らなかった人は勉強する機会になるし、知ってる人は流せば良いのでは?
初見の人には理解されない書き方は控えるべきということであれば新しい知見に会う機会もなくすべきということだと思いますがそれが正しいのですか?? 自分はそうは思わないですね。
いやー、さすがにこの程度で何をしているかわかりませんとか言われると困ります...
※うるう年問題ではなく、問題を汎化させて言っています。
の意味が分からない方が2人。
仕事できなそうな方ですね。社会人じゃないのかな?
相手がわかっていないというその思い込み、やめたほうがいいですよ。
@error_401
あなたがね。
社会人で他人の書いたコードを沢山見てくれば、
どういうコードが悪質なのかという基準が出来てくる。
あなたにはその基準が、全く無い。
分からない人がいる可能性を考慮してWikipediaの記事のリンクまで貼った投稿に「問題を汎化させて言っています」とは呆れる他ない
@fujitanozomu
何を言っているのか分からないですが、
社会の要求に沿ったシステムを開発するために必要な汎用的なコードが書けていないので
「迷惑だから辞めてください」と言っているだけです。
あなたは四重三項演算子とか書きそうだ。
思い込みが激しすぎて笑うしかない。
説明皆無で例(しかも該当しない謎の例)を一つだけ出されてもどう汎化すればいいのかわかりません。
一行に演算子が多すぎるということですか?
うるう年の計算は初見で十分わかるので、他の例を二つ三つ出し、どこがどう悪いのか説明を加えると伝わりやすくなるかもしれません。
プログラミングができない、あるいは素質がないとはどういうことで、その原因は何で、改善可能なのかどうかということに興味があります。
例のふたこぶラクダの論文が話題になったとき、ある程度の納得感を得られたのですが、その論文も撤回されたようで。
そういう文脈でこの記事にも興味を持ちました。
ちなみに個人的には、素質がない人は何をやってもダメなんじゃないかと思ってます。
・・・お見苦しいコメントをいくつかかいてしまったので、すこし方向修正。
整理せず問題文ののまま愚直に書くとこうですかね
@ashworth さんの 2022-04-21 22:48 の書き込み
こちらは下記のコミュニティガイドラインを見る限り
ふさわしくない表現ではありませんか?
コミュニティガイドライン
ガイドラインの見出しでは記事となっていますが、コメントに関するガイドラインが無かったためこちらを参考にしています。
引用したコメントが出てくる前のやり取りとは関係ない誹謗中傷であるようにしか見えません。
こちらの記事自体は、プログラマーとして仕事ができるかどうかがスタートになっているのではなく、プログラマーに向いているかどうかという話題が起点となっているようなので、仕事ではなく趣味の日曜プログラマーかもしれません。ましてや社会人じゃなさそうってお話をされていますが、社会人かどうかなんて全く関係ない視点のお話です。どう見ても自分の意見と異なる人を貶めて自分が正しいと主張するのが目的としか読めません。
エンジニアであるのでしたら、ご自身の意見の正当性を論理的に書かれては如何でしょうか?
相手を貶めないと出来ないようでしたら、あなたには正当性が無いと自白しているとは思えませんか?
一応自分の個人的な感想としては、ソースコード上にカルノー図は載せられないので、引継ぎ資料に作った図を保存しておき、そちらへの誘導をコメントで書いておくだけで、うるう年となる条件のブロックを
OR
で列挙しているだけというのが理解できるかと思います。が、作成したカルノー図が無いとソースとの連携がないので作った人がつっくった時以外だと分かりにくいかもしれませんね。カルノー図が必要ならマークダウン形式で複数行コメントに書くこともできますが、閏年の計算方法は天文学を応用した学術計算に基づいたもので、数式で表すこともでき、資料はいくらでもあるため、この図すら必要ないと思います。
「汎化」の意味が今一つわかりませんが、「複雑な学術計算をプログラム中に記述する方向性」の違いであるなら、効率を求めても読みやすさを求めてもケースバイケースでどちらが絶対ということはないと思います。
このケースにおいては、たかが閏年の計算法なので、なおさらどうでもいいです。
コード例ではなく実用であれば、バグ混入のリスクを減らすために、既存のカレンダークラスを使えばいいと思いますよ。
ちなみに .NET の閏年計算はこちら。
@osorezugoing
それ、問題文の条件のまま書いちゃダメなんですよね。
「ただし」がある場合は前出の条件を否定してくるので、条件の順番通りに書くと破綻します。
だから、「ただし」がある場合は条件を逆に記述していくのが鉄則です。
@Zuishin
汎化は汎化でしょう。
閏年問題に限った話では無いと言っています。
条件分岐が商業的な理由でどんどん仕様変更されていく事があるのは、仕事でプログラミングをした事があれば分かりませんか?
その時に
この条件分岐を延々と伸ばしていくのですか?
頭がおかしいでしょう。
正直、この程度の事が分からない方が多数居る事に驚愕しています。
@lensouko
運営の方がどう判断するか次第ですが、
社会で仕事をしていく上で、迷惑な事をする人が自分のしている事に何の疑いも抱いていないのなら、
それは迷惑行為その物なので「迷惑です」と言っているだけです。
汎化の意味をどうとらえていますか?
私はあなたの言う「汎化」の意味を想像して書きましたが、それに対して合っているとも違っているとも返事がありません。
否定的に書かれているということは、違っているということですか?
汎化であるなら、閏年の例にはあなたの言う問題が含まれていることになります。
その問題は何ですか?
一行の長さが長すぎるということなら、別にそこまで長くないと思います。
仕事仕事と連呼されていますが、一流のコードはこうなっているというのを示しましたよね?
あれを見てもあなたの「仕事」が偏っていると思いませんでしたか?
『今しか見えない』おばかさんが何か言っていて読む気も起きません。
また、時間を無駄にしてしまった。
こちらを愚直にリファクタリングするならこんな感じでしょうか。
普段Pythonは書かないので、文法が変だったらすみません。
時代は早期リターンだと思っているので、一番最後に影響する条件が一番厳しい条件だろうという考えのもと、最後の条件を一番上に持ってきます。
再び最後の条件を上に持ってきますが、早期リターンより上にならないようにします。
この理由がうまく言語化できない……
もうフラグはいらないよね?
全部の条件式に
year % 4 == 0
が入ってる……ということは、これにあてはまらないなら結局False
になりますね。こんな感じでしょうか。
@ashworth さん、
ルールが変わらないであろう閏年の判定と、仕様変更がある前提の案件とでケースバイケースで判断できない方であることは理解しました。
もそうなのですが藁人形論法で他人を批判するのは少しは考えられたら良いと思います。ちょっと恥ずかしいですよ。
@ashworth さん、
その前提とするとこの記事のコードは
ことを利用し、400の倍数か? から判定するロジックになってますが、4や100や400の値が仕様変更で別の数字になった場合、コード中のそれらの値を変更された値に書き換えたとしても正しく判定されるとは限らないので宜しくないですね。噛み付く先を間違えてはいませんか?
@fujitanozomu
それ、あなたの感想ですよね。あなたが恥ずかしいです。
@fujitanozomu
ごめんなさい、誰のどんな発言に対して何を言っているのですか? 論旨が良く分かりません。
あなた、頭大丈夫ですか? 冷静になってからコメントをお願いします。
頭おかしい人しか居ないのかなぁ…?
@jintz
んー…。
なんかひたすら難しい事をやっていますけど、私、上で言いましたよね?
「ただし」がある場合は仕様を逆算すればいいだけですよって。
意味分からなかったのかなぁ?????
というか、仕事で本当にプログラミングしているんですか?
たまたま5chを見たらひたすらストーカーしている変な人が居るし…。
だから正常な社会生活を営めないプログラミングしか能の無いオタクと関わるのは嫌になるんですよ。
普通に前向きに、社会に役に立つプログラミング技術とはどういう物なのか考えられないんですかねぇ? 発達障害のアスペルガーの人達は。
@Zuishin
日本語大丈夫ですか? あなたの立場でそういうことを言うなら「汎化の意味をどのように定義していますか?」でしょう???
どうとらえていますか?って…。 あきれ果てて言葉も出ないです。
私が汎化って言っているのは、「何も閏年問題に限った話ではなく、複雑な条件分岐が必要な命題が出された時にどういう風に問題解決するのか?という解法として捉えてくれ」と言っています。
だから論理演算子で延々と横に繋げていくのはバカげている、という話をしている…、
…という事すら理解できない方々が、社会生活において業務でプログラミングコードを書いている事に恐怖を覚えます。頭がおかしい。
もう少しまじめにやってくれませんか? 仕事とは、あなた達のスペルマをぶちまける場所ではありません。
多分、これが仕様書か基本設計書に書かれるんですよね。
そうしたら、この仕様に沿った形でコード書かないと。
なんであなた達のスペルマコード書いちゃうんですか?
まじで頭おかしいです。社会に出た事無いんですか?
知ってますけどね、社会の公共の場でスペルマぶちまけちゃう頭のおかしいプログラマが沢山いる事。
だからプログラマはどこでも地位が低くてあんまり尊重されていない事。
ほんと迷惑なんですよね。
もうちょっと、まじめにやってください。
たくさん書けてえらい。
@Zuishin
何主張なのかわかりませんけど、お疲れ様です。
かなりストレスがたまっているようなので、ほめてみました。
これで少し落ち着かれたら幸いです。
ハッキリ言わないと分からないみたいなので敢えて言いますが、
この記事って、「プログラミングが出来ないのはどういう理由なのか?」というところの記事で、「閏年問題」はあくまでもそれを紐解くための1題材に過ぎないんですよね。
なのに
@fujitanozomu
は、まるで「閏年問題こそ全てだ!」と言わんばかりに主題と全く関係ないのにカルノー図を持ち出して
こう書けます!!とか悦に入って書き始めて、本当にあなた、なにやってんの? って話です。元の記事の主旨分かってないんですか?って。
そんな話、してないでしょ?
プログラミングが出来ない人は「こういう風に考えてしていけばいいんですよ?」っていう記事です。
それに対して「俺様すげー」っていうスペルマをぶちまけてしまう。もう、完全な病気です。本当に、もう一回この元の記事とあなた @fujitanozomu のコメントを読み返してくれませんか? 狂気じみています。
5chを覗いたらまだ頭のおかしい人が必死に粘着していたんですけどね、
あなたたち、頭がおかしいからもうちょっと冷静になった方がいいんじゃないですか?
色々みてますけど、 @Zuishin て人は基本的に煽りと荒らししかしてないし。
何やってるんでしょうね、この手の人たち。
はい、頭のおかしい人がまたなんかわけのわからない事を言っています。
Qiitaはこういう頭のおかしい人を放置なんですね。
@Zuishin という人、あちこちで問題ばっかり起こしてるけど、
社会人としてまともに仕事が出来ているのだろうか?
ネット弁慶ならまぁ、できることはできるんだろうけど。
5ch観に行ったら
とか、書いてありましたけど、
あなたたたちみたいなクズのこと、誰もまともに相手にしてませんよ?
頭大丈夫ですか?
大体、今そこ2chじゃないでしょ? 本当に頭悪い人達だなーって思いました。
私じゃなくて「あなたたち」が、必死にQiitaを見てあれやこれや難癖付けてるだけでしょ?
本当にバカな人たちだと思います。
普通にQiitaに対する営業妨害行為ですね。
さすが5chのクズネラー達です。
ちなみに、こちら
5chのクズたちは、こういう風にQiitaの記事をやり玉に挙げて根も葉もない事をあーだこーだ言って、
よろこんでるみたいです。
本当にバカですね。
@osorezugoing さん、
惜しいと思いますがこうだと思います。
@fujitanozomu
あなた、何年コード書いているんですか?
@fujitanozomu さんが、どうして変なコードばかり書いているのかわかりました。
Cが得意だからですね。
だから、いまだにMISRAの流儀に従ってコードを書いているんだ。
もはや、呪縛ですね、それは。
@fujitanozomu
だからUnitTestという物があります。
カルノー図を用いたあなたのやり方で、まともなUnitTestが出来ますか? 出来ないでしょう?
噛み付く先を間違えているのはあなたではありませんか?
@error_401
人生全部無駄にしている人が何を今更…。