よく知られているが、プログラミングに関する古い本の有効期限はありますか?[閉まっている]


51

読んだ後、すべてのプログラマが読むべき書籍に関する質問を次のように不要とみなされるべき場合、私は疑問に思います:

これらの本はすべて非常に古いようです。現代のコンピューティングと、それらの本が書かれたときの現在のものとの間に違いはありませんか?

例えば、私の61歳の先生は非常にうまく物事を説明しますが、彼が25年前と今教え始めた間に行われたすべてを考慮することを忘れています。

それらの本についても同じではありませんか?現在の慣行により近い原則と技術を教える現代の本はありませんか?それとも、今日でも有用で関連性があると思いますか?


9
リストされたすべてのタイトルが少なくとも12年前に最初に公開された理由を検討するのに時間をかける価値がありますが、今日でもまだ価値があります。5つのうち4つは初版以降に更新されていますが、エディション間の平均時間は10.4年です。
カレブ

83
基本的なプログラミングの原則は、新しい「今週の風味」の言語またはフレームワークがあるからといって変わりません。
ロバートハーベイ

26
生のコンピューターサイエンスの卒業生が複雑なソフトウェアシステムを構築することを期待することは、生の土木工学の卒業生が吊り橋を設計することを期待するようなもので、単に起こるべきではありません。学校はあなたが知る必要のあるすべてをロングショットで教えているわけではありませんが、優れたソフトウェアエンジニアになる方法を学ぶ方法を教えるべきです、そしてこれらの古い本は数十年前と同じくらい多くを語っています-オリジナルは1975年にあったよう人月の神話の20周年記念版が公開、およびそれだけで関連するものとして、今日のされてから16年
マーク・ブース

10
これらの本は時代を超越しています。しかし、唯一のこれらの本に自己を制限すると誰が新しいものを無視するだろうプログラマ、時代遅れとなり、実際
ブヨ

4
あなたはちょっと質問を懇願している:本が良ければ、それらは時代遅れではない。
quant_dev

回答:


92

これらの本は、開発の原則について書かれています。これらの原則は、本質的に言語にとらわれず、パラダイムにとらわれないものもあります(OOP、関数型プログラミング、命令型言語)。

結局のところ、ソフトウェアは常にデータを取得し、処理してから出力することなので、開発の理論と良い方法を説明します。Facebook、Twitter、3D、会計のバッチ処理、鉄道交通管理、ロケット打ち上げなど

のような言語に関する本 "How to learn XXXXX in YY days"。XXXXXは言語で、YYは最終的に(そして実際には非常に急速に)時代遅れになる数字です。時代遅れ。

すばらしいSteve McConnellによるCode Completeは、おそらく私にこれを実現させた本です。そして、プラグマティックプログラマーは、私がソフトウェア開発に対して抱いていたビジョンを完全に変えました。そのような本を読むことで、あなたが毎日直面している問題の95%がすでに解決されており、私たちの95%がまだ車輪を再発明していることに気付くでしょう。

いわゆる「クラウド」はソフトウェア開発の未来ではなく、開発されたソフトウェアを使用する方法です。

誇大広告/でたらめな流行語のtrapに陥るのではなく、ソフトウェア職人のスキルを向上させる方法に焦点を当ててください。

他の優秀なスピリットが私たちの前に発明し、学んだことから学ぶことに焦点を合わせてください。なぜならそれは熟練した開発者になるための唯一の方法だからです。


6
良いアーティストが素晴らしいアーティストを盗む
hafichuk

16
...真のアーティストが出荷します。:-)
kindall

9
それでも、何度言っても、人々はまだ12日間でjavascriptが必要なだけだと信じています。
スペンサーラスブン

2
優れたアーティストはコピーし、優れたアーティストはコピーし、コードをクリーンに保ちます!(学校で、他の子供たちと一緒に仕事をしている多くの頭痛の種がありました。彼らはすべての人からコピーするため、プロジェクトを台無しにしました...)
HTDutchy

さらに@SpencerRathbun(IMHO)、JavascriptはPHPのような他の言語よりもふすまを消費します。まだバジリオン"Learn Javascript in 15 seconds"とたった半バジリオンの"Learn PHP on 17 secsonds"
Clement Herreman

