今日は抱負や理想についても、具体的な技術についても話さず、プログラマーの考え方によくある典型的な間違いについて話しましょう。以下の問題は、私自身が遭遇したことのある問題、あるいは私の友人が遭遇したことのある問題であり、これらはすべて私個人の理解です。皆さんのお役に立てれば幸いです。

デザインパターン、設計原則について
デザインパターンや設計原則に精通すれば、設計を学んだことになると考える人がいます。実際には、デザインパターンや設計原則は、先人が設計実践に基づいて行った総括と抽出に過ぎません。設計は、結局のところ問題を解決するためのものであり、具体的な問題の解決方法を、一定の抽象化を経て、プログラマーの言語に変えることです。
私はある人々を見たことがあります。彼らは知識が豊富で、見聞も広く、理論をもっともらしく説明することさえできますが、実際に問題を解決する必要がある場面になると、巧みでエレガントな方法を提示することができません。これは典型的な象牙の塔に住む人々です。
一方で、デザインパターンを学ぶ人々を軽視する人々もいます。彼らはすでにソフトウェア設計の奥義を掌握していると考えており、これらは自分たちにとって無意味な言葉であると思っています。これに対しては、一笑に付せばよいでしょう。
時には、私たちはデザインパターンや設計原則を粗雑にを握したことで、かえって手足を縛られることがあります。例えば、こんな出来事に遭遇しました。ある努力家のプログラマーが設計したコードは、ありとあらゆる場所でコンポジション(例えば、UserオブジェクトをAdministratorの中に配置するなど)を使っていました。私は興味を持って尋ねました。「いくつかのクラスとオブジェクトの関係は明らかに継承の特徴に合致しているのに、なぜ継承を使おうとしないのですか?」彼は言いました。「設計原則は、コンポジションを多用し、継承を少なく使うよう教えています。」私は思いました。これらの優れたパターン、原則、方法論を、徹底のにを握できず、実際のシナリオに応じて適切に運用できないのであれば、むしろ知らない方が良いのではないだろうか、と。
多種多様なコンピュータ言語の学習について
一つの言語を学べば十分であり、それほど多くの言語を学ぶ必要はないと考える人もいます。実際には、適切なコンピュータ言語をもう一つ習得することは、単に生計を立てるためのツールを一つ増やすことではありません。もし新しい言語が、プログラミングや設計に対するあなたの考え方を大きく変えることができるなら、おそらくそれは学ぶ価値があるでしょう。
例えばC言語は、厳密な思考を育むことができます。例えば動的言語は、プログラマーがより良くオブジェクト指向のコーディングを行うのに役立ちます。例えば関数型言語は、産業生産や計算の分野において代替不可能な役割を果たしています。
もちろん話を戻せば、いわゆる「術業に専攻あり」、つまり専門分野にはそれぞれ専門性があるということです。ある特定のコンピュータ言語(その言語に必要なランタイム環境、その中のコンパイルや解釈の原理を含む)を深く習得することは、非常に必要です。
また、私たちはしばしば多くのコンピュータ言語のどちらが優れているかという論争を目にします。コンピュータ言語は結局のところツールであり、ツールは時代の発展とともにアップグレードされ変化していくものです。単純な優劣の論争にはあまり意味がありません。
英語について
中国人はなぜ英語を学ばなければならないのか、プログラマーはなぜ英語を学ばなければならないのか。メソッド名や変数名をすべてピンインにしても、同じようにできるではないか。こんな理不尽な決まりを誰が作ったのか。
残念ながら、多くの学習教材、論文、技術資料(特に登場したばかりの技術)はすべて英語です。一方で、国際標準やプログラマー同士が交流する一般的な方法もすべて英語です。あの有名なframeworkやlibのソースコードで、もし変数名をピンインで書いたらどうなるか、想像するのは難しいでしょう。
ですから、もしあなたの英語が苦手なら(少なくとも読み書きが苦手なら)、自分に言い訳をしないでください。英語は他のツールを習得するためのツールです。中国語がすぐにコンピュータ界で世界一の共通言語になると強く信じていない限りは。
アルゴリズムについて
アルゴリズムがどれほど重要かということについては、常に議論が大きいです。
ソフトウェアは結局のところ問題を解決するために使われるものです。アルゴリズムと言えば数学に触れないわけにはいきません(これが、ソフトウェア分野の多くの巨匠が相当な数学的バックグラウンドを持っている理由でもあります)。問題解決については、ここでは簡単に2つのステップにまとめることができます:
- (1)実際の問題を単純化された数学的モデルに抽象化する
- (2)アルゴリズムを使ってこの数学的問題を解決する
ここでのアルゴリズムは、広義の概念であるべきです(ここでのアルゴリズムは、大学で学ぶ狭義の具体的なアルゴリズムだけを指すのではありません)。アルゴリズムは上記の数学的問題を解決する方法です。もし仕事の中でその存在に気づいていないのであれば、それは単に、あなたが抽象化した数学的モデルが比較的単純であり、このモデルを解決する方法も非常に単純であるか、あるいは既存の方法で模倣できるか、既存のフレームワークが代わりに完了してくれているため、あなたがそれを気に留める必要がないということを示しているだけです。
もしあなたが行っていることが革新的な意義に満ちたものであり、他の誰もやったことがないことであれば、このときアルゴリズムがあなたの成否を左右する要因になるかもしれません。
現在の中国の環境では、視野が広く経験豊富な人を見つけるのは簡単ですが、企業が上記の2つの能力を備えて問題を解決できる人材を採用するのは、実際には非常に困難です。
経験について
唯経験論者は多くいます。彼らは、ソフトウェア企業における役職、給与、さらには意思決定能力までもが経験に依存すると考えています。5年の経験を持つエンジニアは、3年の経験を持つエンジニアより確実に良い仕事を見つけられると:
「私は古参社員で、もう5年働いている。なぜ3年しか働いていない彼の給料が私よりずっと高いんだ?!」
実際には、多くの要因——分野での蓄積(これは業務上のものであり、例えばインターネット分野、従来型ソフトウェア分野など、いわゆる純粋な技術とは直接関係ありません)、視野、プレッシャーに耐える能力など——は、しばしば「経験」の蓄積に大きく依存しています。しかし、これは絶対的なものではありません。「事業は半分は実行によって作り出され、半分は総括によって作り出される」という言葉があります。実際に優れたプログラマーの中には、総括することが得意で、観察と蓄積に長け、絶えず考えることをやめない人々がいます。そのようなプログラマーは、より多くの優れた経験を持っているのです。
一方で、プログラマーは問題を解決するために存在します。経験は問題解決の代わりにはなりません。ある人がより優れた問題解決能力を持っているのなら、なぜより良い給与を得られないのでしょうか?
出典:http://www.raychase.net/359