こんにちは、マっさんです。
ここ最近、副業でプログラミングを目指す方を良く目にします。
これは大変素晴らしいことではると思いますが、ただ、副業と言う面で、プログラミングの前提知識、つまりソフトウェアの前提知識が抜け落ちているのではないかとも思いました。
そこで、その"駆け出しエンジニア"の方に向けて、プログラミングについて少し語らせて頂きます。
そしてこれからお伝えすることは、現役で活躍するエンジニアとの意識の乖離を埋める為でもあります。
是非、現状の自分と照らし合わせて、読んでみて下さい。
※コードは一切出て来ません。※
プログラミングの変わらぬ真実
プログラミングに銀の弾丸は無い
ある民話に狼男と言うお話があります。その狼男は満月になると凶変し、人々を襲い、人間を狼人間にしてしまいます。その狼人間を沈める為の方法はただ一つ、「銀の弾丸」を打ち込む事でした。
ソフトウェア開発において、日々様々な問題が発生し、突如混乱に陥り、不条理に満ちていることが起こります。しかし、残念な事に、この問題を治める「銀の弾丸」はありません。
つまり、プログラミングには、問題を沈める為の「銀の弾丸」や物事を沈める為の「特効薬」なんてありません。
もっと噛み砕いていうと、ある一つのプログラミング言語が、全てのソフトウェア作成に使える訳では無い。ということです。
ソフトウェアは本質的に困難である
プログラミングの成果物である「ソフトウェア」は、 本質的に「困難性」を持っています。
ソフトウェアの本質は、4つの性質があり、その性質がなければソフトウェアとは言えません。
そして、その4つの性質はこの困難性を示す性質と同じなのです。
- 複雑性
ソフトウェアというのは、巨大で複雑です。数千万行のコードは珍しくありません。
コードの行数が多くなると、見えにくくなる。探しにくくなる。ということを言っています。 - 同調性
ソフトウェアとは現実世界に接続され、同期し、使用されます。実世界ほど難しいものはなく、プログラミングが困難になる一つはこの為です。
例えば、銀行システムで入金した金額が、3日後に更新されます。と言ったら皆さん困りますよね?そこを同期させるのが困難なところなのです。 - 可変性
ソフトウェアは常に変更しなければなりません。ユーザーはさらなる要求を思いつきます。
ユーザーというのは傲慢です。新しいものを常に求めます。皆さんもそうですよね? - 不可視性
ソフトウェアは概念的なものです。そのため、目には見えません。コードは外から見えませんよね。今見えているものを簡単に図面化することは可能です。しかし全てを表現することはできません。
このように、本質が定義上取り除けないものであり、ソフトウェアの本質が困難性である以上、これを成果物とするプログラミング活動も困難になります。
そして、取り巻く状況が複雑で問題が多岐に渡りすぎるため、全てを解決する特効薬は存在しません。
そうすれば、どうしたらプログラミングやソフトウェアを学んでいけば良いのか?
ソフトウェアの世界には、「1つのツールや技法が何にでも当てはまる」と信じる人が多くいます。しかし、プログラミングの領域では、「特効薬」はありません。なので、地道で科学的なアプローチによる改善が必要です。
つまり、歴史を学び、様々な手法や考え方を学んで地道に、複雑さを「軽減」させていかなければなりません。
まとめ
如何だったでしょうか?ここで、上記のことをまとめますが、やはり地道に問題解決をするために学ぶ。ということが大切です。それを忘れずにプログラミングを行ってください。
この記事は以下の本を参考にしています。是非読んでみてください。