web-dev-qa-db-ja.com

評価の高い、しかしプログラミングに関する古い本の有効期限はありますか?

すべてのプログラマーが読むべき本についての質問 を読んだ後、以下は時代遅れであると考えるべきかどうか疑問に思います。

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

たとえば、私の61歳の先生は非常に上手に説明していますが、25年前と今から教え始めたときからのすべてを考慮に入れることを忘れています。

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

51
Olivier Pons

これらの本は、開発の原則についてです。これらの原則は、本質的に言語に依存せず、場合によってはパラダイムに依存しません(OOP、関数型プログラミング、命令型言語)。

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

"How to learn XXXXX in YY days"のような言語に関する書籍。XXXXXは言語、YYは最終的に(場合によっては実際には非常に迅速に)古くなります。これは、本質的に、進化するものに関するものであるため、または交換して古くなります。

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

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

誇大宣伝/でたらめな流行語の罠に陥らないでください。ソフトウェア職人のスキルを向上させる方法に集中してください。

それが熟練した開発者になる唯一の方法であるため、他の素晴らしいスピリットが私たちの前に発明し、学んだものから学ぶことに焦点を当てます。

92

それらの本はすべて非常に、非常に、非常に古く見えます。」

Psychology-Computer-Programming (1971)-1970年の100万倍ものプログラマーが、プログラムを設計する方法、プログラムが犯す間違い、およびそれらを回避する方法の心理学がかつてないほど重要になっています。

ソフトウェアツール (1976)-フレームワーク、ユーティリティ、スクリプト、プラグインのコレクションであるWebでは、ソフトウェアツールのアイデアがこれまで以上に重要になっています。

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

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

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

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

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

ps。あなたのクールな新しいiWhatsitは、1977年に開発されたBSDを実行します。これで、子供たちは私の芝生を降りました!

80
Martin Beckett

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

私見非常に優れた本が何十年もの間人気を保っていることは驚きではありません-それはそれらがいかに優れているかを示しています。しかし、私はあなたがリストした候補者のそれぞれについてあなたに何かを伝えることができると思います:

Code complete: 2nd edition = may, 2004

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

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をよく知っている人によって書かれたC++コードの保守プログラミングを行う必要がある場合、この本は必見です。

最後に、テクノロジーに限定されずに、「現在の現実」をさらに考慮した本を求めていました。それでは、「現在の現実」とは何であり、「非テクノロジー」側で何が変わったのでしょうか。ここに、このリストが完全である、または正しい優先順位があることは言うまでもなく、過去10年間のポイントをいくつか示します。

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

(私はこのテクノロジーに固有だと思うので、ここではWebやアプリの開発については何も記載していません)。

トピック1と2、特に2008年からの "Clean Code""レガシーコードで効果的に動作する" の良い本が2004年から存在します。あなたが探している「新しい」本のどれですか?

28
Doc Brown

「コードコンプリート」、「実用的なプログラマ」、「SICP」について、あなたが私の会社で始めて、より高いレベルに到達したいすべての新しい開発者のための私の推奨読書リストに載っています。

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

13

私はそれらの本をすべて読んだわけではありませんが、Code CompleteとThe Pragmatic Programmerを持っています。 これらの書籍は古くなっているわけではありません。少し錆びた段落がいくつか含まれている可能性がありますが、ほとんどのコンテンツは現在も関連しています。

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

類推...あなたが外傷外科医であろうと心臓移植を専門とする外科医であろうと研究していても、人体の仕組み、細胞化学、臓器系、胸部を開く方法、そして迅速に行う方法を知る必要があります出血が発生した場合は出血を止めるなど。彼らが内視鏡装置や低侵襲性の技術を発明したからといって、基本を学ぶためにフックから外れているわけではありません。それはあなたがもっと学ぶ必要があることを意味するだけです。

10
c_maker

「クラウド」は要素ではありません。 「クラウド」は、実際には、リストしたほとんどの書籍よりもはるかに古くなっています。それらの本のほとんどは中核的な原則に関するものであり、実際に頻繁に変更されることはありません。フレームワークとライブラリは常に変化しますが、コードをどのように構成するかはそれほど変わりません。同様に、ポインターは依然としてポインターであり、それが原因で別のことを開始しません。あなたがリストした言語固有の本はCに関するものだけです。その場合、その古い本は新しいものよりもはるかに有用です。おそらくそれは、使用するCコードが開発された時期の近くに書かれたためです。

7
Ryathal

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

Mythical Man Month を例にとると、この本を読んでいたとき、1975年に書かれたものであることを忘れていました。本の日付が記載されている唯一のコンテンツです。他のすべてがここと今に当てはまります。 Martin Fowlerの Patterns of Enterprise Application Architecture のコピーを今も保存していますが、9歳になりましたが、時代を超越し、今日の仕事にも適用できます。

私のお気に入りの本は、Peter Coadの Java Modeling in Color with UML (1999)ですが、私はC#開発者であり、UMLを避けています。

第一世代の開発者から学ぶのはうまくいきます。なぜなら、彼らは私たちが今歩んでいる地面を踏み越えてきており、彼らの苦労して得た知恵は、今日私たちがしていること/学習していることへのジャンプスタートを得るのに役立つからです。