80

これらの本はすべて非常に、非常に、非常に古いようです。」

Psychology-Computer-Programming(1971)-1970年の百万倍のプログラマーにより、プログラムをどのように設計し、どのような間違いを犯し、どのようにそれらを回避するかという心理がこれまで以上に重要になっています。

ソフトウェアツール(1976)-フレームワーク、ユーティリティ、スクリプト、およびプラグインのコレクションであるWebにより、ソフトウェアツールのアイデアはかつてないほど関連性が高まりました。

編集:一般的な質問に対処するために-古いプログラミング本は関連していますか?

ソフトウェアエンジニアリングの一般的な原則はそれほど変わっていません。OO、TDDなどの新しいテクノロジがあります。しかし、一般的にユーザーと問題は変わっていません。問題を分割する方法を考えることは今と同じです。いつもだった。

これらの古い本は、一般にこの分野の専門家によって書かれました。最新のプログラミング書籍の多くは、最新の流行語がまだ最新であるにもかかわらず、2000ページのドアストップを急ぐことを目的としています。

使用されなくなった言語と技術に関する書籍はおそらく関係ありません。リストにはVaxアセンブラマニュアルはありません。しかし、「C」は依然として非常によく使用されており、「Cプログラミング言語」は「C」に関する最高の本であるだけでなく、簡潔なチュートリアルと言語への参照の書き方のモデルでもあります。

新しいアルゴリズムはありますか?はい。しかし、すべての古いアルゴリズムは依然として関連しており、新しいもののほとんどは、あなたが会う可能性の低い不明瞭な領域にあります。最近、より良いソートやFFTを思い付く人はいません。他の人々はそれらをより良く説明しようと試みましたが、今年のアルゴリズムの本がCLRSよりも優れている理由はありません。

追伸 1977年に開発されたあなたのクールな新しいiWhatsitはBSDを実行します。


28

それらの本はすべて非常に、非常に、非常に古いようです。最近と本が書かれた時期に違いがあると思いませんか?

私見では、非常に優れた本が何十年も人気を維持していることは驚くことではありません。しかし、私はあなたがリストした各候補者に何かを伝えることができると思います:

Code complete: 2nd edition = may, 2004

