-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathWhereNextCh.tex
More file actions
337 lines (289 loc) · 13.8 KB
/
WhereNextCh.tex
File metadata and controls
337 lines (289 loc) · 13.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
\chapter{Moving On from Here}
\label{wherenextch}
%
%
% Copyright 2002 Jonathan Bartlett
%
% Permission is granted to copy, distribute and/or modify this
% document under the terms of the GNU Free Documentation License,
% Version 1.1 or any later version published by the Free Software
% Foundation; with no Invariant Sections, with no Front-Cover Texts,
% and with no Back-Cover Texts. A copy of the license is included in fdl.xml
%
Congratulations on getting this far. You should now have a basis for
understanding the issues involved in many areas of programming. Even
if you never use assembly language again, you have gained a valuable
perspective and mental framework for understanding the rest of computer
science.
There are essentially three methods to learn to program:
\begin{itemize}\item From the Bottom Up - This is how this book teaches. It starts with low-level programming, and works toward more generalized teaching.
\item From the Top Down - This is the opposite direction. This focuses on what you want to do with the computer, and teaches you how to break it down more and more until you get to the low levels.
\item From the Middle - This is characterized by books which teach a specific programming language or API. These are not as concerned with concepts as they are with specifics.
\end{itemize}
Different people like different approaches, but a good programmer takes all of
them into account. The bottom-up approaches help you understand the machine
aspects, the top-down approaches help you understand the problem-area aspects,
and the middle approaches help you with practical questions and answers. To
leave any of these aspects out would be a mistake.
Computer Programming is a vast subject. As a programmer, you will need
to be prepared to be constantly learning and pushing your limits. These
books will help you do that. They not only teach their subjects, but also
teach various ways and methods of \emph{thinking}. As
Alan Perlis said, "A language that doesn't affect the way you think about
programming is not worth knowing"
(http://www.cs.yale.edu/homes/perlis-alan/quotes.html). If you are
constantly looking for new and better ways of doing and thinking, you
will make a successful programmer. If you do not seek to enhance yourself,
"A little sleep, a little slumber, a little folding of the hands to rest -
and poverty will come on you like a bandit and scarcity like an armed man."
(Proverbs 24:33-34 NIV). Perhaps not quite that severe, but still, it is best
to always be learning.
These books were selected because of their content and the amount of respect
they have in the computer science world. Each of them brings something
unique. There are many books here. The best way to start would be to
look through online reviews of several of the books, and find a starting
point that interests you.
\section{From the Bottom Up}
This list is in the best reading order I could find. It's not necessarily
easiest to hardest, but based on subject matter.
\begin{itemize}\item \documentname{Programming from the Ground Up} by Jonathan Bartlett
\item \documentname{Introduction to Algorithms} by Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest
\item \documentname{The Art of Computer Programming} by Donald Knuth (3 volume set - volume 1 is the most important)
\item \documentname{Programming Languages} by Samuel N. Kamin
\item \documentname{Modern Operating Systems} by Andrew Tanenbaum
\item \documentname{Linkers and Loaders} by John Levine
\item \documentname{Computer Organization and Design: The Hardware/Software Interface} by David Patterson and John Hennessy
\end{itemize}
\section{From the Top Down}
These books are arranged from the simplest to the hardest. However, they
can be read in any order you feel comfortable with.
\begin{itemize}\item \documentname{How to Design Programs} by Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, and Shiram Krishnamurthi, available online at http://www.htdp.org/
\item \documentname{Simply Scheme: An Introduction to Computer Science} by Brian Harvey and Matthew Wright
\item \documentname{How to Think Like a Computer Scientist: Learning with Python} by Allen Downey, Jeff Elkner, and Chris Meyers, available online at http://www.greenteapress.com/thinkpython/
\item \documentname{Structure and Interpretation of Computer Programs} by Harold Abelson and Gerald Jay Sussman with Julie Sussman, available online at http://mitpress.mit.edu/sicp/
\item \documentname{Design Patterns} by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides
\item \documentname{What not How: The Rules Approach to Application Development} by Chris Date
\item \documentname{The Algorithm Design Manual} by Steve Skiena
\item \documentname{Programming Language Pragmatics} by Michael Scott
\item \documentname{Essentials of Programming Languages} by Daniel P. Friedman, Mitchell Wand, and Christopher T. Haynes
\end{itemize}
\section{From the Middle Out}
Each of these is the best book on its subject. If you need to know these
languages, these will tell you all you need to know.
\begin{itemize}\item \documentname{Programming Perl} by Larry Wall, Tom Christiansen, and Jon Orwant
\item \documentname{Common LISP: The Language} by Guy R. Steele
\item \documentname{ANSI Common LISP} by Paul Graham
\item \documentname{The C Programming Language} by Brian W. Kernighan and Dennis M. Ritchie
\item \documentname{The Waite Group's C Primer Plus} by Stephen Prata
\item \documentname{The C++ Programming Language} by Bjarne Stroustrup
\item \documentname{Thinking in Java} by Bruce Eckel, available online at http://www.mindview.net/Books/TIJ/
\item \documentname{The Scheme Programming Language} by Kent Dybvig
\item \documentname{Linux Assembly Language Programming} by Bob Neveln
\end{itemize}
\section{Specialized Topics}
These books are the best books that cover their topic. They are thorough and
authoritative. To get a broad base of knowledge, you should read several
outside of the areas you normally program in.
\begin{itemize}\item Practical Programming - \documentname{Programming Pearls} and \documentname{More Programming Pearls} by Jon Louis Bentley
\item Databases - \documentname{Understanding Relational Databases} by Fabian Pascal
\item Project Management - \documentname{The Mythical Man-Month} by Fred P. Brooks
\item UNIX Programming - \documentname{The Art of UNIX Programming} by Eric S. Raymond, available online at http://www.catb.org/~esr/writings/taoup/
\item UNIX Programming - \documentname{Advanced Programming in the UNIX Environment} by W. Richard Stevens
\item Network Programming - \documentname{UNIX Network Programming} (2 volumes) by W. Richard Stevens
\item Generic Programming - \documentname{Modern C++ Design} by Andrei Alexandrescu
\item Compilers - \documentname{The Art of Compiler Design: Theory and Practice} by Thomas Pittman and James Peters
\item Compilers - \documentname{Advanced Compiler Design and Implementation} by Steven Muchnick
\item Development Process - \documentname{Refactoring: Improving the Design of Existing Code} by Martin Fowler, Kent Beck, John Brant, William Opdyke, and Don Roberts
\item Typesetting - \documentname{Computers and Typesetting} (5 volumes) by Donald Knuth
\item Cryptography - \documentname{Applied Cryptography} by Bruce Schneier
\item Linux - \documentname{Professional Linux Programming} by Neil Matthew, Richard Stones, and 14 other people
\item Linux Kernel - \documentname{Linux Device Drivers} by Alessandro Rubini and Jonathan Corbet
\item Open Source Programming - \documentname{The Cathedral and the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary} by Eric S. Raymond
\item Computer Architecture - \documentname{Computer Architecture: A Quantitative Approach} by David Patterson and John Hennessy
\end{itemize}
\section{Further Resources on Assembly Language}
In assembly language, your best resources are on the web.
\begin{itemize}\item http://www.linuxassembly.org/ - a great resource for Linux assembly language programmers
\item http://www.sandpile.org/ - a repository of reference material on x86, x86-64, and compatible processors
\item http://www.x86.org/ - Dr. Dobb's Journal Microprocessor Resources
\item http://www.drpaulcarter.com/pcasm/ - Dr. Paul Carter's PC Assembly Language Page
\item http://webster.cs.ucr.edu/ - The Art of Assembly Home Page
\item http://www.intel.com/design/pentium/manuals/ - Intel's manuals for their processors
\item http://www.janw.easynet.be/ - Jan Wagemaker's Linux assembly language examples
\item http://www.azillionmonkeys.com/qed/asm.html - Paul Hsieh's x86 Assembly Page
\end{itemize}
%
%
% As you learn more, continue trying to build it upon the foundation you
% have already laid. When you learn new languages and APIs, remember that
% they all eventually go down to the assembly language level. It's nothing
% that you couldn't do yourself if you had the time. Everything is within
% a reaching distance.
%
%
%
% That said, you still have much to learn which is not covered by this book.
% This chapter describes what you need to learn, and where to find that
% information. In fact, programming is only one part of what programmers
% do. Programmers generally need to be knowledgeable in the following areas:
%
% \begin{itemize}% \item Logical Data Organization
% \item Physical Data Organization
% \item Program Architecture
% \item Project Management
% \item System Administration and Networking
% \item Security
% \end{itemize}
%
%
% <sect1>
% \textbf{Logical Data Organization}
%
%
% Programs operate on data. They are used to process data, produce new data,
% and be used for data entry. Therefore, knowing about data organization
% is extremely important. Logical data organization is mostly learning how
% to define the relationships between data. Note that logical organization
% is simply how data are related to each other logically, not how it is actually
% stored within a computer. Learning about relational
% databases is probably the best way to gain skill in this area.<footnote>
%
Please note that learning SQL is not all there is to know about
% databases and logical data organization.
</footnote> Books that
% will help you in this area are:
%
% \begin{itemize}% \item
% \end{itemize}
%
%
%
%
%
% <sect1>
% \textbf{Physical Data Organization}
%
%
% Physical data organization consists of methods of storing data on a computer
% for retrieval and update. This field is mostly referred to as data structures.
% This book only really talks about two data structures - the array and
% the linked list. However, there are many other data structures available
% to you as a programmer. Having a background in assembly language will
% help you understand data structure design much better.
%
%
%
% The following books are great ones for learning about data structures:
%
% \begin{itemize}% \end{itemize}
%
%
%
%
% <sect1>
% \textbf{Program Architecture}
%
%
% Program architecture, or how to design and write programs effectively,
% is not taught in this book. This book teaches the concepts of how
% programming works, but not how to go about designing and writing a
% large-scale program. The best books on this subject are:
%
% \begin{itemize}% \end{itemize}
%
% In addition to these books, one of the best ways to learn good program
% design techniques is to read well-architected programs. The Free Software
% and Open Source communities contain a number of programs which can show
% you great programming practices on both large and small scales.
%
%
%
%
% <sect1>
% \textbf{Project Management}
%
%
% A lot of programming is project management - learning to gather requirements,
% calculate return on investment, estimate schedules, talk to people about
% requirements, status reports, etc. Contrary to popular thought, successful
% programmers almost always have excellent communication skills, especially
% with nontechnical people. Being able to communicate technical problems
% and options to nontechnical people is an essential skill. Being able to
% listen to nontechnical people and translating their needs into technical
% requirements is also an essential skill. Programming without effective
% communication is a hobby, not a profession. Being able to run a project
% successfully can often be more important than the technical skills, especially
% when outsourcing is an option.
%
%
%
% Books on project management include:
%
% \begin{itemize}% \end{itemize}
%
%
%
%
%
% <sect1>
% \textbf{System Administration and Networking}
%
%
% In small companies, the programmer and the system administrator are often
% the same person. However, even when the tasks are separate, the programmer
% needs to have some understanding of system administration concepts. Otherwise
% you are likely to create headaches for the system administrator who has to
% install and administer your program on a daily basis. System administration
% varies quite a bit from organization to organization, but there are still
% books you can read to get a good grasp on the subject, including:
%
% \begin{itemize}% \item <remark>FIXME - what books go here?</remark>
% \end{itemize}
%
%
%
%
% <sect1>
% \textbf{Security}
%
%
% Security is a fundamental concept to computer programmers, especially when
% writing web applications, server software, or any software that could be
% used as a component of such systems. In fact, because most software
% interacts with the network and outside systems in some way, all programmers
% should have a thorough understanding of the principles involved in developing
% secure applications.
%
%
%
% Books with
%
%
%
% <sect1>
% \textbf{Review}
%
% <sect2>
% \textbf{Know the Concepts}
%
% \begin{itemize}% \item
% \end{itemize}
%
%
%
% <sect2>
% \textbf{Use the Concepts}
%
% \begin{itemize}% \item
% \end{itemize}
%
%
%
% <sect2>
% \textbf{Going Further}
%
% \begin{itemize}% \item
% \end{itemize}
%
%
%