並べ替え
勝部 麻季人さんのプロフィール写真

■退屈に耐えられない
単純に最初に覚えることが多いからですね。

人間は興味のないことを延々と学習すると、苦痛を感じる生き物のようです。学校の授業で興味のない教科は眠くなりませんでしたかw? 強い動機付けがされており、明確な目標や目的があれば途中経過が退屈だったとしても耐えることができますが、それすらないと最早生き地獄です。

プログラムはある程度のレベルの物が書けるようになるまで、基本的な文法や実行方法など最初に覚えなくてはならない「作法」が大量にあります。この退屈な時間を乗り越えられるかがマスター出来るかどうかの別れ目ではないでしょうか。

中にはこの作法を覚える過程ですら楽しいと思える人がいますが、そういった人は吸収も早いです。私がこのタイプで今も昔もプログラムはオモチャだと思っています。中学生の頃ちょっと動かしただけで当時は興奮していたのをよく覚えていますw

■脳内でイメージできない
プログラムは予め脳内で様々な事をイメージし、そのイメージをキーボードを通して出力する作業です。このイメージが非常に重要で、まず最初に全体像や構造がどうなっているか頭の中でパズルや積み木を組み上げるように作っていきます。そのあとで積み木の角度はどうなっているか、どんな色や形をしてどう組み合わさっているか細部をひたすらコードという形で表現します。もちろん途中で行き詰まったり問題が起きたら組み直す作業も生じます。

■退屈に耐えられない
単純に最初に覚えることが多いからですね。

人間は興味のないことを延々と学習すると、苦痛を感じる生き物のようです。学校の授業で興味のない教科は眠くなりませんでしたかw? 強い動機付けがされており、明確な目標や目的があれば途中経過が退屈だったとしても耐えることができますが、それすらないと最早生き地獄です。

プログラムはある程度のレベルの物が書けるようになるまで、基本的な文法や実行方法など最初に覚えなくてはならない「作法」が大量にあります。この退屈な時間を乗り越えられるかがマスター出来るかどうかの別れ目ではないでしょうか。

中にはこの作法を覚える過程ですら楽しいと思える人がいますが、そういった人は吸収も早いです。私がこのタイプで今も昔もプログラムはオモチャだと思っています。中学生の頃ちょっと動かしただけで当時は興奮していたのをよく覚えていますw

■脳内でイメージできない
プログラムは予め脳内で様々な事をイメージし、そのイメージをキーボードを通して出力する作業です。このイメージが非常に重要で、まず最初に全体像や構造がどうなっているか頭の中でパズルや積み木を組み上げるように作っていきます。そのあとで積み木の角度はどうなっているか、どんな色や形をしてどう組み合わさっているか細部をひたすらコードという形で表現します。もちろん途中で行き詰まったり問題が起きたら組み直す作業も生じます。

さらにこのイメージは処理が進むにつれ変化を遂げます。プログラムの実行当初と終了時では形が変わっていることがほとんどです。

このように目に見えない、形の無いものをイメージし状況に応じて柔軟に変化させることが出来ないと非常に難しい行為と言えます。もちろん目に見えるようにノートなどに落書きしても良いのですけどねw (実際に落書きする人は多いですし、打合せではホワイトボードが大活躍します)

例えるなら小説を書いているような物でしょうか。小説もまずは全体の構造が分かるようあらすじや登場人物をまとめたプロットを作成します。これをもとに脳内で登場人物を動かし、シーンに合わせて舞台装置を用意、その有様を言葉にするわけですがプログラムはもそれと似ています。

ですので、昔から頭の中で色々な事を空想するのが好きだった人や明確なイメージを脳内で生み出せる人は習得が早く向いているといえます。もう少し身近な例だと地図を読める人も才能がありそうですね。逆にこれらが苦手な人にとってプログラミングは『重労働』だと思います。

伊勢山 剛さんのプロフィール写真

これ、難しくないで切り捨てちゃうのってあかんですよね。
「書ける人」からすると、まぁ直感的にそうなるよなとしか言えないんですが。

世の中の「ほとんどの人」はプログラミングどころかEXCEL関数すら使いこなせません。
SUMで合計出して「EXCELマジやばくね?」ってなるのがごく平均的なレベルでしょう。

たぶんなんですけど、短期記憶力とその使い方に依存してるんだと個人的に思います。

  1. これからやろうとすることを考える・確認する
  2. そのために必要なもの(要件、実現手段)は何か調べる
  3. そのために何が使える(関数、クラス、APIなど)か調べる
  4. 今あるものは何があるか調べる
  5. あればそれを改修すればいいのか、それとも新たに作るか考える
  6. 2~5を踏まえて、実装する
  7. 1の目的が達成できたか検証して必要に応じて再度2~6を行う

6の時点で2~5で何やったか覚えてないといけないし、なんなら弄る以外の部分も全体的にざっくり頭に入っていないとなにがなんだかわからなくなってしまいます。
「とりあえず」でスタックしておかないといけない情報がとにかくごちゃごちゃしてる。

逆を言うと、プログラマの頭の中ではこれらは雑多ながらも既に整理されていて、1時間かけて書いたプログラムがファイル破損などでロストした場合でも、再度書き直すときには10分くらいで復旧できた、という経験のある人も多いと思います。

また、この作業の流れは、一つの小目標に対して性

これ、難しくないで切り捨てちゃうのってあかんですよね。
「書ける人」からすると、まぁ直感的にそうなるよなとしか言えないんですが。

世の中の「ほとんどの人」はプログラミングどころかEXCEL関数すら使いこなせません。
SUMで合計出して「EXCELマジやばくね?」ってなるのがごく平均的なレベルでしょう。

たぶんなんですけど、短期記憶力とその使い方に依存してるんだと個人的に思います。

  1. これからやろうとすることを考える・確認する
  2. そのために必要なもの(要件、実現手段)は何か調べる
  3. そのために何が使える(関数、クラス、APIなど)か調べる
  4. 今あるものは何があるか調べる
  5. あればそれを改修すればいいのか、それとも新たに作るか考える
  6. 2~5を踏まえて、実装する
  7. 1の目的が達成できたか検証して必要に応じて再度2~6を行う

6の時点で2~5で何やったか覚えてないといけないし、なんなら弄る以外の部分も全体的にざっくり頭に入っていないとなにがなんだかわからなくなってしまいます。
「とりあえず」でスタックしておかないといけない情報がとにかくごちゃごちゃしてる。

逆を言うと、プログラマの頭の中ではこれらは雑多ながらも既に整理されていて、1時間かけて書いたプログラムがファイル破損などでロストした場合でも、再度書き直すときには10分くらいで復旧できた、という経験のある人も多いと思います。

また、この作業の流れは、一つの小目標に対して性質の違ったいくつかの作業を行い、メインの作業の流れに再び戻る、いわば脱線の繰り返しだったりします。
レシピを書きながら料理を作る料理中に材料が必要になるたびに都度スーパーに買いに行くような作業です。

そして、この小目標は他の小目標と共に上位の中目標を実現するためのものであり、さらに言えば、この小目標を実現するためにさらに小目標を設定してそれに対しても1~7をする事になります。

この、多重に階層化された作業の流れの迷路のなかで、「ほとんどの人」は自分が今どこにいてなぜここにいて次にどこに戻ればいいのか迷子になって思考停止してしまうのかと思います。

料理の喩えを見てわかるとおり、プログラミングという作業の一番の特異性は、段取りと実作業が完全に分離できない事とそれによる繁雑さにあると思います。

スイトさんのプロフィール写真

歴史が浅く、教育ノウハウが確立されていないからです。

プログラミング経験どころかパソコンすら持っていない新人にプログラミングを教えた経験から、私は教え方次第で誰にでもプログラミングができるようになると考えています。

Wikipediaのプログラミング言語年表を見ますと、C言語ですら半世紀の歴史しかありません。次々に新しい技術や手法が出てきていることも踏まえると、この短い期間で教育のノウハウが成熟するわけがありません。

"良き教育者"に求められるのは「プログラミングの知識」と「教育技能」です。今現在の世に出ているプログラマーは「本当に適性のある人たち」と「適性のある人たちから学ぶ(真似る)能力のある人たち」がほとんどで、新しい技術をキャッチアップすることに長けた人たちです。

逆に、高い教育技能を身に付けた人はほとんどいません(私見です)。プログラミングスクールというものもありますが、学校や予備校などの教育組織に比べれば教育技能やシステムのレベルはまだまだ低いようです。

良き教育者が不在な現状では、普通の人が勉強すると「プログラミング=難しいもの」という感じになってしまうのも仕方ありません。

今はまだ過渡期です。