実際、「Code complete」の最初のエディションは1993年からでした。したがって、これは実際には「クラシック」です。Cファミリーのほぼすべてのプログラミング言語に適用される例を使用した基本的なコーディングスタイルに関するもので、現在最も人気のある言語(C / C ++ / Java / C#/ Objective-C / D / ...)が含まれています。はい、この本は最新です。

Introduction to algorithms (Cormen, Leiserson, Rivest, Stein)

まあ、私は実際にその本を読んでいませんでした(私のアルゴリズムのテキスト本は「Sedgewick」からでした)が、学習アルゴリズムとアルゴリズム構築は本当に言語に依存しません。もちろん、最近では標準ライブラリで多くの基本的なアルゴリズムが見つかっているため、この技術は過去数年で過小評価されていますが、IMHOのすべてのプロのプログラマーはこの分野で基本的な知識を持っている必要があります。

The Pragmatic Programmer

これは、職人技としてのプログラミングに関する非常に良い本です。プログラミングがテキストエディター、IDE、バージョン管理などを使用して手動タスクとしてプログラマーによって行われている限り、言語に依存せず、非常に最新の状態です。

Structure and Interpretation of Computer Programs: = September 1, 1996

本は、Schemeを使用して異なるプログラミングパラダイムの違いを教えていますが、これは私の個人的なお気に入りです。抽象化の構築にこれほど重点を置いている本は他にありません。そして抽象化の構築は、平凡なプログラマーとトッププログラマーの違いを生む重要な能力です。過去数十年は変わっていません。さらに、関数型言語と言語要素は最近人気が高まっているため、この本で提示されたアイデアはルネッサンスになりました。

The C Programming Language

まあ、この本は他の4つほど不朽のものではないかもしれません。しかし、Cは上記のすべての人気言語の「母」のようなものなので、この本を読むことも良い考えかもしれません。そして、CをC ++よりもよく知っている人が書いたC ++コードの保守プログラミングを行う必要がある場合、この本は必須です。

最後に、あなたは、技術特有でありすぎることなく、「現在の現実」をより考慮した本を求めていました。それでは、「現在の現実」とは何であり、「非技術」側で何が変わったのでしょうか?ここに、このリストが完全であるか、正しい優先順位を持っていることは言うまでもなく、過去10年間のいくつかのポイントがあります。

  1. より多くのレガシーコードが存在します(特に、FortranおよびCobolだけでなく、C ++およびJavaにもレガシーコードが多くあります)。
  2. 単体テストとTDDがより好まれています。
  3. さらに多くのオープンソースコードが利用可能です。
  4. オブジェクト指向はますます批評家を得ています

(ここではWebやアプリの開発については何もリストしません。この技術に特化したものだと思うからです)。

トピック1と2、特に2008年の"Clean Code"と2004年の"レガシーコードを効果的に使用する"に適した本があります。


5
Cプログラミング言語時代を超越しています。そのような蒸留された本はまれです。私はそれを読み直しました...わかりません。カウントを失いました(13歳のときに初めて読みました)。むしろ、今ではもっと感謝しています。
フランチェスコ

3
リストに#5を追加します:並列計算。まったく新しいアイデアではありませんが、最近では前例のない規模で行われているため、いくつかの新しい問題が発生します。しかし、これらはすべて古いものと同じ基盤に基づいて構築されており、OPはまだこれらの基盤を実際には理解していないと感じています。
マイクバランチャック

2
@マイク:私は同意します、並列コンピューティングは過去10年間でますます注目を集めている、私は私の答えを書いたときにそれを見逃した。
Doc Brown

2
@Doc Brownあなたは、あなた自身の観点から数日以内に1885年、1955年、1985年、および2015年を訪れたことに起因する文学の不朽性についてのあなたの意見ですか?
カラマネ

13

「コードの完成」、「実用的なプログラマー」、「SICP」と言ったもののうち、私の会社で始まり、より高いレベルに到達したいすべての新しい開発者向けの推奨読書リストに載っています。

コンピューターサイエンスの基礎科学は変わっていないため、長い目で見れば時代遅れではありません。


10

これらの本をすべて読んだわけではありませんが、私はCode CompleteとThe Pragmatic Programmerを所有しています。これらの本は時代遅れではありません。彼らは少しさびている段落がいくつかあるかもしれませんが、ほとんどのコンテンツは今日でも関連しています。

コンピュータサイエンスとプログラミングの進歩は進化プロセスです。古いものの上に新しい抽象化が導入されていますが、これらの新しいものは古いものを不要にするものではありません。

アナロジー...外傷外科医または心臓移植を専門とする外科医になるために勉強している場合でも、人体がどのように機能するか、細胞化学、臓器系、胸部を開く方法、そして迅速な方法を知る必要があります出血が止まった場合など...内視鏡機器や侵襲性の低い技術を発明したからといって、基礎を学んでいるわけではありません。それはあなたがもっと学ぶ必要があることを意味するだけです。


ええ、グレイの解剖学(テレビ番組ではなく実際の本)は1918年に書かれ、医学生は今でもそれを使用しています。
HLGEM

7

「クラウド」は要因ではありません。「クラウド」は、実際にリストしたほとんどの本よりもはるかに古いものです。それらの本のほとんどは中核的な原則に関するものであり、実際に頻繁に変わることはありません。フレームワークとライブラリは常に変化しますが、コードをどのように構成すべきかはそれほど変わりません。同様に、ポインターはポインターであるため、異なることを開始するわけではありません。あなたがリストした言語固有の本はCについてのみです。その場合、古い本は新しいものよりもはるかに便利です。


6

あなたが引用したリスト、彼らは時代遅れではありません。本が役に立たないほど主題が変わった場合にのみ、本は時代遅れになります。プログラミングの性質とC言語の両方は、出版以来ほとんど変化していません


6

実現する必要があるものの1つは、本質的に時代を超越した基本原則と、行き来する傾向のある実装が存在することです。

基本的な原則は基本的に、コンピュータサイエンスが多くの時間を費やす傾向がある退屈な理論であり、世界がその周りで変化しても有効であり続けます。これは、非常に古くて時代遅れの「Windows 3.11でWin32sを使用する方法」などとは対照的です。

物事を遠近感で言えば-幾何学の標準的なテキストは2000年前のものです。大学レベルまで教えられるほとんどの数学は、少なくとも300歳です。CSブックが古くないのは、フィールドがまだ新しいためです。


ブック1のユークリッドの命題1は、提供された定義、公理、および仮説から証明することはできません。今日から学ぶのは良い選択ではなく、千年後は時代遅れと見なされる可能性があります。
デビッド

1
@DavidThornley Euclids Elementsがジオメトリの標準テキストではない場合、何ですか?

6

いくつかの本は、ソフトウェア開発の実践にとって非常に基本的なアイデアを議論するため、時代を超越しており、常に適用されます。

Mythical Man Monthを例にとると、この本を読んでいたとき、1975年に書かれたものであることを忘れていました。本。他のすべてはここと今適用されます。Martin FowlerのPatterns of Enterprise Application Architectureのコピーは今でも保管していますが、現在は9歳ですが、再び時代を超越し、今日の仕事に適用できます。

私のお気に入りの本は、C#開発者でありUMLを避けているにもかかわらず、ピーター・コードのUMLでJavaモデリング(1999)です。

第一世代の開発者から学ぶことをお勧めします。彼らは私たちが今歩いている地面に足を踏み入れており、彼らの苦労して得た知恵は、私たちが今やっていること/学ぶことのジャンプスタートを手伝うのに役立つからです。


MMM-

5

ソフトウェアの中核となる原則は、過去20年間変わっていません。スタック、ツリー、リンクリストは、当時と同じように機能します。「XOR」はまだ同じことを意味します。バイトにはまだ8ビットがあります。

「マルチプラットフォーム開発」は新しいアイデアであることを真剣に提案していますか?なぜCが発明されたと思いますか?

「クラウド」はマーケティングの流行語です。以前は特定の種類のものを意味していましたが、使いすぎによって衰退してきました。最近では、ネットワークを介してリモートサーバーと通信するものがあるときはいつでも、マーケティング担当者は「クラウド」ラベルを貼り付けます。それは無意味な言葉なので、それについて話すことは本当に意味がありません。

あなたの61歳の教授は知らないので、彼を保証することはできません。一方、あなたは明らかにあなたが思っているほど賢くありません。教授の話を聞いてください。何かを学ぶことができるでしょう。


「愚か者であることによって年をとることはできません。多くの若い賢明な人たちは、彼らがマザーファッカーとして死にました。」-リチャードプライアー


2
「一方で、あなたはあなたが思っているほど賢くないことは明らかです」。私がそんなに賢いと思ったら、私はそのような質問を決してしなかったでしょう。
オリビエポンス

4

以下に、非常に古くて古い本をいくつか示します。

  • Art of Computer Programming、vol。1-3、D。クヌース。これらは1968年から1981年の間に公開されました!真空管はもう使用していません、人々!これらの本のすべては不自由です。PythonとRubyに関する議論はどこにありますか?

  • コンピューターと難治性:1979年、MR GareyとDS JohnsonによるNP完全性の理論へのガイド。これらの問題はすべて、おそらく今までに解決されています。

過去3年間にPythonに焦点を当てた本が書かれていなかった場合、読む価値はありません。


公平を期すために、少なくともTAoCPが疑似コードにアセンブラーを使用することは、より現代的な言語に近い疑似コードを使用するより現代的なアルゴリズムの本が、埋め込み用に作成していない私たちの90%システム。
ピーターテイラー

-1:毎週または2週間、Knuthが非常に詳細に説明した何かを処理するためのアルゴリズムを求めている人がいます。1981年より新しい分類アルゴリズムの1つに名前を付けてください。並列ソートに答えたいですか?Knuthには、データの並列ソートに関するページがあります。Pythonの本については正しいかもしれませんが、「今週の風味」の本とエンジニアリングクラフトの本には大きな違いがあります。
sarnold

5
どうやらいくつかの皮肉検出器が...壊れている
DaveE

1
<皮肉> "コメント" </皮肉>
NWS

1
この答えは、2020年に予定されている2011年および第5巻に発行されたThe Art of Computer Programming Volume 4A についての言及が含まれていれば、さらに良いポイントになると思います!
マークブース

3

それらの本は時代遅れではなく、それらは古典です。

カプランスキーを引用するには、「現在取り組んでいる問題から切り離された何か新しいことを毎日少し時間を費やして(切り離しは一時的なものであることを忘れないでください)、マスター読んでください


3

コードの読みやすさと使用方法を変える進歩(LINQが思い浮かぶ)があるとき、あなたの言うことを知っていますが、単にこれらの本が古くなっているからといって、読者に素晴らしい教訓を提供しないという意味ではありません。

彼らが使用するプログラミング言語は流行しなくなったかもしれませんが、プログラミング言語の背後ある理論は今日でも真実です。これらの本のほとんどは、基本を非常によくカバーすることをポイントにしており、基本はそれほど変わっていません。


2
彼らが使用するプログラミング言語は、ほとんどが「C」です-彼らは流行から脱落したかもしれませんが、使用が大幅に増加しました。
マーティンベケット

3
SICPを読む必要があります。LINQがどこから来たのかについて目を開くかもしれません:)
ジョリスティマーマンズ

