You are not logged in.
I am relatively new to programming and would like a reading list of must-read programming references. I know several languages, but I am not looking for materials about any particular language; instead, I would like to read up on more fundamental things such as programming concepts, programming algorithms, programming paradigms, computer architectures, programming style, etc. What are the classic, must-read books and articles that I should begin reading? Thank you for your suggestions.
Offline
Randall Hyde's "The Art of Assebly Language" is the text that really made me understand what was going on.
It is about assembly language(s), but the concepts apply just as well to any other language, and you learn a bit about hardware along the way.
Edit: I just looked at that online, that is not the same book I was talking about. I don't rember the author, though that name sounded familiar, though I could have sworn the title was "The art of assembly language".
Edit again: I was right the first time. But they got rid of the wonderful online version I read before which was simple latex->html with no borders/banners/ads/etc, now it's virtually unreadable online, but you can download the whole book for free as a series of pdfs. I highly recommend this one.
Last edited by Trilby (2012-06-01 23:58:14)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Not a book, but I really like this series of lectures. you can't really learn much about programming without learning some code, I think, but specifics about language aren't all that important.
https://www.youtube.com/view_play_list? … C7F4A1F852
EDIT:
Please do report back if you find it, Trilby. I'm interested as well.
Last edited by Bellum (2012-06-01 23:44:30)
Offline
Structure and Interpretation of Computer Programs (SICP). It uses Scheme as the teaching language, but covers a lot of general programming topics. Additionally, there's Knuth's The Art of Computer Programming (TAOCP), but it's very hardcore and definitely *not* something you can sit and read through from cover to cover. If you can, you're probably a genius or something.
Offline
Well, C++ may not be the very best language, some people hate it with good reasons, but still I got a lot from working through (about half of) Bjarne Stroustrup's "Programming: Principles and Practice Using C++". The title says it all - it is a very good book about programming principles and practice, with lots of reasonably difficult but doable and educational exercises; in this book, C++ is more the medium than the message.
I also think everyone involved in the formal sciences, including computer science, should read Godel Escher Bach from cover to cover. This exploration of the nature, possibilities and limitations of formal systems is both indispensable and entertaining.
Offline
Please do report back if you find it, Trilby. I'm interested as well.
See my second edit. And here's one link to get it from. I really wish they hadn't mucked up their website, though, because the html version is dreadful now. I just tried downloading a PDF, and it doesn't look like it was all there.
Edit: Found a much better version for reading online here - clean html
Last edited by Trilby (2012-06-02 00:09:45)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Thanks. I'd been meaning to look for a good book on asm.
Offline
Bellum wrote:Please do report back if you find it, Trilby. I'm interested as well.
See my second edit. And here's
one linkto get it from. I really wish they hadn't mucked up their website, though, because the html version is dreadful now. I just tried downloading a PDF, and it doesn't look like it was all there.Edit: Found a much better version for reading online here - clean html
Assembly language is definitely something I want to learn. (By the way, it looks like the two links you posted are for different books altogether.) My only hesitation is that assembly language is architecture-dependent, so I wonder whether it's worth my time (or even feasible) learning x86 on an 64-bit machine.
Offline
Not a book, but I really like this series of lectures. you can't really learn much about programming without learning some code, I think, but specifics about language aren't all that important.
https://www.youtube.com/view_play_list? … C7F4A1F852
EDIT:
Please do report back if you find it, Trilby. I'm interested as well.
These seem very helpful, but I think my competence is already beyond the scope of these lectures. That said, I was never taught in a formal setting, so it may help to watch and listen anyway.
Offline
I've never used assembly for a 64-bit system, but I'm sure most of the same concepts apply. In fact I'm pretty sure any change is analogous to the change from 16 to 32 which wasn't that drastic.
With assembly language, learning the core concepts is the biggest step, the difference between 16 and 32 bit wasn't like learning a new language, rather it was just having more and bigger registers. I don't do any actual programming in assembly - I dabbled a bit for fun, but I dont 'use' it. But the concepts I learned through assembly have helped me in every other programming language. Given that, I'm sure a book on 32-bit assembly would be useful for a 64-bit system.
Consider too that assembly is a bit of a dying art. Pair that with the fact that 64-bit systems are relatively new, and there won't be many people who can write a quality book about their lifetime of experience with 64-bit assembly.
Lastly, (in this very disorganized listing of barely related points), 32-bit to 64-bit is also a trivial change compared to the various instruction sets that have been used. If/when you understand the similarities and differences between the various assembly languages and instruction sets, is when you really start using the strengths of your particular architecture. (I'm tempted to make a Matrix reference "There is no spoon"). My favorite assembly languages, just for the fun of it, are One-Instruction-Set systems. When I realized that one single instruction used repeatedly can create the diversity of programs we use ... I was in geek heaven. I put that day on par with learning about hardware-software interchangability, and the fact that our modern computers are made up of a vast series of only one type of logic gate ... and the day I learned some lamba calculus ... (end geekgasm)
Anyhow, learning to 'think' in assembly language can help all your programming (IMHO) regardless of whether you ever speak to your computer in that language. So, yes, I'd say the 32-bit book would be worth reading even if your current computer is 64.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Bellum wrote:Not a book, but I really like this series of lectures. you can't really learn much about programming without learning some code, I think, but specifics about language aren't all that important.
https://www.youtube.com/view_play_list? … C7F4A1F852
EDIT:
Please do report back if you find it, Trilby. I'm interested as well.These seem very helpful, but I think my competence is already beyond the scope of these lectures. That said, I was never taught in a formal setting, so it may help to watch and listen anyway.
That was my perspective as well. I think watching that series first is still helpful, but if it turns out you feel like you aren't learning anything, there is a second and third class available. I hadn't gotten around to watching them yet, though, so idk.
Offline
@nbtrap: If you aren't scared by math and theory, read "Types and programming languages" by Benjamin Pierce. It's the text book on type systems in programming languages, and explains their design and implementation from ground up, touching a variety of other topics from compiler construction to language semantics on the fly. However, unlike many other books on language theory it's well-written, and doesn't require much prior knowledge, so it's comprehensible to programmers which are no computer scientists. Another book worth reading is "Compilers: Principles, Techniques and Tools" (aka Dragon Book) that teaches all you ever wanted to know on how to build compilers.
Quite different, but also worth its money is the "Pragmatic programmer" that gives you a lot of practical hints and tips on how to really become a better programmer, and it teaches how to constantly reflect your way of programming, the tools and techniques you use, and to constantly explore ways of improving yourself.
Offline
Aside from text-books back in college, I haven't read much recently. However, "Expert C Programming: Deep C Secrets" was really fantastic if you want to move beyond basic C syntax and down into the nuts and bolts of it. While it's focused on C, it has a lot of lessons that can be applied everywhere, I think. Also, I've never read them, but I've had both "Code Complete" and "The Pragmatic Programmer" recommended to me.
Those are all fairly practical books. If you want to get into the theory of computer science, I would find out what text books are currently in use by, say, a friend studying CS, a professor at a local university (ask by email; I'm sure most won't mind) or by various university departments (browse some department websites). You can often find textbooks, especially "out-dated" (i.e. one year too old by the text book publishing cartel's standards) for fairly cheap online. Another option would be to look into some of the book series put out by scientific literature publishers. These will usually have each chapter written by a different group of researchers and will generally be pretty up-to-date. You just have to pick the book that interests you the most. Note that these will usually be pretty expensive. As an example, Springer has a series on the Foundations of Computer Science (myself, I've had my eye on their series on natural computation).
Last edited by jakobcreutzfeldt (2012-06-02 16:07:16)
Offline
Anything by W. Richard Stevens.
Offline
Thank you all for the suggestions. From what I've seen I'm, particularly interested in The Pragmatic Programmer. The others look very helpful as well.
What about seminal articles and papers? I recently read Ken Thompson's "Reflections on Trusting Trust". I'm certain there are many more classic articls like it. What are some?
Offline
Giant +1 on Trilby's suggestion of learning some Assembly language. Even if you never end up programming in assembly again a general knowledge of what your high level constructs transform to in cpu instruction form is invaluable when evaluating the efficiency of your code.
Also I've never encountered someone with knowledge of assembly code having any problems fully grasping the concept of pointers while for those who hasn't had any assembly experience it's sometimes like an insurmountable barrier as they lack the low level understanding of memory layout/manipulation. Same goes for bit manipulation and many other low level concepts.
Offline
Anything by W. Richard Stevens.
I recommend APUE if you want to understand what's going on on your UNIX system, it's a bit terse but really well written.
You need some knowledge of C before reading it.
Offline
Speaking of knowledge of C, I'm surprised no one has brought up K&R yet. First of all, anytime anyone mentions "K&R style", you'll know what they're talking about. And because so many modern languages take so many syntactic cues from C, that style is still applicable to some extent to a number of more modern languages. But the edifying thing about C is that you don't get any higher-level data structures like lists, maps, and so forth. Being familiar with how these data structures are constructed in C gives you an idea of how these structures are implemented in languages that provide them for you and equips you to make better decisions about the tradeoffs between implementations and which ones are appropriate for which situations. If nothing else, K&R is a worth a read because a) it's so short, and b) it is an excellent programming book.
I'm also surprised no one has brought up Clean Code by "Uncle" Bob Martin. I personally have never read it, but a lot of people like it.
Offline
The Art of Unix Programming
It's not only about Unix, but about software/programming paradigms in general.
Basic programming skills should be sufficient in order to read and understand most of it.
This thread on Stack Overflow might also be interesting.
Offline
I would like to read up on more fundamental things such as programming concepts, programming algorithms, programming paradigms
Elements of Programming by Alexander Stepanov and Paul McJones
Take also look at the archives of EoP Study Group at cpp-next.com.
computer architectures
Assembly Language Step-by-Step: Programming with Linux by Jeff Duntemann
Mateusz Loskot | github | archlinux-config
Arch (x86-64) | ThinkPad T400 | Intel P8600| Intel i915
Arch (x86-64) | ThinkPad W700 | Intel T9600 | NVIDIA Quadro FX 2700M
Offline
You might like the articles at cat-v.org: http://doc.cat-v.org/programming/. I enjoyed 'The UNIX Programming Environment' by Kernighan/Pike despite the fact that it does not expect the reader to be very experienced.
Offline
Are you familiar with our Forum Rules, and How To Ask Questions The Smart Way?
BlueHackers // fscanary // resticctl
Offline
Speaking of knowledge of C, I'm surprised no one has brought up K&R yet.
I'm new to programming myself and actually just picked a copy of K&R up on ewaller's recommendation. Of course, I've only just flipped through it a bit; being both a total noob and not mathematically minded, I'm just starting with BASIC. And on that note: A coworker of mine lent me a copy of the (totally non-essential for most computer nerds) Beginning Programming for Dummies. It won't teach you any languages, and the OP is probably beyond that level but hey, us social science and humanities morons gotta start somewhere, right? Basically, if you're new to programming and can't easily pick up on branching, looping, variables, arrays and such terminology based on what you find online, the book teaches you how logic works in programming languages and how to identify the components of different languages without someone pointing them out all the time. It's basically a good push in the right direction, for those of us who have a little trouble at first: recognize what, say, an "array" is in one language and you can pick them out in others.
Offline