「プログラミングは簡単」という言説をネットで見かけることがありますが、果たしてそれは本当でしょうか?
「プログラミングなんて自分には無理!」と思っている人にプログラミングをやる気にさせるためには、”ある程度”は許容しなければいけない言説なのかもしれません。
しかし、それをそのまま間に受けた初心者の人が「やっぱりプログラミングって簡単だった」と言ってるのには違和感を覚えます。
正直、プログラミングは、そんなに簡単ではないと思っています。
プログラミングは、最初は簡単に思えることもありますが、実際には奥が深く、試行錯誤の連続で、実際の業務で経験すると様々な困難にも直面します。
何よりも学び続ける姿勢が求められる分野でもあり、決して単純に片付けられるものではありません。
プログラミング歴約30年の私が、この点について所感を述べたいと思います。
”プログラミングは簡単”という「誤解」
初心者がプログラミングが「簡単」だという誤解をする原因には、以下のようなものが考えられます。
HTMLやCSSをプログラミングだと思っている。
まず前提としてHTML・CSSはプログラミング言語ではなくマークアップ言語です。
マークアップ言語は文書構造や装飾を定義するものであり、プログラミング言語のようにロジックに従って条件分岐や繰り返し処理、演算などをするものではありません。
コーディングのための思考プロセスもプログラミング言語とは異なります。
また、プログラミング言語を1つ習得すれば他の言語を比較的容易に学べることが多いですが、マークアップ言語しか知らない人がプログラミング言語を習得するには、相応の労力が必要です。
※HTMLやCSSが「簡単」だと言っているわけではありません。
理解せずに人のコードをコピペしている。
プログラミングを行う中で、他者のソースコードを理解せずにコピペしているだけの人がします。
現場でもしばしば見かける光景で、プロジェクト内でコピペが蔓延することもあります。
むしろ同じような画面を作成する場合などには、上級者のコードをコピペすることが推奨されるケースもあります。
大規模プロジェクトでは、一定の品質を担保するため、ある程度は仕方のないことですが、コピペするにしてもコードの内容を理解していないのは問題があります。
そのような人は、コードの少しの変更にも対応できない場合がしばしばあります。
フレームワーク上でしかコーディングしていない。
現代のシステムにフレームワークは不可欠です。
フレームワーク上でコーディングをしていると全体の動作を理解しなくても開発が可能です。
「そのためのフレームワーク」なのですが、初心者の場合、全く自分の書いたコードの意味を理解しておらず、またどのような条件で実行されるのかを把握していない人もいます。
Webフレームワークでは、全く自分で定義していないオブジェクトに設定されている値を取得する事があります。
わかりやすくPython+Flaskの例で示しますと、以下のようなコードです。
# "/" にアクセスしたときのエンドポイント
@app.route("/", methods=["GET", "POST"])
def index():
# requestオブジェクトの中にあるデータ(ユーザーが送信したデータ)を取得
user_input = request.form.get("user_input") # POSTリクエストのフォームデータを取得
極端な例ですが、以前、驚いたのが、上記のコードのようなケースで、”user_input”への値がどのように設定されたかもrequestというオブジェクトが何なのかも全く分からずにコーディングしている人がいました。
その人は自分のコードがクライアントサイドで動いているかサーバーサイドで動いているかを理解もしておらず、そもそもサーバーサイドとクライアントサイドが何なのかも理解していませんでした。
Webシステムというものを全く理解しなくてもフレームワークと詳細設計書があれば、なんとなくコーディングできてしまうという現状があります。
プログラミング初心者と上級者の違いは?
「いやいや、自分は流石にそんな誤解はしていないし、Webシステムも理解している」
初心者の方でも、もちろんそのようにちゃんと理解している人もいるでしょう。
しかし、基本的なプログラミング技術を持っていたとしても、上には上がいるものです。
私も現場で自分では到底かなわない上級者を見てきたからこそ、「プログラミングは簡単」などとは到底言えませんし、上を目指す限り学ぶことに終わりはありません。
初心者と上級者の間には、以下の3点において大きな差があります。
コーディングの速さ
プログラミングのスピードにも初心者と上級者で大きな差があります。
初心者が1週間かかるコーディングでも、上級者なら数時間で終えることもあります。
これは上級者の方がタイピング速度が早いと言ってるわけではありません。
上級者は、「ハマる時間が短い」「調査時間が少ない」「考えを迅速にコード化できる」「同じ機能を実現するコードが短い」といった点で初心者と圧倒的に差が出ます。
※特に経験上「ハマる時間」の長さの差は大きい気がします。
コードの可読性・メンテナンス性
同じ機能を実現するコードでも、上級者と初心者では読みやすさに大きな差があります。
初心者はまず、自分で書いたコードが動作することに集中します。
しかし上級者(中級者からかも・・)になると、コードの保守性や読みやすさを考えるようになって、リファクタリングの重要性や、可読性の高いコードを書くようになります。
「別に動けば同じじゃん」
と思う人もいるかもしれませんが、やはり可読性の高いコードは、バグも少なく、メンテナンス性も高いです。
近年ではプログラミング言語自体が最適化を行ってくれることが多いため、規約通りにコーディングをしていれば大きな問題は発生しにくくなっていますが、上級者が書くコードはメモリの無駄が少なく、パフォーマンスも優れています。
設計スキル
そして初心者と上級者の最も大きな違いは、アプリ全体を設計できるスキルの有無です。
上級者は、前述の「コードの可読性・メンテナンス性」をアプリ全体に適用できるようになります。
Webシステムなどでは、フレームワークによってある程度の規定が定められているため、個々の画面やコンポーネントを作成する際には設計スキルの必要性が少なくなってきていますが、アプリ全体の設計となると、フレームワークがあっても設計力が必要です。
クラス設計や共通化などによってプロジェクト全体の見通しは大きく変わります。
もちろん、単に動くだけではなく、パフォーマンスを考慮してリソース消費を最小限に抑える工夫も求められます。また、デザインパターンや高度なアルゴリズムを活用することも必要になるでしょう。
設計次第で、大規模プロジェクトのコード品質が決定づけられると言っても過言ではありません。
私自身、システム全体の詳細設計に関わったことが何度かありますが、自分の設計が全体の品質や進捗、そして個々のプログラマーの負荷に大きな影響を及ぼすため、非常に緊張感を感じました。
(正直、あまりうまくいかず反省(後悔?)ばかりのプロジェクトもありました…。)
ただし、ここには大きな矛盾もあります。クラス設計や共通化をうまく行うほど、個々のプログラマーのスキルに頼らずにコードを書くことが可能になります。その結果、個々のプログラマーがあまり理解していなくてもコーディングができる状況が生まれてしまいます…。
まとめ
以上、「プログラミングは簡単」という言説について所感を述べてきました。
プログラミングは奥が深いです。また言語やフレームワークも日々、進化しているため、一度覚えたら終わりではなく、学び続けなければいけません。
例えるなら、世間でよく聞く「プログラミングは簡単」という主張は、卵焼きが作れたからといって「料理は簡単」と言っているようなものです。
卵焼き一つとっても素人と玄人では味が違いますし、何より料理は卵焼きだけではなく奥が深いです。
プログラミングも基礎的な部分を学んで動くコードが書けるようになっただけでは、その奥深さは理解できないでしょう。
なお、このままでは、これからプログラミングを学ぼうと言う方が萎縮してしまうかと思うので、補足します。
それでもプログラミングを学ぶ価値はあります。
料理人の例を出しましたが、全員がプロになって人様に振舞わなければいけないわけではないのと一緒で、自分の仕事のための効率化ツールを作成できるようになるだけでもプログラミングを学ぶ価値はあると思います。
何より、最初に自分が書いたプログラムが動いた時の感動はひとしおです。
なので気軽に考えて「難しいからやめておこう」ではなく、「ちょっとやってみよう」という気持ちで挑んでみてください。
もちろん、「プログラムが動いた」先に職業としてプログラマーを目指すならば、困難な道もありますが、それも含めて楽しめるようになれば、プログラミング上級者への道が開けると思います。
なお、2024年現在、生成AIの進化によってプログラミングの環境も変わってきました。中には「プログラマーはもう必要ない」と言う方もいます。私自身、色々と模索中ですが、以下のような記事を書いているので良ろしければご参照ください。