1

コンピュータサイエンス業界はまだ非常に若いです。30年前に書かれた本は、まだ価値があり、完全な理解に必要であると考えています。抽象概念の消化には時間がかかる場合があります。


1

一部のマイナーな部分はこれらすべての本で廃止されていますが、99%は依然として素晴らしいです。

アルゴリズムの本はゆっくりと老化します。アルゴリズムは数学であり、数学は急速に変化していません。確かに、特定の状況で優れた新しいアルゴリズムの研究がまだあります(たとえば、40000 +桁の長い数字を乗算するためのFurerのアルゴリズム(2007)Schonhage-Strassen)が、基本を学ぶために必要な導入(分割統治) / Dynamic Programming / Linear programming / etc)。アルゴリズムについて賢明に考えることを学ぶことができます。

K&Rから標準Cを学習することは、依然として最良のソースです。ただし、環境のセットアップ方法に関するセクションを信頼するかどうかはわかりません。

SICPは素晴らしい本であり、素晴らしい言語であるlispを教えることで現代のCSの基礎を教えています。ただし、Lispは間違いなく最近では最も有用な言語ではありません。他の人はLispは彼らの秘密兵器であると主張しますが、JavaやPythonのような言語を学ぶことは、ソートまたはリンクリストまたは配列またはビッグO表記法を実装する方法を学ぶ必要のない非常に悪いプログラマーを最初に作り、非常に非効率的なことをすることになります。

