SE/PGの仕事は、システムを開発することです。その際、必要となる能力、あるいは性格とも関連してきますが、以下のものです。
SE/PGは、与えられた課題に対して、解法を見つける必要があります。システムを組み合わせるマクロなレベルから、関数をコーディングする中でアルゴリズムを見つけたりすることです。どうすれば、効率的な処理を思いつけるか、という点です。時にはパズル的な能力が必要になります。この点では、数学に強い人間の方が有利です。問題解決能力は、どんな仕事でも必要なことですが、SE/PGにおける問題解決は、数学的な問題が絡んでいます。
できる人間のソースは、非常にスマートで、無駄がありません。ところが数学力の低いプログラマーの場合、だらだらと長ったらしいソースになります。問題を解決するために、最も無駄の少ない、シンプルな解法を生み出すのではなく、力仕事でごり押しで結果を出そうとするのです。データを変換する際に、能力のある人が1ステップでやってしまうことを、何ステップもかけて順々に処理していくのです。無駄が多いのですが、他のプロセスとの連携などの問題がなければ、これでもうまくいきます。
きれいにできたソースは、美しく、芸術的でもあります。といっても、感動しているのは本人だけだったりしますが。最も効率的、最適化されたソースは一回で書けるとは限りません。通常は、一度作っては見直して、無駄な部分を省き、どうやったらもっとスマートに書けるか検討し、再構築します。これはちょうど、文章を何度も何度も推敲するのに似ています。もちろん、現実の仕事では、そんなことをしている暇はないでしょうが、プログラムを学ぶ初期の頃は、こういう実践を試みたいものです。そうやって追求している人は、難問に対しても創意工夫することでクリアできていくのです。
今述べてきたのは、設計および開発の際に必要となる能力です。これは問題解決能力ですが、創造性が発揮される領域でもあります。
一方、すでに出来上がったソフトウエアに起こった問題を解決する際にも、問題解決能力が必要とされます。
SE/PGの仕事は、問題に対する解決策、アルゴリズムを発見するだけではありません。問題をあらゆる角度から検討する能力が必要です。こういう場合、ああいう場合どうかと、あらゆるケースを漏れなく検討していくのです。ある意味、あら捜しの能力が必要かもしれません。システムに穴があると、そこから簡単にシステムがダウンしたり、セキュリティ上の問題が発生したりするのです。
実際、きちんとしたプログラムを作る際、ソースコードは正常系よりも、例外処理に対応するための記述の方が多かったりするものです。私が最初に手がけたシステムでは、4分の3が例外処理に占められていたほどです。
複雑に絡んだシステムでは、正常な値だけが運ばれてくるとは限らないのです。正常な値よりも不正な値の方が種類も多いので、それら全パターンに対処する必要があります。特に複数のプロセスが並行して動いているシステムでは検討することはたくさんあります。
十分検討したつもりでも、思いもよらないことが起きるものです。これについては、実際には経験が必要です。ころんで間違いを学んでいくのです。そうして問題を起こすパターンが見えてきます。そしてそれを別の問題にも応用していくのです。また他人の間違いからも学んでいきます。
世界に誇るような非常に優秀なプログラマーを集めて作成したアプリケーションでも頻繁にバグが出ます。どうしてバグが出るのか不思議だと思うかもしれませんが、それだけあらゆるケースを網羅するのは難しいのです。そういう人たちですら、問題が起きた都度対処しているのです。最初から完璧なものは作れません。
世の中には、最初から完璧な設計・仕様が作れると誤解している人が多いのですが、完璧な設計などありえません。できるとしたら既存のものと同じつくりをしているものだけです。
アプリケーションは、ユーザに見える部分はシンプルであっても、背景で動いているプログラムは複雑なものです。1、2だけを追求しているだけでは駄目です。現実には、面倒な作業を繰り返さなければなりません。自分ひとりでゼロからプログラムを作る場合はその都度最適化できますが、他人の作ったものを利用しなければならないときは、大量の繰り返しの作業が発生します。特にテストフェーズに入ったならば同じことの繰り返しです。テストの自動化を行ったとしても、ある部分ではやはり手作業は発生します。
プログラムは人間の作ったとおりの動作をします。何かの問題があれば、それは人間が仕込んだものです。なので、一個の間違いも起こらないように細かくチェックする必要があります。
また、綺麗なソースやドキュメントを作成するのは手間のかかる仕事です。手を抜くことはいくらでもできます。ソースをきちんと整えるには、それなりの労力がかかります。
基本的には、上記の能力が必要なのですが、そうではないプログラマーも多く存在します。どうしてそういうプログラマーがこの業界でやっていけるのか不思議ですが、ソースコードを書いては動かし、うまく結果が出なければ問題がありそうなところを適当にソースを修正し、また実行し、を繰り返し、一通りバグが出なくなれば、OKとします。
こうしてできあがったソースはスパゲッティ化しています。作った本人も全体を把握していません。ただバグが出るたびに、原因箇所を特定し、そこにパッチを当てる、ということを繰り返すのです。まるで体の構造をわからずに、あれこれ試行錯誤しながら投薬しているようなものです。だんだんもつれがひどくなる場合もあります。こういうソースを読み解くのも一つの能力かもしれませんが、できればこういうソースには出合いたくないものです。
それでもテストを潜り抜けてできあがったソースは、一応完成品として納品されます。外からはわかりません。客は機能だけを重視するのでソースがどうなっているか気にしません。というわけで、スキルのないプログラマでも何とかできてしまったりするものです。でも、本当に収拾付かなくなったらどうするのでしょう。
人には得手不得手があります。基礎が得意な人もいれば応用が得意な人もいます。根本が好きな人はより低い層やライブラリの作成などを行い、組み合わせが好きな人は他人の作ったAPIを使って作成し、さらにはもっと大きな視点で見てコンポーネントやサービス、製品を組み合わせて一つの機能を実現するようにします。この辺は、自分がどのレベルで生きていくのかの選択になります。ただしミクロなレベルであれ、マクロなレベルであれ、システム的思考は重要です。