6
Michael Brown

あなたが引用したリスト、それらは時代遅れではありません。主題が十分に変更されて役に立たなくなった場合にのみ、本は古くなります。プログラミングの性質とC言語はどちらも、公開以来ほとんど変わっていません。

6
Tom Squires

実現する必要があることの1つは、本質的には時代を超えない根本的な原則と、行き来する傾向のある実装が存在することです。

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

物事を全体的に見ると、幾何学に関する標準的なテキストは2000年前のものです。大学レベルまでのほとんどの数学は、少なくとも300歳です。 CSブックが古くないのは、フィールドがまだ新しいからです。

6
user1249

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

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

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

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


「ばかじゃないからといって年をとる必要はありません。多くの若い賢い人たちが、マザーファッカーとして死にました。」 -リチャード・プライアー

5
Mike Baranczak

以下は、非常に古くて時代遅れの本です。

  • アートオブコンピュータープログラミング、vol。 D.クヌースによる1-3。これらは1968年から1981年の間に発行されました!真空管はもう使っていません!これらの本のすべてが不十分です。 PythonおよびRubyに関する議論はどこにありますか?

  • コンピュータと扱いにくさ:1979年のM. R. GareyとD. S. JohnsonによるNP完全性理論のガイド。これらの問題はすべて、おそらく解決されています。

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

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

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

3
Onion-Knight

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

引用するには Kaplansky 、 "は、現在作業している問題から切り離されている新しいものを学習するために毎日時間を費やします(切り離しは一時的である可能性があることに注意してください)。 マスターを読み取ります "

3
Francesco

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

1

いくつかのマイナーな部分はこれらのすべての本で時代遅れですが、99%はまだ素晴らしいです。

アルゴリズムの本はゆっくりと古くなります。アルゴリズムは数学であり、数学は急速に変化していません。確かに、特定の状況で優れた新しいアルゴリズム(たとえば Furer's algorithm (2007) Schonhage-Strassen を40000+桁の長い数値を一緒に乗算すること)への研究はまだありますが、アルゴリズムについて慎重に考えることを学ぶことができるように、基本(分割統治/動的プログラミング/線形プログラミングなど)を学ぶために必要な導入。

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

SICPはすばらしい本であり、すばらしい言語であるLISPを教えることを通して現代のCSの基礎を教えます。ただし、LISPは間違いなく現在最も有用な言語ではありません。ただし、LISPが秘密兵器であり、Javaまたはpython=のような言語を学習すると、最初にソートの実装方法やリンクされたリストまたは配列またはbig-O表記法を使用すると、非常に非効率的な処理が行われます。

特に新しい言語でプログラミングしている場合は、コードコンプリートまたはプラグマティックプログラマーの一部はあまり関連性がありません(たとえば、python/Ruby/C++ 11))、多くの場合、Cで何かを行う方法に焦点を当てているか、現時点で利用可能な最良のツール(git/bzr/hg/svnのような最新のツールではなく、バージョン管理用のCVS/RCSなど)を使用して推奨されるソリューションを提供しています。どのようにバージョン管理が必須であり、どのようにシームレスで自己文書化する必要があるかを考え、それが絶対に必須である理由の論理を検討します。

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

1
dr jimbob

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

はい、はい、そしてはい。

それはそれらの本を時代遅れにしないわけではない。 「モダンコンピューティング」は、信じられないほど広い用語です。ただし、それはincludes Cプログラミングなので、「Cプログラミング言語」は依然として関連する本です。 includesアルゴリズムなので、「アルゴリズムの概要」は関連する本です。などなど。

マルチプラットフォーム開発への現在の重点は、マルチプラットフォーム開発(phonegapを参照)によって、私たちが今日学ぶことを変えるべきでしょうか?

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

「クラウド」は流行か未来か?

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

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

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

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

「本当の開発者」とは、すべてを知っている人ではなく、この種の仕事に対応できる人であり、理論と実践の基礎を持ち、学ぶ方法を知っている人です。終了します。

1
Mud

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

これが私の2セントです。実際の鉱山ではなく、セントアクィナスと彼の前のアリストテレスから学びました。

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

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

Cは、WindowsとUnixの両方のネイティブ言語です。それを学ぶか、新しい取引を見つけてください。あなたがJavaまたはC#に直行した人の1人である場合、あなたは優れたプログラマーかもしれませんが、C--期間を学ぶなら、はるかに優れたプログラマーになるでしょう。

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

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

これらのすべてJavaおよびC#のみのプログラマー、tsk、ほとんどの人がスタートレックのエピソードさえ見たことがないでしょう!

1
Jonathan Henson

私はメンターからの格言を聞いた:

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

「24時間でunixを学ぶ」という名前の本を見ました。本は約8cmの厚さで、多くの人が24時間ですべてのページを読むことさえできないと思います:)

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

  • 後藤
  • 単一のエントリ、単一の出口
  • ハンガリー語表記
  • ウォーターフォールアプローチ

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

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

理由を知っておくと、古い仮定が新しい現実に置き換えられたときに、アドバイスもわかるはずです。

1
anon