いくつかのCode CompleteまたはPragmatic Programmerは、特にCで何かを行う方法に焦点を当てているか、最善の方法を使用して推奨されるソリューションを提供しているため、特に新しい言語(python / ruby​​ / C ++ 11など)でプログラミングしている場合は、あまり関連性がありません当時入手可能なツール(git / bzr / hg / svnのような最新のツールではなく、バージョン管理用のCVS / RCSなど)。しかし、バージョン管理が必須である方法と、それがシームレスで自己文書化され、絶対的な必須である理由のロジックをどのように行う必要があるかを考えることは依然として良いことです。

または、基本的なUNIXエディター+ UNIXツール用のIDEに対するPPの推奨事項-find / awk / locate / grep / sedの使用方法を学ぶべきではないというわけではありませんが、優れたIDEは多くの場合時間を節約できます。たとえば、emacsは構文の強調表示や単純なコード補完を行うことができます。しかし、良いIDEは、入力時に関数宣言をツールチップに与える、またはコードを分析して未使用の変数をマークオフする、コードのセクションを簡単に折りたたむなどを行うと言います


1

現代のコンピューティングと、それらの本が書かれたときの現在のものとの間に違いはありませんか?学ぶべきことが変わると思いますか?過去20年間の動向を考慮すべきではないでしょうか?

はい、はい、はい。

それはそれらの本を時代遅れにしません。「現代のコンピューティング」は信じられないほど広い用語です。ただし、Cプログラミングが含まれているため、「Cプログラミング言語」は依然として関連書籍です。これは、含まれたアルゴリズムを、その「アルゴリズムの概要は、」まだ関連の本です。などなど。

マルチプラットフォーム開発のマルチプラットフォーム開発(phonegapを参照)に対する現在の重点は、今日学んでいることを変えるべきでしょうか?