まだまだ技術の盛衰が激しいので、教育ノウハウとして確立されるのはまだ先の話かもしれません。ただ、プログラミングという存在そのものが世間に認知されてきている(今までは認知すらされていなかった

歴史が浅く、教育ノウハウが確立されていないからです。

プログラミング経験どころかパソコンすら持っていない新人にプログラミングを教えた経験から、私は教え方次第で誰にでもプログラミングができるようになると考えています。

Wikipediaのプログラミング言語年表を見ますと、C言語ですら半世紀の歴史しかありません。次々に新しい技術や手法が出てきていることも踏まえると、この短い期間で教育のノウハウが成熟するわけがありません。

"良き教育者"に求められるのは「プログラミングの知識」と「教育技能」です。今現在の世に出ているプログラマーは「本当に適性のある人たち」と「適性のある人たちから学ぶ(真似る)能力のある人たち」がほとんどで、新しい技術をキャッチアップすることに長けた人たちです。

逆に、高い教育技能を身に付けた人はほとんどいません(私見です)。プログラミングスクールというものもありますが、学校や予備校などの教育組織に比べれば教育技能やシステムのレベルはまだまだ低いようです。

良き教育者が不在な現状では、普通の人が勉強すると「プログラミング=難しいもの」という感じになってしまうのも仕方ありません。

今はまだ過渡期です。

まだまだ技術の盛衰が激しいので、教育ノウハウとして確立されるのはまだ先の話かもしれません。ただ、プログラミングという存在そのものが世間に認知されてきている(今までは認知すらされていなかった)ので、これから良き教育者がたくさん現れる時代になるでしょう。そのうち「プログラミング界の林修」のようなカリスマ性のある教育者も出てくるかもしれません。

ゆくゆくは「英語って難しいよね」と同程度の感覚で「プログラミングって難しいよね」と言える日が来ると信じています。信じたいですね。


では、現状のプログラミング教育で何がそんなに「プログラミング=難しいもの」と思わせてしまうかについてです。

これは間違いなく、基礎知識の説明不足です(もし独学なら勉強不足です)。

新人教育をする際、自分でもプログラミングの学習書をいくつか読んでどのように教えればいいか方針を練りましたが、私が読んだ限りでは、算数でいう「1+1」を飛ばして(あるいはおざなりな説明で)「7×4」とかからスタートしているような本が多かったです。あるいは英語の学習で「a, b, c, ...」を教える前に「My name is ...」を教えているようなものになってしまっています。

プログラミング初学者は、パソコンの中身がどうなっているのか知りません。エラーが出たときのメッセージの読み方も知りません。プログラマーならだれでも知っているような、ごく簡単な単語ですら意味を理解できません。

これらの知識はいざ問題が起こったときの解決の足掛かりとなる大事な知識です。この知識をおざなりに学習させる(する)から、問題解決に行き詰まる不幸な学習者がたくさん出てしまうのです。

「基礎知識が多すぎて全部教えてたらキリがない」って?

それをどこで線引きしてどう体系化するかがこれからの課題ってことです。

Quora Userさんのプロフィール写真

既に多数の回答がありますが別視点から。

人間同士のコミュニケーションはハイコンテクスト、言い換えると空気読んでくれるけどプログラミングは徹底的にローコンテクストだからです。

人間同士なら、何かお願いする時に気心が知れた仲なら「あれお願いね」で済んでしまいます。そこまで行かなくても一から十まで説明することはまず無いですし、それを求める人は頭が悪い扱いされてしまいます。

でも、コンピュータ相手には文字通り一から十まで説明しないと動いてくれません。逆にそのおかげで誤解も無いので100回やらせると100回きっちり同じ結果を返してくれるという良さもあるのですが。

で、このコンテクストを下げていく作業が得意な人と苦手な人ははっきり分かれます。コンテクストを下げるというのは、

「ケーキ作ってね」を、

「材料を用意して適切な順番で混ぜて焼いて飾りつけをする。」に分け、更に、

「材料を用意するとは、、、」「適切な順番とは、、、」と作業をどんどん単純な物の組み合わせに分解していく作業です。

究極的にはそれをISAと呼ばれる単語の組み合わせでまで落とす必要があります。例えば最近人気のRISC-Vというものではこんな感じ

これしか受け入れてくれません。ただ、ここまで落とし込むのはあまりに大変なのでプログラミング言語が開発されました。そのおかげで上の単語よりは大分コンテクストが高いレベルでも記述できるようになりましたが

脚注

既に多数の回答がありますが別視点から。

人間同士のコミュニケーションはハイコンテクスト、言い換えると空気読んでくれるけどプログラミングは徹底的にローコンテクストだからです。

人間同士なら、何かお願いする時に気心が知れた仲なら「あれお願いね」で済んでしまいます。そこまで行かなくても一から十まで説明することはまず無いですし、それを求める人は頭が悪い扱いされてしまいます。

でも、コンピュータ相手には文字通り一から十まで説明しないと動いてくれません。逆にそのおかげで誤解も無いので100回やらせると100回きっちり同じ結果を返してくれるという良さもあるのですが。

で、このコンテクストを下げていく作業が得意な人と苦手な人ははっきり分かれます。コンテクストを下げるというのは、

「ケーキ作ってね」を、

「材料を用意して適切な順番で混ぜて焼いて飾りつけをする。」に分け、更に、

「材料を用意するとは、、、」「適切な順番とは、、、」と作業をどんどん単純な物の組み合わせに分解していく作業です。

究極的にはそれをISAと呼ばれる単語の組み合わせでまで落とす必要があります。例えば最近人気のRISC-Vというものではこんな感じ

これしか受け入れてくれません。ただ、ここまで落とし込むのはあまりに大変なのでプログラミング言語が開発されました。そのおかげで上の単語よりは大分コンテクストが高いレベルでも記述できるようになりましたが、それでも「あれお願いね」には程遠いです。

パワハラ上司のような「それを考えるのがお前の仕事だ」的な人はこういうのは苦手でしょう。オタクのような一つ質問したら聞いてもない細かいところまで延々話し出すような人は向いていると思います。

生成AIがこの辺のサポートをしてくれるようになりつつあるように見えるので、AIが仕事を奪うとか言われていますが、むしろ逆にAIのお陰でプログラマの人口が拡大するかも、という淡い期待を抱いています。

脚注

Quora Userさんのプロフィール写真

色々有りますが、その中で特に「これだ」と私が思うのは、

「プログラミングでやりたい事をイメージする」事と、「そのイメージを実装する」事との乖離が大きい

という点ではないかと……。

初学者であっても、複雑で多機能なソフトウェアをイメージする事は出来ます。 しかしそれを実際に実装するとなると、とても面倒です(この点は、他の創造的な分野、たとえば絵画制作や作曲編曲、建築などにも共通している事だが)。

たとえば twitter がどんなものかをイメージするのは——つまり、何が起これば twitter はどういう挙動をするのか、である——、たとえプログラミングを学んでいなくたって、多くの方にとっては難しくは無いでしょう。
もしそれが難しかったら、こんなに多くの人が twitter を使う事は出来ないはずです。

しかしそれを実際にゼロから実装するとなると——規模を小さくしたり、機能を絞ったとしても、最低限度「twitter と呼べるもの」を実装するとなれば——、かなり多くの事柄について、たとえばデータについてだけでも、持つべきデータの種類、データ間の関係、データが変更される契機とタイミング、データの正しさの保証、それらデータの持ち方、……等々を決めてゆく必要があるわけで、データ設計だけでもかなり面倒だ、という事は、プログラミングを学び始めた方でもお分かりでしょう。

つまり、「プログラミングが難しい理由」と

色々有りますが、その中で特に「これだ」と私が思うのは、

「プログラミングでやりたい事をイメージする」事と、「そのイメージを実装する」事との乖離が大きい

という点ではないかと……。

初学者であっても、複雑で多機能なソフトウェアをイメージする事は出来ます。 しかしそれを実際に実装するとなると、とても面倒です(この点は、他の創造的な分野、たとえば絵画制作や作曲編曲、建築などにも共通している事だが)。

たとえば twitter がどんなものかをイメージするのは——つまり、何が起これば twitter はどういう挙動をするのか、である——、たとえプログラミングを学んでいなくたって、多くの方にとっては難しくは無いでしょう。
もしそれが難しかったら、こんなに多くの人が twitter を使う事は出来ないはずです。

しかしそれを実際にゼロから実装するとなると——規模を小さくしたり、機能を絞ったとしても、最低限度「twitter と呼べるもの」を実装するとなれば——、かなり多くの事柄について、たとえばデータについてだけでも、持つべきデータの種類、データ間の関係、データが変更される契機とタイミング、データの正しさの保証、それらデータの持ち方、……等々を決めてゆく必要があるわけで、データ設計だけでもかなり面倒だ、という事は、プログラミングを学び始めた方でもお分かりでしょう。

つまり、「プログラミングが難しい理由」とは、たくさんの面倒な事柄をひたすらに積み上げてゆかねば実装が出来ない、という事だと私は考えるのです。

言い方を換えるならば、実は難解な事は何ひとつ無いのだけれども、とにかく面倒過ぎるので、それが「難しい」と捉えられるのでしょう。

コンピューターという機械は、かつて人類が作り上げてきた機械の中でも、複雑な部類に入ると私は思っておりますが、その基本的な機能を実現する仕組みは、1つ1つを取って見ればきわめて単純で簡単なものです。
しかし、単純で簡単な要素を、膨大な個数組み合わせて、大量に積み重ねた結果、コンピューターは複雑な機械になっているのです。

プログラミングもそれに似ていて(※1)、目指すモノを作り上げるには、ひたすら面倒な事をやり続けなければなりません。

複雑さと難解さは必ずしも同一ではありませんが、
「複雑な物事は、その全てを正しくやろうとする事、それが難しい」のです。


※1 コンピューターにおけるソフトウェアとハードウェアは、どちらも「論理機械」であるという点では同一である。 両者は、論理機械としての動作を、ハードウェアで実装しているか、ソフトウェアで実装しているかの違いしかない。 だからこそ「ソフトウェアをハードウェアで実装して高速化」なんて事が出来るし、逆の事をやれば「仮想化」が出来るのである。

藤沢 坂井 瞭介さんのプロフィール写真

思った通りに動かないし、思ってたとの違うからでしょうね・・・

https://off.tokyo/blog/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e3%81%af%e9%9b%a3%e3%81%97%e3%81%84%e3%80%82/

思った通りに動かないし、思ってたとの違うからでしょうね・・・

https://off.tokyo/blog/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e3%81%af%e9%9b%a3%e3%81%97%e3%81%84%e3%80%82/
Endo Yujiさんのプロフィール写真

まず、エンジニアに必要な要素を考えた時、以下のようなものがあるかと思います。(もっともっとありますが本題ではないので思いついたものを…)

・専門知識の幅広さ、深さ

・インプットに必要な情報の検索力、読解力

・変化への対応力、柔軟性

・常に求められる論理的思考力、問題点解決力

・関係者とのコミュニケーション力

・尽きない興味心と探究心

・挫けない忍耐力

エンジニアという職業は、ハードスキル・ソフトスキル含めて、とにかくキャッチアップすべきインプットが多く、幅広く、深さもある。更にインプットをアウトプットに変えてモノとして完成させなければならない。そういった職業だと捉えています。プログラミングはその内の一要素に過ぎないのですが、根幹の部分でもあります。

ここから本題です。実務でもそうですが、散見されるのが「学習ハードルの高さによる挫折」です。実際、あるプログラミング初学者は「難しいプログラミング学習」に挫折し「手早く作れるノーコード」へ行き着いたようです。(これは非難ではなく、興味深い事実です)

プログラミングして行くとおおよそ次のような事象が起こると考えています。

・難しいこと、わからないことが多すぎる

・少し変えただけでエラーにつまずく、自力で解決できない

・自分が何をやってるかわからない、何がどうなってこう動くのか理解できない

・既存あるいは他人のコードが読めない、理解できない

・学習が進んだと思ったらまた別

まず、エンジニアに必要な要素を考えた時、以下のようなものがあるかと思います。(もっともっとありますが本題ではないので思いついたものを…)

・専門知識の幅広さ、深さ

・インプットに必要な情報の検索力、読解力

・変化への対応力、柔軟性

・常に求められる論理的思考力、問題点解決力

・関係者とのコミュニケーション力

・尽きない興味心と探究心

・挫けない忍耐力

エンジニアという職業は、ハードスキル・ソフトスキル含めて、とにかくキャッチアップすべきインプットが多く、幅広く、深さもある。更にインプットをアウトプットに変えてモノとして完成させなければならない。そういった職業だと捉えています。プログラミングはその内の一要素に過ぎないのですが、根幹の部分でもあります。

ここから本題です。実務でもそうですが、散見されるのが「学習ハードルの高さによる挫折」です。実際、あるプログラミング初学者は「難しいプログラミング学習」に挫折し「手早く作れるノーコード」へ行き着いたようです。(これは非難ではなく、興味深い事実です)

プログラミングして行くとおおよそ次のような事象が起こると考えています。

・難しいこと、わからないことが多すぎる

・少し変えただけでエラーにつまずく、自力で解決できない

・自分が何をやってるかわからない、何がどうなってこう動くのか理解できない

・既存あるいは他人のコードが読めない、理解できない

・学習が進んだと思ったらまた別なことを学ばなければならない、結局ずっと学習が続く、並行してモノを作らなければならない

・やっとできた成果物も「不具合」 と指摘され修正しなければならない、調査にまたインプットが必要になる

・技術文書は英語。日本語も難しい。(実際は読めるだけの前提知識が不足しているため難しく感じる)

そりゃ楽しくないですよね。(あ、私は楽しいですし好きですよ?)

「手早くモノづくりしたい」「アイデアを早く形にしたい」そういった人たちにとってはプログラミング学習が苦行になり得るようです。

勉強嫌いな人は続かないかもしれません。嫌なことから逃げ出したくなる人もそうかもしれません。「楽をするためのプログラミングは苦労しないとできない」ということを受け入れられない、あるいは乗り越えられない人たちが一定数いるようです。

最近では「エンジニアは気軽になれる・稼げる」が売り文句みたいになってる風潮がありますが、結局は専門職であり職人なんだと思うんです。

常に技術は進化しますし、需要も変わり、ノーラーニングでは決して続けられません。どんどん置いていかれます。そこに健全な危機感を持って追従を保てれば良いですが、憂鬱になるとメンタルリスクも上がります。仕事ではそこに人間関係も絡むので、更にカオスです。

プログラミングを論理の設計・構築・実装と抽象化して捉えるとしても、思考し続けることが苦な人には耐えがたい行為ではないかなと思います。

Yako Tsukadaさんのプロフィール写真

プログラミングまでたどり着くのが異常にむずい

プログラミングにはレベルがあり求められるスキルは全く違います

  1. プログラミング環境を作る(Hello World!)
  2. シンタックスを理解する
  3. ライブラリを調べて使う
  4. クラスを作る

ざっとこんな感じなのですが実は1が一番辛いと思っています。もしかしたら今は情報があるのかもしれませんが私が学生の頃、プログラミングを始めるためにはコンパイラのインストールやエディタのセットアップをする必要があり、コンピュータのことを何も知らなかった私はハローワールドまで1週間を費やしました。

↓こんな感じです

  1. Install v0.102 (x64) 
  2. Install v0.102 (x86) 

「ええと?このvなんとかってなんだろう?それにx64とか。。64bitのことかな。でも86bitのコンピュータなんてないしな。。。一体どっちをインストールすればいいの??

パスを通して使ってください

「パスって何??」

逆に環境設定まで終わればそこまで難しいものではないと思います。

Toru Ishiharaさんのプロフィール写真

BASICの頃から、プログラミング言語を理解できるのは10%と言われてきました。今でも、プログラミング・スクールでは、10人中9人はプログラミングを諦めるそうです。

プログラミング言語や開発環境が、全ての人に理解できるように出来ていません。10%の人が理解できれば良いようにデザインされています。全ての人が理解できるようすると、ヘルプなどが長くなり、不評となります。一番簡単なprint()の関数でも、万人向けに説明するのは無理です。

ブラウザ、エクセル、ワードなどは、全ての人が使えるようにデザインされています。トップページには、よく使う機能のボタンだけを表示するなど。

自動車運転は90%の人が理解できるように設計され、教習所でマニュアル化されています。理解すべき手順は、エンジン始動、ブレーキ、アクセル、ハンドル、ウィンカーなど5項目程度です。

セスナの飛行機操縦だと50%の人向けかな。10項目程度になります。戦闘機だと項目数が増えて、5%以下のスペシャリストしか理解できません。プロのパイロットだけが操縦できれば良いです。

プログラミングは10%向けです。

山本 聡さんのプロフィール写真

Hata Yujiさんの回答で、次のようにありましたが

・難しいこと、わからないことが多すぎる

これに尽きると思います。

見知らぬ言語で仕事をしはじめると、全くわからない状態になります。

私は JavaScript で React の仕事をいくつもしてきたので、それなりにその手のコードは読めるのですが、WordPress上のPHPとか、RailsのRubyとかみると細部が読めないためにさっぱりわからなくてコードの数行を理解するにもかなり時間がかかります。

また、慣れた言語であっても、世の中にあるWebページや書籍で紹介されているコードの書き方だけではなく

その仕事現場で誰かが書いた仕組みにそってコードを書く必要があり、それがより一層、物事を複雑にします。

自分で最初から作るならそれなりに迷いなく実装できますが、前任者が書いたコードを読み解いて、その上でルールにそってコードを書かなければならない、となる場合があります。前任者の思想や癖を相当理解しないとコードがかけなかったりします。

そもそも、前任者が完全に理解した上で書いているのか、前任者も苦しみながら混乱しつつ書いたのか、その前任者のスキルレベルはどうなのか、とか、そういうのがわからないで引き継いでコード書かなければいけなかったりして、それをを読み取らないとより全体的に統一された正しい改良・修正ができなかったりします。

こうなると、その思想などを読

Hata Yujiさんの回答で、次のようにありましたが

・難しいこと、わからないことが多すぎる

これに尽きると思います。

見知らぬ言語で仕事をしはじめると、全くわからない状態になります。

私は JavaScript で React の仕事をいくつもしてきたので、それなりにその手のコードは読めるのですが、WordPress上のPHPとか、RailsのRubyとかみると細部が読めないためにさっぱりわからなくてコードの数行を理解するにもかなり時間がかかります。

また、慣れた言語であっても、世の中にあるWebページや書籍で紹介されているコードの書き方だけではなく

その仕事現場で誰かが書いた仕組みにそってコードを書く必要があり、それがより一層、物事を複雑にします。

自分で最初から作るならそれなりに迷いなく実装できますが、前任者が書いたコードを読み解いて、その上でルールにそってコードを書かなければならない、となる場合があります。前任者の思想や癖を相当理解しないとコードがかけなかったりします。

そもそも、前任者が完全に理解した上で書いているのか、前任者も苦しみながら混乱しつつ書いたのか、その前任者のスキルレベルはどうなのか、とか、そういうのがわからないで引き継いでコード書かなければいけなかったりして、それをを読み取らないとより全体的に統一された正しい改良・修正ができなかったりします。

こうなると、その思想などを読み解くのが大変すぎて、ひどくわけわからない状態に放り込まれて1日中悩んでも何も成果がでない、という事もあります。結構つらいです。

人の書いた小説になんかしらの矛盾があったりするので引き継いで矛盾なく新しい要素を加味した上で素晴らしストーリーにしてくれ、とか言われてやりこなせる作家さんとか、そんな仕事あるのかどうか知りませんが、プログラマが要求されるのはそんな仕事が多いです。

極めて難しい仕事だと思います。

プログラミングをお仕事にしている、みなさん!

たぶんみなさんがんばって仕事されていると思います。自分もがんばります。

難しいけど、がんばってやっていきましょう!


追記
あと、前任者が難しく考えてしまっているって場合も多々ありそう。経験つむと物事を極力シンプルにとらえるようになっちゃうのかも。

他に書いていた記事と、ニュース記事リンクしておきます。

オブジェクト指向のプログラミングの問題点は何ですか? - Quora

オブジェクト指向のプログラミングの問題点は何ですか?

余計な「念のため」でプロジェクトが死に至る「オーバーエンジニアリング」の問題とは? - GIGAZINE

余計な「念のため」でプロジェクトが死に至る「オーバーエンジニアリング」の問題とは?
日本に「過ぎたるは及ばざるがごとし」ということわざがあるように、海外のソフトウェア開発現場でも製品が必要以上に複雑化してしまう「オーバーエンジニアリング」という現象がしばしば問題になります。そんなオーバーエンジニアリングの原因や影響、防止方法について、ボイスチェンジャーアプリの開発会社・Voicemodで主任プロダクトマネージャーを務めるシモン・ムニョス氏が解説しました。
Quora Userさんのプロフィール写真

いや、えーっと。

ジグソーパズルってあるじゃないですか。

1000ピースものの、絵によっては難度が違うカモですが、簡単とは言い難いじゃないですか?

1時間で仕上げてと言われると無理。とかいう人が多発すると思います。

野球でもパズルでもそしてプログラムでも同じなんです。

趣味でやりたいといった時のハードルはそれほど高くはありません。

しかし炎天下で野球したくない人もいれば、パズルしてても時間の無駄と思う人がいるように

プログラムに自分の時間を使うのはもったいないと思う人もいます。

ましてやそれを仕事にしようだなんて!と思う人もいます。

私はプログラマの道を選びましたが、ある日経理の人と話をしました。なんで毎日同じ仕事していて飽きないの?と、聞いた事があります。すると彼は答えました「最後1円までぴったりあったときが快感なんだよねぇ~」と。

なるほど。そういう楽しみがあるのか。私にはわからないけど、プログラムでいう「動いた」というのと同じ感情を抱くのでしょう。


なので。プログラミングが難しいのか?というと、それほど難しいわけではないと思います。

それは英語は難しいのか?というと日本語に比べたら桁違いに簡単だ。というのと同じ話で。

どう感じているか?それをどの程度必要としているか?どのくらい自分と馬があうのか?

そういったふるいを通り過ぎた人が少ないというだけで、難しいわけじゃないと思うなぁ。

Shiro Kawaiさんのプロフィール写真

「プログラミング」は、「文章を書く」みたいなものです。

文章を書くのは難しいですか? ツイッターに飯の内容を書いたり、Quoraでこうしてすぐ答えられそうな回答を書くのはさほど難しくありません。でも大勢の心を動かすような物語を書くのはとても難しいでしょう。

プログラムにも、プログラマが「使い捨てスクリプト」と呼ぶような、目下の面倒な作業をちゃちゃっと済ませるためにほとんど考えもせず書く数行のコードもあれば、どうやって解くのか見当もつかない問題にアプローチしようとするコードもあります。

プログラムが難しい理由その1は、「難しいのは解こうとしている問題の方だ」というものです。こちらは、人類の知が進んで問題の構造を明らかにしてゆかない限り、プログラミングそのものでどうにかなる話ではありません。漢字が難しいから全部ひらがなにしよう、とか、動詞の活用なんて面倒だから無くしちゃえ、としたって、小説を書くのは簡単にはならないでしょう?


ただ、その「解こうとしている問題」のひとつに、「プログラムの複雑性をいかにして制御するか」というものがあるのは確かです。「プログラミングをわかりやすくする」という問題そのものが、これまで情報工学でずっと取り組まれてきたにもかかわらず解決されていない、難しい問題なんです。(もちろん、「漢字は難しいからひらがなにすればいい」みたいな話はたくさんありました。でもそれでは解決にな

「プログラミング」は、「文章を書く」みたいなものです。

文章を書くのは難しいですか? ツイッターに飯の内容を書いたり、Quoraでこうしてすぐ答えられそうな回答を書くのはさほど難しくありません。でも大勢の心を動かすような物語を書くのはとても難しいでしょう。

プログラムにも、プログラマが「使い捨てスクリプト」と呼ぶような、目下の面倒な作業をちゃちゃっと済ませるためにほとんど考えもせず書く数行のコードもあれば、どうやって解くのか見当もつかない問題にアプローチしようとするコードもあります。

プログラムが難しい理由その1は、「難しいのは解こうとしている問題の方だ」というものです。こちらは、人類の知が進んで問題の構造を明らかにしてゆかない限り、プログラミングそのものでどうにかなる話ではありません。漢字が難しいから全部ひらがなにしよう、とか、動詞の活用なんて面倒だから無くしちゃえ、としたって、小説を書くのは簡単にはならないでしょう?


ただ、その「解こうとしている問題」のひとつに、「プログラムの複雑性をいかにして制御するか」というものがあるのは確かです。「プログラミングをわかりやすくする」という問題そのものが、これまで情報工学でずっと取り組まれてきたにもかかわらず解決されていない、難しい問題なんです。(もちろん、「漢字は難しいからひらがなにすればいい」みたいな話はたくさんありました。でもそれでは解決にならなかったわけです)。

ただ、問題の記述方法や解決方法がある程度わかっている分野、例えば「日頃から繰り替えしているPCの操作を自動化したい」みたいな部分では、昔に比べればはるかに簡単になっていると思いますよ。最近ではやってほしいことを自然言語で指示したらコードを出してくれるAIも出てきました

。既に解き方が分かっている問題であれば、どんどん簡単になってゆくのを期待できると思います。でも簡単になった後では、みんなそれを「プログラミング」とは思わなくなるかもしれませんけど。

脚注

えびぼんさんのプロフィール写真

理由は2つ思い浮かびます。

・プログラミングはその人にとって外国語なのに、主な習得時期は高校生以降である(遅すぎる)

・一字の誤字脱字、表現誤りも許されない

プログラムは言語と言われるだけあって、日本人にとって外国語に近い存在です。そして、プログラミング言語は母体を英語とする時点で、日本人にとってハンデです。英語を読めない人間が、英語を母体とする別の言語を習得しやすいかというと、ノーとしかいえません。一部のよくできる方を除いて、言語は0歳から初めてやっとネイティブになれます。英語ネイティブになった上でのプログラミング言語です。

私は田中芳樹が大好きで、銀河英雄伝説を愛読しています。彼の書く小説は一時期は飛ぶように売れたわけで、厳重な編集部のチェックが為されていたと想像されます。それでも、誤字脱字は、10巻も小説を書けば発生しています。

プログラミング言語は一字の誤字脱字、表現誤りも許されません。文章を書くという点において、プログラミング言語より難易度が高いものはありません。

Quora Userさんのプロフィール写真

ご質問文中の「ほとんどの人」を、「ほとんどの日本人」に置き換えて考えると、このご質問は

「ほとんどの日本人にとってロシア語の習得が難しいのはなぜでしょうか?」

という質問に似ています。

もちろんロシア人にとってロシア語は難しくないでしょう。 しかし日本人にとっては簡単とは言えません。 ロシア語がペラペラの日本人は確かにいるはずですが、誰もがそうなれるわけではなく、日本国民の総人口から見ればかなりの少人数でしょう。

なぜ、「ほとんどの日本人にとってのロシア語」の難しさが、「ほとんどの人にとってのプログラミング」の難しさと通じるのか……それは両方とも、

「自分の常識が通じない者に渡す『間違いなく意図した通りの事をやってもらう手順書』を、母国語でない言語を使って書く」

という能力の修得を目指すからです。

そこには、自分の育った文化や常識の入り込む余地が無いため、「常識で考えたらそんな所まで言わなくても分かるだろう」という考えが全く通用しません。 そのため、やってもらいたい事は、全て過不足無く細かいところまで間違いのない指示をきっちり書かねばなりません。 しかも母国語で無い言語を使って。

「プログラムは考えた通りに動くのではなく、書いた通りに動く」

というプログラマーの格言は、この難しさをよく言い表しています。

また、このようなプログラミングの本質的性質により、自分が作り込んだバグを自分が見つける事は往々にし

ご質問文中の「ほとんどの人」を、「ほとんどの日本人」に置き換えて考えると、このご質問は

「ほとんどの日本人にとってロシア語の習得が難しいのはなぜでしょうか?」

という質問に似ています。

もちろんロシア人にとってロシア語は難しくないでしょう。 しかし日本人にとっては簡単とは言えません。 ロシア語がペラペラの日本人は確かにいるはずですが、誰もがそうなれるわけではなく、日本国民の総人口から見ればかなりの少人数でしょう。

なぜ、「ほとんどの日本人にとってのロシア語」の難しさが、「ほとんどの人にとってのプログラミング」の難しさと通じるのか……それは両方とも、

「自分の常識が通じない者に渡す『間違いなく意図した通りの事をやってもらう手順書』を、母国語でない言語を使って書く」

という能力の修得を目指すからです。

そこには、自分の育った文化や常識の入り込む余地が無いため、「常識で考えたらそんな所まで言わなくても分かるだろう」という考えが全く通用しません。 そのため、やってもらいたい事は、全て過不足無く細かいところまで間違いのない指示をきっちり書かねばなりません。 しかも母国語で無い言語を使って。

「プログラムは考えた通りに動くのではなく、書いた通りに動く」

というプログラマーの格言は、この難しさをよく言い表しています。

また、このようなプログラミングの本質的性質により、自分が作り込んだバグを自分が見つける事は往々にして易しい事では無い、という事柄が導かれます(人間が常識や先入観を完全に捨てる事は難しいから※)。 この事は多くのプログラマーが経験的事実として知っているでしょう。


※ ただしそれを少し易しくする手段は有る。 たとえば「他人に見てもらう」とか、「日数を置いて再び見る」とかである。 いずれも「『その時』における自分の認識を捨てて見る」という手段である。

Quora Userさんのプロフィール写真

プログラミングは解法がいろいろあります。

だから、求められたことを解決する手段は多くあり、その中でシステムにとっての効率、あるいは後々のメンテナンス性などを考慮して最適の解を求めるには多くの経験を必要とします。
 それは、単なる知識では出来ない問題解決力を求められる応用の集まりだからです。 数学の数式を解くことは公式がわかれば出来ることですが、プログラミングは文章問題を解くことであり、その問題が何を問うているのか、そのためにはどういった方法を用いれば良いのかと言うことを考える必要があり、それは公式を知っていても出来ることではなく、また一つの公式だけではなく、色々な物を組み合わせて解を求める必要がある故に対象に関する広範な知識と多くの方法を知らなければなりません。

また、公式化されていないような問題については、その解法を考えて実現する必要があり、それは研究的な側面も持ちます。

だから、基礎的なプログラミングの習得は容易であっても、実践的なプログラミングの習得は難しいことなのです。

宮川 大輔さんのプロフィール写真

4段階で説明してみます。

1: 人間があまり得意ではない「厳密な論理」でまず考える必要がある

「いい具合にしといて」という指示が効きません。「いい具合」を厳密に定義してあげるか、あるいは数学・統計学の文脈で「誤差〜〜で」のようにちゃんと指定してあげる必要があります。「思ったように」ではなく(プログラムを)「書いたとおりに」実行されるため、人間への指示とは根本的に違うアプローチを要求されます

2: 機械の都合に合わせる必要があり、理想的な数学的世界を記述しきれない

「厳密な論理」ということであれば言ってみればある種の数学の記述通りに動作してくれればまだ良いのですが、「CPU」「メモリ」「ディスク」のようなハードウェアや、隙間のない「実数」をプログラムでは表現できないといった制約によって、1番で一度要求された「厳密な論理」をさらに、ある意味で「めっちゃ不完全」な「コンピュータ」の言葉に翻訳する必要が生まれます。

0.00…1のような小さい数字と同様の小さい数字を割ったりすると理想的な実数では起きないようなことが起きます。コンピュータの部品は完全に壊れたり、中途半端に壊れたり、宇宙線でデータの中身が入れ替わったりします。

3: 1番と2番の「人間の脳と理想世界とコンピュータのギャップ」を埋めるツール群がまだ十分でない

昔よりも「プログラミング」を行う人を助けるツールについて大きく進んでいると思います。

4段階で説明してみます。

1: 人間があまり得意ではない「厳密な論理」でまず考える必要がある

「いい具合にしといて」という指示が効きません。「いい具合」を厳密に定義してあげるか、あるいは数学・統計学の文脈で「誤差〜〜で」のようにちゃんと指定してあげる必要があります。「思ったように」ではなく(プログラムを)「書いたとおりに」実行されるため、人間への指示とは根本的に違うアプローチを要求されます

2: 機械の都合に合わせる必要があり、理想的な数学的世界を記述しきれない

「厳密な論理」ということであれば言ってみればある種の数学の記述通りに動作してくれればまだ良いのですが、「CPU」「メモリ」「ディスク」のようなハードウェアや、隙間のない「実数」をプログラムでは表現できないといった制約によって、1番で一度要求された「厳密な論理」をさらに、ある意味で「めっちゃ不完全」な「コンピュータ」の言葉に翻訳する必要が生まれます。

0.00…1のような小さい数字と同様の小さい数字を割ったりすると理想的な実数では起きないようなことが起きます。コンピュータの部品は完全に壊れたり、中途半端に壊れたり、宇宙線でデータの中身が入れ替わったりします。

3: 1番と2番の「人間の脳と理想世界とコンピュータのギャップ」を埋めるツール群がまだ十分でない

昔よりも「プログラミング」を行う人を助けるツールについて大きく進んでいると思います。それこそ、今のPCは昔のスパコンを凌駕する性能を持ちますので、印刷した紙の上で「レビュー」するといった必要もなくユニットテストを書いて都度実行できますし、人間が分かりやすいように「このプログラムは危険な匂いがします(「匂い」にはコンピュータが分かるルールが定義されている上で)」と伝えてくれるツール群まで発達しました(例えば「統合開発環境(IDE)」なんてのは昔からするとすごいものなのではないかと思ったりします)。

極論するとExcelもまたそのようなギャップを埋めるツールであり、ある種の普通の人々が対応しなければならないプログラミングはむしろ「簡単」になっているものもあるようにも思えます(例えばアンケート調査とその集計とか)。

しかし、1番と2番を根本的に人間が無視できるほどにはツールは有能になっていませんし、問題領域によってはなれる見込みがあまりありません。そのため、以下に述べる4番とセットで誰もが「簡単」と思う段階になっていないのだと思います。

4: どんどん異なる要素が「プログラミング」という言葉に詰め込まれてきており、その状況が加速している

エニグマ暗号解読の時代からすでに「難しい」世界のはずですが、今は更にそれに加えて「世界中の異なる文化圏に属するユーザに配慮する」であるとか「ペタバイト〜エクサバイトのデータを処理する」であるとか、要求がどんどん上がっているという側面もあると思います。CPUの周波数を上げれば良いという時代も、発熱がヤバすぎてとうの昔に終わっているため、以前であれば単一プロセスに丁寧にロジックを書けばよかったのが人間がおそらく不得意とする並列プログラミングを前提にしないと速度が上がらないなんていうのも関係しているかもしれません。

さらに、数学・計算機科学の領域だけでなく、最近は現実のユーザに配慮することまで「プログラミング」の仕事に含むことがあります。そうなるとデザイン・アート、経済情勢、国際情勢(リアルタイムのサイバー攻撃に強いサービスを作る)など、人間が触れるありとあらゆる側面が総合して「プログラミング」を取り囲んでおり、さらにそのペースが加速しているかのような印象を持ちます。

上で記述した3番の「ツール群」がそのような周囲の要求速度に全く追いついていないので、いわゆるAIに任せきりにするしかないなんていうレベルまで今後「プログラミング」は難しくなるかもしれません。

Quora Userさんのプロフィール写真

ご質問を拝読すると、まるでこう訊かれているように感じます。

「法律の運用、立法・行政・司法が難しいのはなぜですか?というか、政治家・自治体・法律家なら司法そのものを簡単にして、わかりやすくする事も出来ますよね?『難しいままにしておくんだ!』みたいな、忖度が働いているのですか?」

……これは私個人の考えですが、政治家、特に立法者は、ある意味、プログラマーに似ていて、社会という大きなマシンを動かすためのプログラムを作る「社会的技術者」である、と思います(そのような自覚を持つ政治家を見た事は無いが)。 そう考えると、行政とはプログラムに従って同時並列で動く実行者であり、司法とはプログラムに問題が有ったときにどうするか決める調停者である、と言えましょう。

そう考えた時に、1億人とかの規模で「動く」プログラムをきちんと作ったり、正しく運用したりする、というのは、とても大変で、簡単にする事など夢のまた夢である、という事はお分かりいただけるかと思います。

仮に100人くらいしかいない小さな国家ないし自治体で、立法・行政・司法を置いたとしても、それらを円滑に運用してゆくのは、決して簡単とは言えますまい。

プログラミングの難しさの本質の一面は、たぶん上記のような事だと私は考えます。


また、上記とは別の難しさの一面は、人間とコンピューターが、あまりに違いすぎる事によるものです。 よくコンピューターと脳は対比され、

ご質問を拝読すると、まるでこう訊かれているように感じます。

「法律の運用、立法・行政・司法が難しいのはなぜですか?というか、政治家・自治体・法律家なら司法そのものを簡単にして、わかりやすくする事も出来ますよね?『難しいままにしておくんだ!』みたいな、忖度が働いているのですか?」

……これは私個人の考えですが、政治家、特に立法者は、ある意味、プログラマーに似ていて、社会という大きなマシンを動かすためのプログラムを作る「社会的技術者」である、と思います(そのような自覚を持つ政治家を見た事は無いが)。 そう考えると、行政とはプログラムに従って同時並列で動く実行者であり、司法とはプログラムに問題が有ったときにどうするか決める調停者である、と言えましょう。

そう考えた時に、1億人とかの規模で「動く」プログラムをきちんと作ったり、正しく運用したりする、というのは、とても大変で、簡単にする事など夢のまた夢である、という事はお分かりいただけるかと思います。

仮に100人くらいしかいない小さな国家ないし自治体で、立法・行政・司法を置いたとしても、それらを円滑に運用してゆくのは、決して簡単とは言えますまい。

プログラミングの難しさの本質の一面は、たぶん上記のような事だと私は考えます。


また、上記とは別の難しさの一面は、人間とコンピューターが、あまりに違いすぎる事によるものです。 よくコンピューターと脳は対比され、似た部分を論じられる事が多いのですが(どちらもディジタル処理されている、など)、今のところは相当異なるものです。

プログラムとは、コンピューターという単純労働者に対して、間違い無い作業をさせるために、厳密に書かれた手順書です。

ここで注意しなければならない事が2点あります。 コンピューターは、人間の単純労働者と違って、手順書に書かれた事は、たとえ変な事であっても必ず忠実にやり遂げてしまう、という点(コンピューターは疑問を抱くという事が無い)、および、それが超高速に(つまり一挙に大量に)実行される、という点です。

この2点があるため、プログラム作成者は、プログラムをきわめて緻密に作り上げなければならなくなるのです。

「思い通りに動かなかった」なんて、ザラにある事ですが、その程度で済めばかなりマシな方で、それが超高速・大量に処理された結果、「想像もしない悲惨な出来事」になる事もままあります。

法律なら、行政の現場で誰かが疑問を持ったりして、そこでいったん止めてみる、とか、裁判所に訴えてみる、という事も出来ますが、

プログラムは、いったん実行されれば、コンピューターは何の疑問も持つ事無く、忠実に、高速に、大量に、一挙に、処理を遂行し続け、自身の判断で止めてみるとか、調停者にお伺いを立ててみるとか、そういう事が出来ません。 そもそも現代のプログラミングには、司法に相当する機能が充分ではありません(三権分立とはよく考えられたシステムであるとつくづく思う)。

そのため、プログラミングは、どうしても緻密な作業にならざるを得ず、1字間違えただけで動かない(とよく言われるが、より正確に言うなら、「コンピューター的には、間違いが明確に在るものは動かしてはならない」のである)、という事になるのです。

プログラミングが簡単にならない事について、何らかの忖度が働いている、と、強いて言うならば、それは、コンピューターに対して、人間が大きく忖度しなければならない、という事情に依るものです。


……と、まあ、以上のような事情から、プログラミングは簡単にはならない、と私は考えています。

過去数十年にわたって、「コードを書かなくてもプログラミングできる」などと謳う IT 製品が何度も出現しましたが、ついぞプログラミングが不要になった事はありませんでした。 たぶん今後もそうでしょう。

もちろん、簡単な命題については、プログラミングは簡単です。 たとえば1000未満の自然数のうち3の倍数だけの総和を求めよ、なんていうプログラミングは、義務教育を負えた者なら、誰でもできるでしょう。

しかし、社会の未解決問題や、新しい何かを産み出す、という事柄については、プログラミングはどうしても簡単にはならないでしょう。


誤 義務教育を負えた者なら、
正 義務教育を終えた者なら、
(2021.07.30-22:34)

藤沢 坂井 瞭介さんのプロフィール写真

難しそうに見えるからです。左がコード、右がアウトプットです。

実際には左側には大したこと何も書いてないのですが、プログラミング初心者には難しく難解に見えます。誤解です。

https://off.tokyo/blog/dkewf/

難しそうに見えるからです。左がコード、右がアウトプットです。

実際には左側には大したこと何も書いてないのですが、プログラミング初心者には難しく難解に見えます。誤解です。

https://off.tokyo/blog/dkewf/
元カレー屋さんのプロフィール写真

ほとんどの人には、自分で作りたいものがないからです。自分自身に必要性がないものなので、必然的に枯れてしまう、という事です。

王 厚澤さんのプロフィール写真

自分は高校2年生の時に授業でプログラミングを習ったので、初心者の気持ちを多少覚えています。まずはその視点から。

操作上の難しさ

まず始めに、誤字脱字に異常に厳しいという点でつまずく人が多いと思います。コンピューターは(今のところ)間抜けで気が利かないので、厳密な命令にしか従いません。この厳密な命令がプログラミング言語ですが、そこで使われる見慣れない記号を一文字も間違うことなく打ち込むのはかなり非直感的な作業です。思考上の厳密さについては他の回答者もあげていますが、操作上の厳密性も一つのハードルでしょう。

例えば、ピアノなどの楽器の操作を覚えるのに少し似ているかもしれません。モチベーションを高めて集中するのみです。

思考上の難しさ

抽象的思考が必要です。プログラミングで使う変数、関数やオブジェクトと言った概念は実体がなく、定義や性質で理解するしかありません。目に見えずイメージし難い概念を扱うのはまさに抽象的思考でしょう。その点では数学の代数の習得と似ています。実際、中学レベルの代数の理解がなければプログラミングは難しいと思います。

プログラミングが抽象的な理由として、複雑なコンピューターのしくみを全部理解せずとも使えるよう設計されているからです。コンピューターは機械なので実体はありますし、全てのプログラムはコンピューターの中のシリコンが「作動」して動いていると考えるべきですが、現代のプログラミン

自分は高校2年生の時に授業でプログラミングを習ったので、初心者の気持ちを多少覚えています。まずはその視点から。

操作上の難しさ

まず始めに、誤字脱字に異常に厳しいという点でつまずく人が多いと思います。コンピューターは(今のところ)間抜けで気が利かないので、厳密な命令にしか従いません。この厳密な命令がプログラミング言語ですが、そこで使われる見慣れない記号を一文字も間違うことなく打ち込むのはかなり非直感的な作業です。思考上の厳密さについては他の回答者もあげていますが、操作上の厳密性も一つのハードルでしょう。

例えば、ピアノなどの楽器の操作を覚えるのに少し似ているかもしれません。モチベーションを高めて集中するのみです。

思考上の難しさ

抽象的思考が必要です。プログラミングで使う変数、関数やオブジェクトと言った概念は実体がなく、定義や性質で理解するしかありません。目に見えずイメージし難い概念を扱うのはまさに抽象的思考でしょう。その点では数学の代数の習得と似ています。実際、中学レベルの代数の理解がなければプログラミングは難しいと思います。

プログラミングが抽象的な理由として、複雑なコンピューターのしくみを全部理解せずとも使えるよう設計されているからです。コンピューターは機械なので実体はありますし、全てのプログラムはコンピューターの中のシリコンが「作動」して動いていると考えるべきですが、現代のプログラミング言語ではその難しい部分の多くがブラックボックス化されています。ブラックボックスよる簡潔化の引き換えに実体感が薄まり、抽象的になっているのです。

厳密な思考については他の回答者が書いたとおりです。具体的な例を使えば、「数列を大きい順に並べる」という一見簡単なプログラムでも、実際に書こうと思えば大体こうなります。

  1. 列の中から一番大きい数を選ぶ
    1. 列を通過する際、一番大きい数(暫定王者)を記録し、次の数字と比べる
    2. 次の数字の方が大きければ新王者誕生、王者を更新。でなければ王座防衛成功
    3. aとcを列の最後まで繰り返す
  2. 一番大きい数を最初に持ってくる
    1. 元々最初にあった数と入れ替え
  3. 一番大きい数はもう最初にあるので、列の二番目の位置からスタートし1と2を繰り返す。

これは最もシンプルな方法なので効率のいいアルゴリズムではありませんが、ここで分かるのは、「大きい順に並べる」という簡単な目標でも、実際にプログラムで実行しようと思えば細かいロジックまで組み立てなければならないということです。これがプログラミングの難しさであり、醍醐味でもあります。

抽象的思考と厳密な思考は普段使わない頭の動かした方ですが、プログラミングでは二つ同時に求められるので、色々慣れが必要でしょう。

コンピューターサイエンス

質問はプログラミングに関してですが、関連することなのでコンピューターサイエンス(CS)との区別について少し。

CS経済学ならば、プログラミングがビジネスでいうセールス。つまりCSは理論の体系であり、プログラミングは実用的なスキル・作業です。経済学を専攻しなくても物を売れる(セールス)ように、CSの知識なくともコードは書けます(プログラミング)が、経済学が物を売るだけではないように、CSもコードを書くだけでありません。

具体的にCSの分野をいくつかあげると、

  • ソフトウェア工学:プログラミングでシステムをいかに構築するか。車を作る際に各部分を作ってから組み立てるように、プログラミングでもパーツを作ってから組み立てます。その管理や方法論を扱う分野。
  • コンピューターアーキテクチャ:ハードウェア設計。コンピューターの仕組みを扱う分野。
  • システム系:プログラミング言語、分散コンピューティング(並列処理、オペレーティングシステム、ネットワークなど。(少し語弊はありますが)ハードウェアとソフトウェアを繋ぐ分野
  • 人工知能:複雑な問題を解くアルゴリズムの設計。現在では機械学習が主で、それ以外の人工知能は進展が少ないです。ディープラーニングなど。
  • 理論CS:ほぼ全部数学です。理論物理学が物理世界の数学的モデルを扱うように、理論CSではコンピューターで処理できる構造の数学モデルを扱います。組み合わせ数学、情報理論、暗号理論、アルゴリズム理論など。
  • 応用系:コンピューターグラフィクス、科学計算、ウェブ工学、HCI等。

上記のCSの知識を駆使してシステムを作る仕事が「ソフトウェアエンジニア」と呼ばれています。当然プログラミングは基本ですが、それ以外の役割もたくさんあります。例えを続けるなら、「ビジネスマン」にとってセールスは基本ですが、それだけが仕事ではないのと同じことです。

プログラミングで大きな物を作りたければCSの知識が必須になります。そう意味では、CSという学問もプログラミングが難しい理由の一つと言えるでしょう。

藤沢 坂井 瞭介さんのプロフィール写真

すぐに諦めるから難しいのです。出来るようになるまでなんでも難しいのです。少なくともプログラミングは、ずっと続けてさえすれば報われるタイプのもんだと思ってます。

https://off.tokyo/blog/dwqfq/
A1aさんのプロフィール写真

私見です。

すぐ解らないから、だと思います。
全く知らない人には、「エイゴ(英語)」に見えます。
そして、
例えそれが読める、もしくはコメントを追えたとしても、
その長い文が何をしているか、判りません。
説明を受けて、それが一連の機械が行う手続きを書いてある、
と聞いても、

こんなに手続きを予め書いているものを殆ど見た事がない為、途方に暮れます。
(初心者から始めた人が本気で愕然とするのは、
 まさにここから、です)

普段の生活で、そのような厳密な複雑な手順やマニュアルを作って生きている人はほぼいません。
しかも、1文字間違うとぜんぶ動かない。

手順の出来上がりを頭でぜんぶ考えて、それを表に出す、っていう処は、
ある種の芸術作品を作るのに似ている気はします。

ポール・グレアムは「ハッカーと画家」と云いましたが、言い得て妙だと思います。

なにより、その艱難辛苦を乗り越えてアプリを作るより、
出来上がりを(多くはタダで)ダウンロードして使うほうがはるかに安上がりでラク、
というのもあると思います。

つまり、
料理をぜんぜんしない人が、
料理しよう!と思い立って、各種調理器具や調味料、材料を用意して、
というか熱源とシンク、を用意して、
最初に覚えるべき事をすべてこなして、しかも最初に出来るのは、
まぁ、、
レストランの味には程遠くて(なんなら食えなくて)
でも、惣菜コーナーに行けば出来上がりがいっぱ

私見です。

すぐ解らないから、だと思います。
全く知らない人には、「エイゴ(英語)」に見えます。
そして、
例えそれが読める、もしくはコメントを追えたとしても、
その長い文が何をしているか、判りません。
説明を受けて、それが一連の機械が行う手続きを書いてある、
と聞いても、

こんなに手続きを予め書いているものを殆ど見た事がない為、途方に暮れます。
(初心者から始めた人が本気で愕然とするのは、
 まさにここから、です)

普段の生活で、そのような厳密な複雑な手順やマニュアルを作って生きている人はほぼいません。
しかも、1文字間違うとぜんぶ動かない。

手順の出来上がりを頭でぜんぶ考えて、それを表に出す、っていう処は、
ある種の芸術作品を作るのに似ている気はします。

ポール・グレアムは「ハッカーと画家」と云いましたが、言い得て妙だと思います。

なにより、その艱難辛苦を乗り越えてアプリを作るより、
出来上がりを(多くはタダで)ダウンロードして使うほうがはるかに安上がりでラク、
というのもあると思います。

つまり、
料理をぜんぜんしない人が、
料理しよう!と思い立って、各種調理器具や調味料、材料を用意して、
というか熱源とシンク、を用意して、
最初に覚えるべき事をすべてこなして、しかも最初に出来るのは、
まぁ、、
レストランの味には程遠くて(なんなら食えなくて)
でも、惣菜コーナーに行けば出来上がりがいっぱい並んでいて、
しかも、多くを望まなければ、それらの多くは
タダ
で手に入る、って事、だと思います。

北川権現さんのプロフィール写真

プログラムは言わば手順書ですが、多くの人は物事を実現するのに必要な手順を抜け漏れなく言語化するのが難しいのです。

以下は子どもにプログラミングの思考を教えている動画ですが、プログラミングが難しい理由が詰まっています。これは子供だからではなく、プログラミングをやったことない大人でも似た感じの結果になります。

このようになってしまうのは、手順を考えるときに抽象度が一定レベルに安定せず、手順のうちのいくつかに抜け漏れが発生してしまうからです。このような抽象度を一定に揃える思考方法は訓練が必要で、向き不向きがあります。

佐藤 光国さんのプロフィール写真

わりと経験を積むまで理解できなかったのですが、プログラミング言語のような言語を覚えること無形物を想像して組み立てることには適性があるようで、ここに難しさがあるのだと思います。前者は外国語の習得、校舎はレゴブロックを眺めて3次元の空間上の目に見えない部分を認識できるのか、といったことに近いです。

トレーニングを受けることである程度の技術は身につく=プログラミング言語を使ってプログラムをすることは誰でも出来ます。

しかし、アプリケーションやシステムに対して適切な設計を用いること、効率、速度、保守性、履歴の管理といった要件が近代の多くのソフトウェア開発現場では求められていることとなって、よけいに難しく感じさせるのだと思います。

人の能力はモチベーションに左右されやすいので、難しい≒私には出来ないと感じたらそれ以上に能力を伸ばすことは難しいでしょう。逆にモチベーションが保てるように技術の習得方法を積み重ねていけば、労を少なくして技術が得られるかも知れません。プログラミング言語の構文、カルチャー(実はとても大事!PEP 20 - The Zen of Python とかを読んで)、効率や速度、保守性の確保など、小さく細かく理解可能で得られる範囲の技術を習得していくのがよろしいかと思います。

Shin Okuyamaさんのプロフィール写真

通常、プログラミングってmain関数というかまっさらなところから書くみたいなことをイメージしても、それってまっさなら五線譜で今から作曲しましょうというくらいの難易度・・というか楽譜は楽器を動かす命令書なので厳密に同じことなので、それは難しいですよね。

しかし楽譜ってそんなに難しいか?というと、そこまでではないし、曲を聞きながら「ここなのか」と見てれば、習わなくても直感的にわかるところではありますよね。文字で書いてあるdimだのa tempoが意味がわからなくても、完全にダメってわけではないです。

同様のことはプログラミングにも言えて、私がだいたい書いてだいたい動くプログラムの一部がおかしい。と。プロジェクターやzoomで共有しながら「ああ、ここの不等号がおかしいですね。」と聞くくらいなら、割と誰でも理解できます。ハイ。ごめんなさい。

実際のところ大規模プロジェクトに来るプログラマー職が、「ほとんどの人」ではない精鋭なんてことはないのでして、全体は何してるかはよくわかってなくてもコピペして「つまりここを直せばいいのね」くらいの感じで入って、見てればだいたい何をしてるかがわかってノリを合わせています。

難易度で言ったら料理と同じくらい、音楽よりは楽ではないかなと思います。音楽は身体能力が要求されますよね。料理もレシピなしで素材だけ見て何か作れっていうのは難しいけど、レトルト温めるだけならそこま

通常、プログラミングってmain関数というかまっさらなところから書くみたいなことをイメージしても、それってまっさなら五線譜で今から作曲しましょうというくらいの難易度・・というか楽譜は楽器を動かす命令書なので厳密に同じことなので、それは難しいですよね。

しかし楽譜ってそんなに難しいか?というと、そこまでではないし、曲を聞きながら「ここなのか」と見てれば、習わなくても直感的にわかるところではありますよね。文字で書いてあるdimだのa tempoが意味がわからなくても、完全にダメってわけではないです。

同様のことはプログラミングにも言えて、私がだいたい書いてだいたい動くプログラムの一部がおかしい。と。プロジェクターやzoomで共有しながら「ああ、ここの不等号がおかしいですね。」と聞くくらいなら、割と誰でも理解できます。ハイ。ごめんなさい。

実際のところ大規模プロジェクトに来るプログラマー職が、「ほとんどの人」ではない精鋭なんてことはないのでして、全体は何してるかはよくわかってなくてもコピペして「つまりここを直せばいいのね」くらいの感じで入って、見てればだいたい何をしてるかがわかってノリを合わせています。

難易度で言ったら料理と同じくらい、音楽よりは楽ではないかなと思います。音楽は身体能力が要求されますよね。料理もレシピなしで素材だけ見て何か作れっていうのは難しいけど、レトルト温めるだけならそこまでではないですよね。

おかもと けいすけさんのプロフィール写真

遊びでやってない事は何でも難しいからだと思います。

プログラムは私にとっては遊び(ゲームを作りたかった)から入ったので、コントローラに合わせて変な色のマリオが左右に滑って動いただけで、大はしゃぎでした。

モノ造りはとにかく楽しんだ者勝ちの世界なので、作る事が楽しくない人には難しくなるのだと思います。

普段美味しい外食をしている人が、自炊をしなければならなくなるのと変わらないと思います。

そこで料理に目覚める人も居るとは思いますが、皿洗いやゴミ捨て、後片付けまで含めてが自炊なので、そこまでを楽しめる人でないと難しく感じるのは仕方無いと思います。

Hantani Sadahikoさんのプロフィール写真

私は中学生の頃から40年プログラミングやっているので他の人がなぜプログラミングを難しいと思うのかが分からなくて新人にプログラミングを教える時に困っています。

新しい言語を覚える時は、意味の分からないコードを自分で入力して動かします。その内だんだんコードの意味が理解できどこを変更すれば何が変わるか分かってきます。ここまでが大変でプログラミングが苦手な人はここでつまずくのでは無いでしょうか。

また、プログラミングを組むにはアルゴリズム(計算手順)を頭の中で考えないといけませんがこれが難しいのかも知れないとおもいます。

プログラミング初心者に「配列で与えられた数の最大値を出して」と言っても解けませんでした。

私なら変数を一つ用意し配列の最初の値を入れ配列分ループさせ変数と比較し大きい物があれば置き換える

というアルゴリズム(計算手順)を考えますがそれは文法を教えただけでは出来ずアルゴリズム辞典も教えていかないといけないのかも知れません。

アルゴリズム(計算手順)を思いつくのが普通の人には難しいのかも知れません。

出水田 昌昭さんのプロフィール写真

手で触れて感触を確かめることも視覚で変化を捉えることも実行結果に対してしかできないからではないでしょうか。

画面とキーボード、ポインティングデバイスを通してコードやデザイン画面を触ることはできてもそれはプログラミング中だけのものではありません。

書いたコードがどう動くのかは(イメージのしかたは人それぞれですが)それぞれが頭の中にピタゴラ装置であったり、小人が忙しなく働いているような状態を思い浮かべながらコードにしていくわけです。

その自分なりのイメージを構築できないもしくはピントが合ってない人が大半なのではないでしょうか。

人間と違って曖昧なことは許してくれませんし、文脈を読んでくれることもありません。

日本語のようなハイコンテクストな言語に慣れてしまうと逆に難しい気もします。

ひと通り身について知識もスキルもレベルが上がってくると毎回イメージしなくても書けるようになっていきますけどね。

Kukutsu Atsushiさんのプロフィール写真

興味深い観点でプログラミングについて問われていて、考えさせられました。

突き詰めて考えると、「難しいままにしておくんだ!」という忖度や意志が働いているというよりは、一般の人から見て難しい状態の方が、ハードウェア(CPUなど)が作りやすいからだと思います。

結局誰が頑張るか、という事になるのですが、別にプログラミングというスキル自体、ほとんどの人にとって生命を維持するのに必要なスキルではないので、プログラミングをする人が頑張ればより効率の良いハードウェアが作れる、という面があり、その結果今のようにITが発展してきたとも言えると思います。

プログラミングしやすいハードウェアを作るという試みもありましたが、今はすたれていますから、今の状態の方が相対的によかった、という事なのだと思います。

一方、ノーコードと呼ばれるような、プログラミングを簡単にする手法も開発されていることは、もしご存じなければ調べてみてはいかがでしょうか。それはプログラミングそのものを簡単にする、というアプローチです。ただし、プログラムが簡単になった分、相対的に難しいプログラムをするよりはそんなに大したことはできない、というトレードオフがあります。

結局のところ、ご質問にある「難しい」というのは相対的なものであって、おそらくほとんどの人にとって現状プログラミングは、非日常なものでしかないわけですから、余計に理解しなければという必然

興味深い観点でプログラミングについて問われていて、考えさせられました。

突き詰めて考えると、「難しいままにしておくんだ!」という忖度や意志が働いているというよりは、一般の人から見て難しい状態の方が、ハードウェア(CPUなど)が作りやすいからだと思います。

結局誰が頑張るか、という事になるのですが、別にプログラミングというスキル自体、ほとんどの人にとって生命を維持するのに必要なスキルではないので、プログラミングをする人が頑張ればより効率の良いハードウェアが作れる、という面があり、その結果今のようにITが発展してきたとも言えると思います。

プログラミングしやすいハードウェアを作るという試みもありましたが、今はすたれていますから、今の状態の方が相対的によかった、という事なのだと思います。

一方、ノーコードと呼ばれるような、プログラミングを簡単にする手法も開発されていることは、もしご存じなければ調べてみてはいかがでしょうか。それはプログラミングそのものを簡単にする、というアプローチです。ただし、プログラムが簡単になった分、相対的に難しいプログラムをするよりはそんなに大したことはできない、というトレードオフがあります。

結局のところ、ご質問にある「難しい」というのは相対的なものであって、おそらくほとんどの人にとって現状プログラミングは、非日常なものでしかないわけですから、余計に理解しなければという必然性もほとんどなくて、難しいと思いがちなだけです。なぜなら先に書いたように、生きるのに全く必要のないスキルですから興味がないのは当然ですし、興味がなければ難しく感じるのは当たり前なのです。そういう面もある、という事はご認識いただければと思います。

私にとってみたら、最近のゲームはやたら小難しくて、もっと簡単なルールにすればいいのに、と思いますが、子供たちはいとも簡単に進んでいくように見えるわけです。でも実は子供たちだって日々そのゲームを研究しているから進んでいくのであって、プログラムだって書ける人はそれなりのことをしているからできるのです。何事も、できない、苦手な人から見たら難しく見えるのですし、一方簡単にできるようにできることは簡単にしていっているわけで、それでもまだ簡単になっていない事柄にはそれなりの理由があるのです。

例えばパソコン自体は、昔はマウスもありません。いちいち何かキーボードから命令を入力したり、何ならプログラムを組まないと何もしてくれませんでした。ですがプログラマーもハードウェア開発者も頑張った結果、スマートフォンのように簡単に操作できるようなものができました。そこは別に頑張ってできることなので頑張っているのであり、プログラミング自体を簡単にすることは、優先度が低いし、先に申し上げたようにハードウェア開発との絡みもあって、効率が良いほうを選んでいる、という事だと思います。

Zakkさんのプロフィール写真

向き不向きがあるからだと思います。

中学生ぐらいから、数学で証明問題やりますよね。
あれが得意な人は「
プログラムを書ける人」だと思います。

プログラミング作業って、まさに証明問題を解く作業だと思うんですよね。

つまり、向き不向きは中学生の時点でわかるって事なので、証明問題が苦手な人にとっては、プログラミングは無駄な努力なので、早めに諦めましょう。

ヒロユキ カトウさんのプロフィール写真

フロントエンジニアは昔はhtml, css js, wordpressくらいで仕事になったんですが、最近ではフロントとバックエンドの境目が怪しくなってきました。htmlを出力するのはjavascriptなどプログラミング言語が増えていますね。

イメージした完成形を作ろうと思ってもそこに至るまで色々工程があるので実際に作ろうとすると何から手をつけていいかわからないというのが難しくしてる理由でしょうか。

私はプログラミングは苦手ですがプログラミングは楽しいです。時間が無制限なら全ての案件を私が作りたいですが、仕事はスピードが命なので泣く泣く現実的に仕事を回すために他の人に振っています。

柴田 敏彦さんのプロフィール写真

仕事、勉強だと思って学ぶからだと思います。

僕は遊びでプログラムを作っていたので、すぐに覚えました。学生の時は、熱中のあまり、二晩寝ずに作り続けた事が有ります。

C++の学習では、英語原書がめちゃくちゃ解りやすかったです。図が明快で、英語を読まなくても、図を見るだけで理解できる事が有りました。

backyardさんのプロフィール写真

普段何気なくやっているような作業や手順を、一般的な、どんな場合でも適用できるロジックに変換し、さらにそれを普段使っているのとは異なる書き方で記述しないといけないという、長年人間が大人になるまでやってきた方法と違うアプローチで作業しなければならないからかと。

数学や物理などで物事を数式や公式に当てはめたりするという発想に慣れ親しんでいると、表現方法が違うだけなので敷居は低いと思います。プログラミングやコンピューターによるシステム開発を行うために数学的な発想が必要といわれるのは、コンピューターの仕組み自体が数学の技術をふんだんに盛り込んでいることや、どんな場面でも動くようにプログラムするという過程が、物事を数式で表現するという過程と類似しているからでしょうね。

Kohhei Mugitaniさんのプロフィール写真

難しいか、難しくないか?

ギターを弾けるようになるのは、簡単ではない。

スキーのモーグルコースを降りれるようになるのも、簡単ではない。

英会話をネーティブと出来るようになるのも、簡単ではない。

自動車の整備ができるようになるのも、簡単ではない。

それで、プログラミングだが、入り口の壁を越えるのが、難しいということはあるだろう。それで、入り口の壁とは、

1 ある程度、コンピュータの動作原理がわかっている必要がある

2 プログラミングの概念(stored program computer)をある程度、理解している必要がある

3 プログラミング特有のテクニカルターム、しきたりなどに慣れる必要がある

4 プログラミングする道具(PCや処理系)が必要

とかは、ある。だから、newbieには、難しくみえる。

一番、いいのは、入り口を導いてくれるMorpheusの様な人がいれば、いいのではあるが。。。

あなたの返答は公開されません
読む価値のある回答でしたか?
この情報はQuoraがページ上の回答を並べ替えるのに役立ちます。
そう思わない
そう思う
永野 健一さんのプロフィール写真

たぶん、「プログラミング」という言葉は知っているけど、「何をどうすれば良いのかわからない」ということだと思います。

その意味では、「何かの必要を満たすためにプログラムをする」みたいな感じでプログラミングをするのが、プログラミング学習の近道かもしれません。

そもそも「プログラミング」は、何かしらの「実現すべき目的」が存在し、それを実現するために「コマンドを組み合わせて、実現すべき目的に到達する」という過程を言います。

システムエンジニアは、そうした「何をどうすれば良いか」という全体的なことを踏まえた上で、必要とされる「プログラム」を作るわけですが、そうした「明確な目標が無い」状態で、「プログラミングを勉強する」というのは、かなりハードルが高いです。

昔は、それこそ『BASICマガジン』などのプログラム雑誌があって(まあ、今もあるとは思いますが)、そこで読者投稿によるプログラムがいくつも紹介されていました。

わたしが中学生の頃はそうした他の人が作ったプログラムを、まずはソースをパソコンに打ち込んでいき、実際に動かしてみて、本当に動くかどうかを確認するのですが、時には、色々とパラメータを変えて、プログラムをアレンジして遊ぶというようなこともしていました。

今は、そうしたことも少なくなってきているので、そういう意味では、以下の動画で紹介されているような、身近なもので何かを作る(もちろん、その中でプログ

たぶん、「プログラミング」という言葉は知っているけど、「何をどうすれば良いのかわからない」ということだと思います。

その意味では、「何かの必要を満たすためにプログラムをする」みたいな感じでプログラミングをするのが、プログラミング学習の近道かもしれません。

そもそも「プログラミング」は、何かしらの「実現すべき目的」が存在し、それを実現するために「コマンドを組み合わせて、実現すべき目的に到達する」という過程を言います。

システムエンジニアは、そうした「何をどうすれば良いか」という全体的なことを踏まえた上で、必要とされる「プログラム」を作るわけですが、そうした「明確な目標が無い」状態で、「プログラミングを勉強する」というのは、かなりハードルが高いです。

昔は、それこそ『BASICマガジン』などのプログラム雑誌があって(まあ、今もあるとは思いますが)、そこで読者投稿によるプログラムがいくつも紹介されていました。

わたしが中学生の頃はそうした他の人が作ったプログラムを、まずはソースをパソコンに打ち込んでいき、実際に動かしてみて、本当に動くかどうかを確認するのですが、時には、色々とパラメータを変えて、プログラムをアレンジして遊ぶというようなこともしていました。

今は、そうしたことも少なくなってきているので、そういう意味では、以下の動画で紹介されているような、身近なもので何かを作る(もちろん、その中でプログラミングが必要になる)のが、良いかと思います。

ハルロック(1) (モーニングコミックス)
時代はアプリ? いやいや、電子工作でしょ! 女子大生の向阪晴(さきさかはる)が得意の電子工作を駆使してあれやこれやを一気に解決!? 前代未聞の「電子工作コミック」!
Yako Tsukadaさんのプロフィール写真

経済的な報酬を目的としていませんか?

自分は興味があったので一応できるようになりました。ただ仕事を目的にしていたらできるようにならなかったと思います。「仕事になるから」などの外発的なモチベーションが機能しないことは経済学でも証明されています。

報酬を期待するなとは言ってません。多くの日本人のエンジニアの報酬は不当に低いと思います。報酬を期待すべきです。ただ、プログラミングはなぜ難しいかと言われると報酬を期待しているから、金銭的なモチベーションで学習しようとしているからだと思います。

林 裕隆さんのプロフィール写真

プログラミングを難しいと思ったことは無いですが、プログラミングを使ってどう課題を解決するかについて考える時に難しいと感じたことはあります。

プログラミング言語が今のような文法や形式をとっていることには、すべて理由があり、その理由が把握できてしまうと難しいと感じることはありません。

わかりやすくするということは、ライブラリを作ることやプログラミングインタフェースを作ることにつながります。人間に理解しやすくすればするほど、コンピュータには負荷がかかり、より多くのコンピュータ資源(CPU、メモリなど)を要求します。

たとえば、今日の日付から1000日後の日付と曜日を取得したい場合、昔ならば自分でカレンダー計算のコードを書く必要がありました。その際には閏年の計算もしなければなりませんから、指定した日数を足した日付を返す変数を自分で書くのが当たり前でした。現在では、より簡単にそれができます。

長谷川 祐一さんのプロフィール写真

人が考えたルールが難しいから、プログラムが難しくなります。

ルールが簡単ならプログラムもかんたんです。

忖度じゃなくて、難しいことを難しいままプログラムにしろと命じられるから難しいんです。

この業務フローをそのまんまプログラムにしろと言われて、そのフローがくちゃくちゃで属人的判断とかがいっぱい入っているからコンピューターで処理できるように書くのがメチャクチャ難しい(プログラム言語でも人間の言葉(日本語、英語など)でも)。

ちゃんとした仕様書ができていればプログラムはできたも同じです。(たいていチャンとは書けてなくてさらなるインタビューとかがいりますが)

かぐらさんのプロフィール写真

めちゃめちゃ簡単になってる。

ノーコード や ローコード と呼ばれるシステムが盛んに開発されています。

ほとんどコードを書かずに、Excelのマクロを組む程度のプログラミングで、視覚的にプログラミングできます。

Akito1431さんのプロフィール写真

自然言語と人間が優秀すぎて、言語の経済性判断の中で省略して通用している内容を、機械に理解できるように洗い出し直して整合性をとらなければいけないからです。また機械には判断力が乏しいので、人間であれば対処できるケースもエラーとして定義して作り込まないといけないこともあります。

また、プログラミングは、その論理的状態が再帰しているものであるかを読み解き、数学やライブラリの貯えた莫大なパターンにあてはめることができると、爆発的に効率的な組立が可能になります。この判断はアーティスティックな面もあり、難しいと思います。

Quora Userさんのプロフィール写真

プログラムは論理を記述しています。論理が破綻していると動きません。昨晩クオラに「人を殺してはいけないという規範はない」というトンでも理論を展開していた人にコメントを書いたら、BNBR違反だと脅迫され、それでも引き下がらずに論理のおかしさを指摘したらコメントごと削除されていました。クオラでは、理屈の通らない話を堂々と主張しても、勢いで騙される人がいますが、プログラムは論理が破綻していると少なくとも望み通りには動かず、たいていは望まぬ結果を生みます。プログラムの難しさとは、論理が苦手な人には2行以上書けないけど、得意な人は100行くらいあっという間に書いてしまう、という意味での難しさです。

Chihiro FUKAZAWAさんのプロフィール写真

私にとっては、車の運転や、接客業、スポーツの方が明らかに難しいと思いますが、他のことにはなく、プログラミングにはある難しさとしては、抽象的にものを考えることだと思います。

普通は実体を持っているモノに触れたり、運んだりして、感覚を伴って物事を考えるのに、それがないままに物を考えるのは難しいんだと思います。

あと、画面に見えるのはせいぜい数十行なのに、全体は巨大なプログラムであるのも難しいと思います。

以上のことは、構造化プログラミングやオブジェクト指向プログラミングのような新しい考え方や、新しい言語、統合開発環境というプログラムを作るためのソフトウェアの進歩などの支援を受けて、どんどんカンタンになっていると思います。

また、あまりにもプログラミング、難しいという「食わず嫌い」も大きいと思います。ピーマンやゴーヤのような苦い食べ物は、子供の頃は苦手でしたが今は大好きです。あれは、ちょっとずつウエーと思いながら食べるとますます食べられなくて、食べるぞ! と思ってバリバリ食べると、なんだ、ウマいじゃないか、けっこうイケます。

だから、今日から俺はプログラムを書くぞ! と思って、バリバリ書いていると、そのうち、アハ! 体験じゃないですけど、面白さ、楽しさが分かるんじゃないでしょうか。

George Yoshidaさんのプロフィール写真

子育てをしていると、全く0の状態からよくもまぁ立てるようになるものだと感心します。

さて、プログラミングの話ですが、初学者にとっての難しさはこれに似ているような気がしています。違うのは、ダメだった時に難しいと感じて諦めるか、諦めるということさえ知らないかの違いのみ。

続けられる人はいつのまにかできるようになっているものではないかなと、なんとなく自分の経験を通して思います。(もっと上級レベルの質問が想定されていたとしたら外してますねごめんなさい)

nagatama sahiroさんのプロフィール写真

プログラムを教える事もあるので。

人にもよるでしょうが、教えてて思うのは、新しい思考の枠組みを導入しなくてはならないので、それに時間がかかるというのはあると思います。

例えば、卵焼きのレシピを作るにしても、普通は対人間用の手順を前提にして考えます。

レシピ中に「かき混ぜる際は泡立て器ではなく菜箸を使用して、ボウルを左腕に乗せるようにして落ちないように、逆時計回りで、ボウルの直径より2から3まわり位小さい円をイメージして一秒間に1から3回程度の割合でかき回して下さい」とは普通描きませんが、プログラムではこれに近いような考え方をする必要があったりします。

普段の生活では使用しない考え方なので、こういった思考パタンが身に着くまでにある程度の時間がかかるというのが習得のネックになっている気はします。

あと、プログラムを学ぶ大抵の動機が「ゲームが作りたい」ですが、初心者はコマンドプロンプトという文字だけしかでないプログラムを延々と組むことになるので、派手さがありません。

その為モチベーションの維持もしにくいという状況が発生している気がします。

他には、絵やイラストみたいに、人に見せて意見を聞くという事がしにくい環境もあると思いますし、そういうノウハウの情報が意外と少ないというのもあると思います。

とはいえ、今は大分環境も良くなりました。

独学でもプログラムの基本だけならCodeIQやPaizaでゲーム感覚で学

プログラムを教える事もあるので。

人にもよるでしょうが、教えてて思うのは、新しい思考の枠組みを導入しなくてはならないので、それに時間がかかるというのはあると思います。

例えば、卵焼きのレシピを作るにしても、普通は対人間用の手順を前提にして考えます。

レシピ中に「かき混ぜる際は泡立て器ではなく菜箸を使用して、ボウルを左腕に乗せるようにして落ちないように、逆時計回りで、ボウルの直径より2から3まわり位小さい円をイメージして一秒間に1から3回程度の割合でかき回して下さい」とは普通描きませんが、プログラムではこれに近いような考え方をする必要があったりします。

普段の生活では使用しない考え方なので、こういった思考パタンが身に着くまでにある程度の時間がかかるというのが習得のネックになっている気はします。

あと、プログラムを学ぶ大抵の動機が「ゲームが作りたい」ですが、初心者はコマンドプロンプトという文字だけしかでないプログラムを延々と組むことになるので、派手さがありません。

その為モチベーションの維持もしにくいという状況が発生している気がします。

他には、絵やイラストみたいに、人に見せて意見を聞くという事がしにくい環境もあると思いますし、そういうノウハウの情報が意外と少ないというのもあると思います。

とはいえ、今は大分環境も良くなりました。

独学でもプログラムの基本だけならCodeIQやPaizaでゲーム感覚で学べるサイトも出てきています。これらのサイトだけではスマホゲームを作るスキルには届きませんが、プログラミングの基礎的なスキルの習得だけなら問題ないとは思います。

Quora Userさんのプロフィール写真

プログラミング言語は規則に従っていない入力を受け付けないからでしょうか?

しかしその規則に従ってさえいれば受け付けてくれるので、規則を理解すれば楽になります。

そのうち人間との会話の方が難しく感じられるようになってしまうかもしれません。

Quora Userさんのプロフィール写真

そうか?人付き合いの方がよほど難しいと思うけど。