App Storeのほとんどのアプリ(最も人気のあるモバイルプラットフォームを例として使用するため)は、Cのスーパーセットである80年代前半の言語であるObjective Cで記述されています。

「クラウド」は流行か未来かと思いますか?

それは私たちのプレゼントです。

学生が大学を卒業するとき、彼らは本当の開発者であり、すぐに働くことができるはずです

しかし、それはどういう意味ですか?

学校が特定の仕事に備えるには、言語、API、フレームワーク、プラットフォーム、ツール、コラボレーション戦略などが多すぎます。学校は基礎を築くことができるだけで、機械の仕組み、アルゴリズム、データ構造、コード構築、分解戦略、いくつかのツールなどに関する基本的な作業モデルを提供します。

「本当の開発者」とは、すべてを知っている人ではなく、この種の仕事をする能力を持ち、理論と実践の基礎を持ち、学習方法を知っている人のことです。


1
「学習方法」コメントの+1-それは大学の目的であり、暗記された職業訓練ではありません。
DaveE

1

わかりましたので、私ははるかに理論的な答えを提供するつもりです。私の意見では明らかなように、これらの本はプログラマとして私たちがやっていることの基礎であり、これらの新しいフレームワークはすべて同じ古い柱に基づいて構築されていると答えた皆さんに同意します。

ここに私の2セントがあります-私のものではありません、私はセント・アクィナスと彼の前のアリストテレスからそれを学びました。

An abstraction is useless to someone who doesn't understand the particulars.

フォンノイマン以来、コンピューターの仕組みは変わっていません。同様に、優れたプログラマーになるために学ぶ必要がある詳細は、von-neumannモデルが廃止されるまで同じです。アセンブリは、コンピューターの言語です...それを学ぶ、言い訳はありません。

Cは、WindowsとUnixの両方のネイティブ言語です。それを学ぶか、新しい貿易を見つけてください。もしあなたがJAVAやC#に直行した人の1人であれば、あなたは優れたプログラマーかもしれませんが、C--ピリオドを学べばはるかに優れたプログラマーになるでしょう。

アルゴリズムとデータ構造はコンピュータープログラムの基礎です。

他のすべては、これらの中核分野の抽象化です。適切に使用すると抽象化は素晴らしいです。真剣に、私はすべてのプロジェクトの75%でC#を使用しています。ただし、それらがどのように機能し、それらなしで機能するかを理解するのに時間をかけなければ、彼らはあなたを愚かにします。はるかに優れたアプローチがあり、回避できるバグがある場合は、ことわざの四角い穴に収まるようにソフトウェアを作成するのに無限の時間を費やします。ソフトウェア開発は習熟しなければならない技術であり、結局のところ、ツールはめったに変更されません。だからこそ、これらの本はとても重要です。

これらすべてのJAVAおよびC#のみのプログラマー、tsk、彼らのほとんどはStar Trekのエピソードを見たこともないと思います!


1

メンターからの言葉を聞いた:

「良いアドバイスには理由があるので、いつそれが良いアドバイスではなくなったかを知ることができます。」したがって、本の用語では、YをXで処理する理由を説明する本は、そのアドバイスがもはや有効ではないことを知らせます。言語Xのクラッシュコースのいくつかのように、「常にこれを行う、ただそれを行う」本はあまり良くありません。

「24時間でunixを学ぶ」と呼ばれるものを見ました。本の厚さは約8cmでした。

今日、流行しているものが明日にscされるかもしれないことを覚えておいてください。以下はすべて、かつて主流と見なされていました(昨日流行)、現在はそうではありません:

  • 後藤
  • シングルエントリーシングルエグジット
  • ハンガリー記法
  • ウォーターフォールアプローチ

また、かつては完全に嫌悪感を抱いていたものの、現在受け入れられているものがいくつかあります。

  • 問題を解決するためのツールとしての再帰(初期のBASIC時代のラジカル)
  • malloc / newを使用して実行時にメモリを割り当てる
  • C ++ STLの使用
  • リアルタイムシステムのガベージコレクション言語

理由を知ってください。古い仮定がいつ新しい現実に置き換わったのかがわかるので、アドバイスも必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.