Lots of requests for book recommendations and questions about how to learn some technology seem to pass through this forum. I thought I'd pull together a list of books I frequently recommend on various subjects. Note that these are the books that I recommend myself -- I like them, and I know lots of people who have had success with them. You might learn a little differently than me and my contemporaries; you might find other titles which are valuable to you. Also, these are the books that I recommend myself. That is to say, they're not the books that I think shouldn't be recommended. Every book here gets a positive review from me -- the list of books that I think aren't worth buying is just too long to enumerate.
Algorithms
Art of Computer Programming by Knuth. This is the seminal work in the research of algorithms. It doesn't discuss much about algorithm design, but formal proofs for all of the presented types of algorithms and deep discussions of their weaknesses, strengths, and behaviors make this book a very popular reference. The proofs make this book extremely formal and heavy on math. Knuth also uses a hypothetical machine, of his own design, to model the algorithms he discusses. These facts might make the book substantially less approachable to some readers, but are important facets that support the depth of Knuth's analysis and discussions. The three volume set is rather intimidating, and has grown recently to include a fourth volume on combinatorial algorithms.
Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein. The CLRS book (as it's called, based on the initials of the names of the authors) is an appropriate introduction to algorithms for computer science students. The book explains how algorithms are used in computing and programming, then discussing the analysis and design of algorithms. After this introduction, the book visits different types of algorithms grouped by their overarching pattern of implementation: probabilistic algorithms, divide-and-conquer algorithms, and so on. It visits sorting and data structures in separate sections before visiting more advanced topics like dynamic programming and B-tress. The newest implementation includes a section on multithreaded programming, though its a bit superficial compared to the depth of the rest of the content. The proofs use a bit of math, but the examples and algorithms are presented in a very clear pseudo code; these facets of the book help it be very approachable yet still rather formal and complete.
Algorithms in C++ by Sedgewick. Robert Sedgewick's algorithm books take the non-traditional approach of using a specific computer language to demonstrate the algorithms involve rather than implementing the algorithms in pseudo code only. This is a very interesting feature of the books because it makes the implementations very specific, relying on concrete language concepts rather than some synthetic language that might have certain shortcuts which are not readily implemented. The titles are divided into five books covering fundamentals of analysis, data structures, sorting, searching, and combinatorial and graph algorithms. The mathematical analysis is deep, but not quite as deep as the CLRS book and certainly nothing like The Art. The title is available for C as well as Java. It appears that the C++ implementation lags behind the C editions because the C editions are updated first and the C++ edition's application of C++ is very superficial. Rather than implementing the algorithms using OO practices -- even if only to demonstrate formal use of accessors and encapsulation -- the C++ implementations are very flat.
Algorithms and Theory of Computation Handbook edited by Mikhail J. Atallah and Marina Blanton. True to its title, this two-volume set is an impressive collection of articles on algorithms and computational theory. Each chapter is written by a different author, but the editors have done a commendable job of keeping the style and level consistent throughout. The scope is comparable to The Art of Computer Programming and perhaps a bit larger because of the inclusion of more theory topics, but it seems like this book hasn't yet earned quite the reputaiton despite being in its second edition. Notably, this book refers to Knuth, but the Knuth books don't refer to these volumes. The topics are very well-written with complete references, but sometimes aren't as deep as I'd like. Like most academic papers, the content never includes step-wise examples. That is, an algorithm is presented but no examples of its operations or its partial results are discussed; it's left to the reader to code the algorithm (or simulate it on paper, or mentally) to realize how it functions when applied.
Assembly Language
Introduction to 80x86 Assmebly Language and Computer Architecture by Detmer. This book starts with a low-level introduction to the computer: It describes the interaction of the processor and memory to show how individual op codes are run, which allows the reader to understand how programs are actually executed by the machine. This is the "Computer Architecture" part of the book, which might be a bit thin. The book moves to writing assembly language programs with Visual Studio and debugging them. (Consequently, the book uses Intel syntax rather than the AT+T syntax used by some Linux- or Unix-oriented books.) The point of the tools section seems to be getting the reader familiar enough with the toolset so that they can complete the exercises. Perhaps my biggest knock for the book is that it doesn't explain how the assembler and linker actually work as tools -- the book doesn't explain how the executable file is generated or what it contains, or what really happens when it lands in memory. After the section introducing the tools, the book provides an introduction to assembly language, as the title suggests. The book does this well, covering branching and looping, string manipulation, integer math, bit manipulation, and floating point math. The book stops short of using any advanced features such as SSE or MMX instructions, or investigating protected mode or interacting aggressively with the operating system. The book provides some I/O routines for Windows to write to the console, which minimizes the dependency on any high-level language. The book's treatment of Computer Architecture is superficial, but enough to get someone new to programming started. The treatment of assembly language is, indeed, an introduction. This is a great book to get started, but the more aggressive developer will run out of steam afterward.
C
The C Programming Language by Kernighan and Ritchie. These two guys did most of the original implementation of the C language at Bell Labs in the 70's. The book is written for people who have previous experience programming, and don't need to learn anything but the syntax and design of C itself. While the book is a classic, the newest release doesn't cover any of the newest features of the language. The examples are quite thin, and the book isn't for beginners to programming. Notably, however, it's helpful to beginners to C because it explains the different phases of the implementation of the language -- pre-processor, compiler, linker -- properly, and remarkably few students pick up on these important roles.
C Primer Plus by Prata. This book is similar to the C++ Primer Plus book listed in the C++ section. I believe, but don't know for a fact, that Prata wrote his C++ text, then stripped it to produce this text. I'm afraid the result is a book that breaks down badly as a reference, but and is slightly less useful as a tutorial than the C++ book. While the C++ book is easy to recommend, this one isn't as good in its genre. However, if you prefer Prata's writing style, this is the book to get.
Programming in C by Kochan. This book has been very popular and increasingly so throughout its revisions, which have been carefully edited and improved. The book discusses programming concepts and re-inforces them with examples that aren't appropriate for readers who are using the book to learn the language. The framework of examples, however, require the user to be familiar with their progression through the book -- using the book as a reference isn't as facile as it might be.
C#
Pro C# 2010 and the .NET 4 Platform by Troelsen. This book starts out by discussing the .NET Framework, which implements the run time features of all of MIcrosoft's managed language. From this introduction -- which explains how a program uses the framework, and how the framework fits into the installation and architecture of the program -- the author discs uses programming in C#. The book quickly approaches advanced features like delegates and generics, and treats -- even if superficially -- the use of ADO and LINQ to write data management applications. Windows Presentation Framework development, as well. While the aggressive scope of the book might spread its depth a bit thin, the title is a very valuable omnibus tour of the language and its platform.
Essential C# 4.0 by Michaelis. Of the C# titles, this is probably one of the best tutorials for those with little previous programming experience. The author starts by discussing data types, flow control, and operators, and how they come together to make simple programs. The book spends a great amount of detail on these fundamental concepts before broaching the more advanced issues in C# such as multithreading, reflection and inspection, and LINQ. Perhaps the only flaw to this book as an introduction is that it leaves the discussion of the common language infrastructure -- the .NET platform itself -- to the very end o the title.
C# in Depth by Skeet. Skeet's title is probably more appropriate for experienced developers; perhaps those who have a bit of exposure to C# or some other language, and are interested in honing their C# skills. The book doesn't provide much of a tutorial, but does examine lots of interesting facets of C# development and provides insight to how the language handles different problems. The book discusses different architectural and conceptual ideas by reviewing how they apply to C#, and by discussing some of the unique concepts that C# brings to programming.
CSS and X/HTML
CSS: The Missing Manual by McFarland. McFarland's book starts with a chapter titled "Rethinking HTML for CSS", which sets the tone for the title. Assuming a working knowledge of "flat" HTML, the author expands the readers knowledge by teaching them how to approach web page implementation with CSS styles instead of attributed HTML. The book continues by showing how to best apply CSS to style a page, then investigating style cascading and inheritance. With this foundation, the author continues to show real-world applications of CSS to solve specific design problems -- implementing margins and borders, handling graphics, and so on. It's pretty easy to approach HTML and learn it without CSS, and readers who've done so without considering CSS will find this book invaluable towards modernizing and furthering their knowledge.
The Eric Meyer books on CSS include CSS: The Definitive Guide and Smashing CSS: Professional Techniques for Modern Layout. The Definitive book is not as approachable for tutorial use as the Missing Manual book, but does provide an excellently structured reference to the language itself. Smashing is for more experienced designers and discusses innovative tools and techniques for good CSS design and implementation.
HTML, XHTML, and CSS by Castro. Castro's book starts out with a bit of file management, then explains how to write simple HTML files, including which editors to use and how to save and test files before sending them to your web site. She then shows how to build CSS around HTML web pages, including what inclusion means, how the CSS is processed by the browser against the HTM file, and what tools you might use to diagnose simple problems. Once's she has wed HTML and CSS, she begins explaining how they fit together to build pages. One of the most interesting aspects of this book is its format. The author uses two narrow columns on each page. One contains her text and the other contains the code snippet or rendered page or screen shot that's being discussed. It's an innovative idea and one that works very well to help make the text clear and approachable. Unfortunately, the book was last revised in 2007, so it doesn't quite cover HTML 5.
Creating a Web Page With HTML by Castro. This book is only 150 pages or so, and discusses the very basics of HTML usage. It doesn't offer much in the way of anything else; little coverage of CSS, nothing about scripting. Instead, it focuses on the most rudimentary aspects of developing web content. Some users might be able to get by only using Castro's X/HTML and CSS book, but some might find the thin coverage of HTML-only design a little bit thin. For those readers, this book fills the gap. Like the X/HTML book, this book is aging; it was published most recently in 2005. Beginners won't be too concerned that the newest features of HTML aren't covered, however.
Introducing HTML5 by Lawson and Sharp. Despite its title, this book isn't an introduction to HTML programming. It's an overview of HTML5, specifically. The authors say that they expect the reader is familiar with HTML and markup -- but I think they assume a fluency rather than a familiarity as the book tours new features without explaining old features at all. This book might be one of the best to augment your basic HTML understanding with the new level of knowledge, but Teague's title is probably better if you're just starting out. Curiously, this book is written as a tour of the new features rather than a reference. That might limit its usability for some.
CSS3: Visual Quickstart Guide by Teague. Teague's book includes a very brief overview of CSS and HTML, continues with a review of using the simpler CSS constructs, then explains how to apply different style attributes to realize particular effects. The book does couple CSS3 and HTML5 at the tutorial level, so if you're starting out to learn both this is probably the title for you.
C++
C++ Primer by Lippman, et al. I like this book because it is a very approachable tutorial, but it works very well as a reference. It is well-organized and has a great index, so once you work through it you'll want to keep it around to look up things you don't understand or things you've forgotten. The book is sectioned to cover different structures of the language. It does so succintly and with excellent examples.
C++ Primer Plus by Stephen Prata. Despite its similar title, this book is different than Lippman's book. It's more of a tutorial, and not so useful as a reference because of poorer indexing and organization that favors the tutorial more than the book's use as a reference.
The C++ Programming Language, by Bjarne Stroustrup. This is the definitive reference for the C++ language, written by the language's designer. Not much of a tutorial, but if you need an answer it's most likely in this book. If not, you'll need a copy of the language standard itself.
C++ (advanced)
C++ Templates: The Complete Guide by Vandevoord and Josuittis. Templates are something of a language within a language in C++, and confound even experienced programmers because of their different semantics. This books helps programmers approach and understand templates with concrete examples, deep discussions of the exceptional use of their semantics, and appropriate explanations of the language design underlying the implementation of the language. The first part of the book provides an overview with simple approaches, while the second part of the book reinforces that basic knowledge with details about more aggressive usage of the language feature. A third section discusses the use of templates as an architectural tool in the development of extensive libraries or large-scale programs.
The C++ Standard Library: A Tutorial and Reference by Josuittis. The STL is an important -- though sometimes overrated -- part of the C++ language standard. This book provides a sound overview of the design and implementation of the STL, discussing considerations important for the appropriate use of the library. Unfortunately, the book is becoming dated -- last updated in 1999 -- and doesn't discuss some of the newest changes and features in the STL. Further, the book falls a bit short on discussing some of the architectural pitfalls of the STL. If you don't have good documentation for your compiler's STL, or want a more approachable overview than the documentation you have, this book is still very useful.
Effective C++, More Effective C++, and Effective STL, all by Scott Meyers. The Meyers books are approachable because they've got few pages (all less than 300) and are broken into short essays about different programming techniques. The books provide maxims about programming strategy in very a prescriptive format. The essays are intended to suggest techniques that can be implemented through code rather than thinking about very specific examples. While the authors' opinions are sometimes a bit pedantic and have fueled no shortage of religious wars, overall they're sound and sensible approaches toward implementing involved programs with the C++ language. If the books have one flaw, it's that they're not aggressive enough at reminding the reader that rules can be broken. There are always reasons to ignore advice in the real world -- not every maxim applies to absolutely every situation. Discussing the fringe cases where the popular practices might not perfectly apply can be just as important as understanding the mainline cases.
Computer Architecture (Formal)
Computer Architecture: A Quantitative ApproachHennessy and Patterson. This is a common graduate-level text for computer architecture classes. The book describes how multi-core systems work and focuses on the issues of concurrency in multi-processor and multi-core systems. Great discussions about issues affecting program efficiency and concurrency are covered here, but the book is certainly not an introduction to architectures. For an entry-level book, readers should consider Computer Organization and Design by the same authors. This book is more formal than the titles on the informal book list, but explains how the processor works, how it interfaces to memory and persistent storage, and how peripherals will interact with the core system.
Computer Architecture (Informal)
Code: The Hidden Language of Computer Hardware and Software by Charles Petzold. This book explains how computers work by discussing fundamentals of signaling theory and information storage. The book broaches these concepts by using simple analogies and explaining how the fundamental solutions that computers use for different problems were discovered and, most importantly, why they were chosen and still used to this day. Why do computers use binary? Why are transistors so important? How is information actually represented in a computer? What is memory and how does it work? And so on -- all these questions and more are answered by this title, which is very approachably written and an ideal introduction to the layman about what makes a computer actually function.
Write Great Code: Understanding the Machine by Randall Hyde is the first book of a trilogy that discusses low-level programming concepts and implementation ideas. This first book stands alone as a very good introduction to computer architecture and implementation. By describing how the machine works, Hyde gets programmers an excellent introduction into issues they'll face throughout their careers. Hyde's book is aimed at providing a basis for computer programmers, so it's more technical than Petzold's Code book, which doesn't always cement the concepts it introduces to the more formal computer science-specific concepts they under pin.
Compiler Design
Compilers: Principles, Techniques, and Tools by Aho, etal. Called the "dragon book" because of its cover art, this title investigates compiler implementation by discussing various types of parsers, tools for implementing grammars and producing parsers from those grammars, and implementing language features. Coverage provided is very broad, in that each step of the compiler ends up demonstrating and comparing different methods for achieving the result; the compiler generation chapter includes SLR, LR, and LALR generations. While this book is the essential reference for compiler developers, it falls short in failing to provide a much implementation details. While you might never write a compiler in your career, understanding how to implement a good parser is a very im0ortant skill whether you're cracking a data file or skimming through a simple script language they you've built to help implement a particular tool. A casual read of this title can help add some important skills to your repertoire
Database Theory
SQL and Relational Theory by CJ Date. Relational theory is a deep subject, and it seems a bit pure -- inapplicable to tactical, real-world problems. Finding a good database model, however, requires a strong understanding of relational theory and predicates success on all but the most trivial database projects. This book does a brilliant job of uniting the ideas behind relational theory with practicable and clearly implemented SQL queries and samples. The result is a very approachable investigation of relational theory that is easily applicable to tangible problems and not "in the weeds" like so many books on theory.
Transaction Processing: Concepts and Techniques by Gray and Reuter. Having worked with Dr Gray at Microsoft and being saddened by his loss at sea in 2007, I have a bit of bias. Even withstanding this disclaimer, I don't think there's a better book about transaction processing available. The book investigates the basic requisites of transaction processing systems, then investigates how they might be implemented, and how they're applied. Locking, locking, and management are all treated sensibly, and the book covers distributed and multi-phase transactions as well. This book is invaluable for someone implementing their own database management system -- however simple -- but also helps developers understand how their commercial relational database management system (or transaction coordinator, or distributed components) should behave when handling transactions. Unfortunately, since Dr Gray is no longer with us, an update to this title is probably not forthcoming. A similar title more recently published is Principles of Transaction Processing. Its scope is a bit less ambitious but the material it does cover is just as deep as the Gray-Reuter book.
Data Modeling Made Simple by Hoberman. Without an appropriate data model, your database project is damned to failure. Hoberman's book explains what a data model is at the subject, logical, and physical levels. It describes entities, attributes, relationships, and keys, then discusses ways to measure data model quality. The book gives lots of very clear examples to support its claims, but falls short at providing prescriptive, step-by-step advice for creating an appropriate data model. Given this last feature, it would be a very appropriate title for large organizations pursuing data-oriented projects as both the non-technical staff and the technical staff could read it and use it to find common ground when inventing databases for business needs. The title is still a great reference for technical readers, however, and is one of the few approachable titles in the field.
Game Development
Introduction to 3D Game Programming with DirectX 11 by Luna. This book assumes you know C++ and a bit of Windows. The author devotes some time to matrix algebra, but perhaps not quite enough time for some less experienced readers. Given those pre-requisites, the author jumps right into developing 3D rendering code with DirectX. The book discusses lighting, texturing, mapping, various shading effects, and has suggestions for implementing different atmospheric effects like fire and rain. The book seems a bit focused on simple rendering, however, and doesn't do much for actual game development. To write a game, you'll need to know how to do rendering -- but this book doesn't include much information on creating entities, AI, game design, or implementing frame loops to drive the game engine and rendering engine. Code examples use "real" C++, so understanding classes is requisite.
3D Game Engine Architecture: Engineering Real-Time Applications with Wild Magic by Eberly. This book examines the architecture of a game engine by studying Wild Magic, a game engine implemented by the author's company. The book serves to discuss the application of the core components of a game engine by implementing them, then reviewing the implementation as applied to the development of a simple game. By studying how the system actually performs, the reader gets a strong sense of how the different features fit together in order to form the architecture, where the pitfalls and difficulties of the design of a game engine occur, and how the engine fits together to meet the requirements of its consumers. The book is an outstanding treatment of the subject. Perhaps the largest flaw is that the book hasn't been updated lately, so some of the limits the application ahs are now solved problems. The game engine itself has been updated, so code you're likely to encounter on the job (or after downloading the newest version from the supporting website) won't perfectly match what's discussed in the book.
3D Game Engine Design, Second Edition: A Practical Approach to Real-Time Computer Graphics by Eberly. This title is something of a companion to the Wild Magic title by the same author, but is not tightly-coupled to the other title. The author draws on his experience implementing and using his Wild Magic game engine in this tome, but doesn't use it as an authoritative reference for his discussions. This book is structured to visit most of the graphical features of a game engine -- the graphics system, renderers, scene and object management, curves, space management, and so on. There are sections on physics and collision detection, but these are relatively superficial. Techniques for implementing the different aspects of a graphics engine are reviewed and the math discussed. (The math can get rather involved at points, but if you're not up for the math, you're not up for graphics development.) You can think of this book as treatment of the graphical parts of a game engine that is far deeper than the discussion provided in the Architecture book, while the Architecture book investigates all aspects of a game engine fairly equally. This title doesn't tie itself as tightly to Wild Magic as the Architecture book does. Together, they're a deep, applied investigation of game development.
Java Development
Java Concurrency in Practice by Goetz.
Effective Java by Bloch.
Java Tutorial and Java EE 6 Tutorial from Oracle's imprint at Addison Wesley with a total of eight authors.
Java Performance by Hunt and John.
The Elements of Java Style by Vermeulen et al. A tiny book (just 125 pages and small format) that more than 100 concise tips for programming in Java. Mostly around style -- how to format, name, and document your code. But covers packaging and some structural issues, as well.
Javascript
JavaScript: The Definitive Guide by Flanagan.
JavaScript: The Good Parts by Crockford. Lots of jokes about JavaScript are spurred by the length of this; only 175 pages (so there must not be much good about JavaScript -- get it?), but the treatment of javaScript here is very succinct and focused. This isn't a tutorial on programming, though it is an acceptable tutorial for developers experienced in other languages who want to learn JavaScript effectively. The book investigates attirbutes an experienced developer knows will exist in a particular language, and discusses them without explaining them deeply. The section on objects, for example, spends only four or five paragraphs introducing the notion of an "object". That's not a tutorial on OOP, but it is enough to remind even a rusty reader about what they need to absorb the following chapter. There's a chapter on programming style, which is incredibly important when writing large systems and succintly justified by the author: "style matters in programming for the same reason that it matters in writing. It makes for better reading."
Operating Systems
Operating System Concepts by Silberschatz, Galvin, and Gagne. The Operating System Concepts book has been around for years -- this is its eighth edition -- and has been a staple on college operating system courses. The book starts from the basics, defining an operating system by discussing its roles and requirements. It visits each of the major features of any operating system in depth, discussing different implementations and features, as well as some pitfalls and compromises within those implementations. The book visits memory management, process scheduling and structure, storage management and interfaces, security, and distribution. It includes a couple of special interest topic and spends some time investigating the specific decisions made in Linux, Windows, and a set of other less-widely used but still influential systems. Perhaps the most common competitor to this book is Tanenbaum's Modern Operating Systems book. Tanenbaum's book is a bit more approachable in writing style, but spends a great deal of time investigating commercial implementations and discussing their features and benefits. This is a bit of a distraction from the pure theory, but conversely cements the facts the book covers with practical implementations.
PHP
PHP Cookbook by Trachtenberg and Sklar. I'm a big fan of the "Cookbook" series titles from O'Reilly because I find them very approachable. The titles contain a couple hundred short solutions for the platform they discuss, from formatting a string to enumerating directories; from very simple one- or two-line solutions to programs that are a couple pages long and implement useful tools that you can use yourself as a starting point for your own solution, or to use as a tool for some other chain of commands that gets the job done. The PHP title in this series epitomizes this approach, providing examples about error handling, instructions for performance tuning, crafty regular expression applications, several security hints, and lots of lower-level language idioms and cliches. This isn't a great book to use when learning programming from scratch, but if you're already a programmer and PHP isn't your first language, or you don't use it often enough to become extremely facile in its application, the book is a great help because you know what you're looking for and will be able to find it very quickly in this title. If you like to learn by example, or by having your disorganized questions answered promptly, this might be a helpful title -- but you'll still need a book that teaches you the practice of programming.
Learning PHP, MySQL, and JavaScript: A Step-By-Step Guide to Creating Dynamic Websites by Nixon. This recently-revised book covers the core web development technologies. It shows how to set up a development server that runs Apache, PHP, and MySQL on your Windows, Linux, or Macintosh box, and how to use it to start building web sites. The title contains a few chapters on the basics of PHP and shows how to build simple dynamic web pages with the language. It then investigates MySQL and merges the two to develop form-based applications. Finally, it investigates using Java script in the pages to script and augment some of the client-side page features to help with validation. The final chapters bring each of these technologies together to start using AJAX to build robust pages. If you're making the transition from being a page designer to doing web development, this title is probably ideal for you; it doesn't spend much time on HTML or CSS, skips the rudimentary aspects of HTML, and gets right to the good stuff. The coverage here will get you started and might be enough to help you start implementing real web sites, but you might also need to get a secondary reference for the other involved languages and tools.
Python
Programming Python by Mark Lutz is a title in the well-recognized O'Reilly series. The book starts of with a basic overview of the Python environment, describes the interface between Python's environment and the operating system, and then discusses GUI implementation using the Tkinter layer. The book devotes a large section to scripting various tasks and treats server- and client-side scripting with appropriate discernment. The book isn't much of an introduction; it's aimed at those who have experience writing software in some other language. The same author's book Learning Python: Powerful Object-Oriented Programming is an exceptional introduction to programming. The book uses Python to explain how programs interact with computers, how programmers interact with programs, and then investigates the various features of the Python language -- data types, control flow statements, functions, and so on. Someone starting out with zero programming experience might consider the Learning title and a copy of the Python environment as way to start programming with few barriers, though they'll still needs some mentoring and a way to identify projects meaningful to them personally.
Python Cookbook by Martielli, Ascher, and Ravenscroft. This book has all the features I like about the O'Reilly "Cookbook" series applied to the Python language. (See the PHP Cookbook description for details.) The title is getting a bit old, though Python hasn't changed in ways that demand a substantial revision of this title. The scope of the cookbook includes useful advice about generating UI with Python, applying the language to multithreaded applications, and doing some debugging and tuning as well.
SQL Programming
SQL For Smarties by Celko. Joe's book is the one I always recommend to those who want to learn SQL. It explains that SQL is based on set-oriented operations, and holds this theme firmly throughout the title. Such an approach might make the title a bit intimidating, but it turns out to result in a simplification of the introductory topics and lays an impenetrable foundation for the more advanced issues the book discusses. Celko sticks to ANSI standard SQL, which is a bit of a problem as there are few (maybe there are none!) database management systems which fully implement ANSI-standard SQL. The reader will always need to do some translation to the dialect their servers run, whether they're using MySQL, Microsoft SQL Server, or Oracle. The book is still better than any vendor-specific title I've read, and a great introduction to the language even for those who don't have experience writing software in procedural languages.
Microsoft SQL Server 2012 T-SQL Fundamentals, Ben-gan. If you're using SQL Server, I don't think there's any replacement for the Inside SQL Server series. The entry point to this series is this T-SQL Fundamentals title, which discusses ways to use T-SQL to write queries. It's strictly focused on commands that work against tables and views, and how data is extracted from the database. It focuses on thinking about sets of data, helping readers avoid the trap of iterative data management, which often kills any hope of figuring out the most efficient way to write a query. It also discusses query optimization significantly enough to give insight into working with the QO to tune queries. It visits lots of advanced techniques like partitioning, and includes a large section on writing statements that alter data -- updates, inserts, and deletes. The book doesn't discuss database design or implementation; for that, you'll want one of the relational theory books.
Microsoft SQL Server 2012 Internals, Delaney, Beauchemin, Cunningham, Kehayias, Randal, Nevarez. SQL Server's database engine is large and complex, full of features and interesting implementation details. This book discusses exactly how the query engine, the storage engine, and the execution engine within the server are implemented at a level of detail intended to help developers understand the server's architecture well enough that they might avoid problems in their architectures, diagnose symptoms, and investigate issues in performance of the server. The book is thick with technical information, but is organized well enough that it is approachable as a troubleshooting reference. If you're wondering what the difference is between two different types of indexes, for example, the book certainly answers that question -- and does so down to the a level which describes what data is in the data file.
Inside Microsoft SQL Server 2008: T-SQL Programming, Ben Gan, et al. Aside from a data manipulation and modification language, T-SQL is also a procedural language. This book examines the procedural constructs in T-SQL and some of the more advanced enhancements to the data-oriented constructs. It discusses views, error handling, temporary and table-based variables, cursors, stored procedures, and triggers. It explains how Service Broker works, how the various new advanced data types in SQL Server are used, and discusses SQL Server's support for XML. If you're writing aggressive T-SQL for your application, you'll want to get this book ad well as the Querying book in the same series. (So far, it seems like this book isn't updated for SQL Server 2012.)
MySQL by Dubois. You'll want to be sure to get the fourth edition of this title (or a newer one) because that's the first release of the book that covers MySQL 5.0. The book provides an overview of MySQL including its installation and administration, discusses programming MySQL in C, and has overviews of some of the basic MySQL features like stored procedures and the various data types used by the server's implementation of SQL. The book has reference material providing overviews of the different storage engines supported by MySQL, plus their various modes and settings, as well as references for the PHP and C APIs. The book is very broad in its coverage, though not always as deep as you might like it to be.
MySQL Administrator's Bible by Cabral and Murphy. Despite its title, this book has a large section (more than 250 of its 830 pages) devoted to a section called "Developing with MySQL". This section covers things that people writing SQL need to know about the server; creating views, using transactions, the different data types and index schemes supported by the server, and MySQL's implementation of events, triggers, and stored procedures for procedural programming. This section also contains a useful chapter about MySQL's deviancies from the SQL language standard. The balance of the book covers the regular administrative tasks, including backups, handing caching issues, tuning the server, optimizing queries, monitoring and securing the server, measuring performance, and high-availability solutions. While the book is not quite as broad as the Dubois book, it is better organized and more focused.
Threads and ConcurrencyWindows Development
Windows Internals, Part 1 and Part 2 by Russinovich, Solomon, and Ionescu. Inside knowledge of the Windows operating system is difficult to come by because Microsoft struggles to document all of its features, implementations, and interfaces. The Internals book provides tremendous insight into how Windows works, which helps users understand how it can be best diagnosed and tuned, and helps developers understand how to best write software for its subsystems. There would be many fewer arguments in the OS section of this forum, for example, if more users took the time to understand the chapters on memory management and security. The chapters on storage, security, networking, and file systems are extremely valuable to anyone who needs to use Windows in high-availability or high-performance environments.
Programming Windows by Charles Petzold. This book is out of print, but I don't think there is any better tutorial or reference for the developer who is writing Win32 code in C or C++. And developers who are using another language probably also need to learn the concepts here so that they fully understand the system they're using -- particularly how USER and GDI work. The examples are all in "flat" C, so there is a huge amount of repetition and boilerplate code, but the details exposed by such a low-level approach are vitally important to writing good code for the platform. There are many substitutes for this book, such as Windows via C/C++, Win32 Programming, and my own MFC-oriented book Professional MFC with Visual C++. While you can learn some of the things you'll need from these titles, the Petzold book is the definitive reference for Windows developers choosing C as their language. If you want to write more modern apps (using C# and XAML, targeting Windows 8 and newer), you'll want http://www.amazon.com/dp/0735671761/ by Petzold.
Algorithms
Art of Computer Programming by Knuth. This is the seminal work in the research of algorithms. It doesn't discuss much about algorithm design, but formal proofs for all of the presented types of algorithms and deep discussions of their weaknesses, strengths, and behaviors make this book a very popular reference. The proofs make this book extremely formal and heavy on math. Knuth also uses a hypothetical machine, of his own design, to model the algorithms he discusses. These facts might make the book substantially less approachable to some readers, but are important facets that support the depth of Knuth's analysis and discussions. The three volume set is rather intimidating, and has grown recently to include a fourth volume on combinatorial algorithms.
Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein. The CLRS book (as it's called, based on the initials of the names of the authors) is an appropriate introduction to algorithms for computer science students. The book explains how algorithms are used in computing and programming, then discussing the analysis and design of algorithms. After this introduction, the book visits different types of algorithms grouped by their overarching pattern of implementation: probabilistic algorithms, divide-and-conquer algorithms, and so on. It visits sorting and data structures in separate sections before visiting more advanced topics like dynamic programming and B-tress. The newest implementation includes a section on multithreaded programming, though its a bit superficial compared to the depth of the rest of the content. The proofs use a bit of math, but the examples and algorithms are presented in a very clear pseudo code; these facets of the book help it be very approachable yet still rather formal and complete.
Algorithms in C++ by Sedgewick. Robert Sedgewick's algorithm books take the non-traditional approach of using a specific computer language to demonstrate the algorithms involve rather than implementing the algorithms in pseudo code only. This is a very interesting feature of the books because it makes the implementations very specific, relying on concrete language concepts rather than some synthetic language that might have certain shortcuts which are not readily implemented. The titles are divided into five books covering fundamentals of analysis, data structures, sorting, searching, and combinatorial and graph algorithms. The mathematical analysis is deep, but not quite as deep as the CLRS book and certainly nothing like The Art. The title is available for C as well as Java. It appears that the C++ implementation lags behind the C editions because the C editions are updated first and the C++ edition's application of C++ is very superficial. Rather than implementing the algorithms using OO practices -- even if only to demonstrate formal use of accessors and encapsulation -- the C++ implementations are very flat.
Algorithms and Theory of Computation Handbook edited by Mikhail J. Atallah and Marina Blanton. True to its title, this two-volume set is an impressive collection of articles on algorithms and computational theory. Each chapter is written by a different author, but the editors have done a commendable job of keeping the style and level consistent throughout. The scope is comparable to The Art of Computer Programming and perhaps a bit larger because of the inclusion of more theory topics, but it seems like this book hasn't yet earned quite the reputaiton despite being in its second edition. Notably, this book refers to Knuth, but the Knuth books don't refer to these volumes. The topics are very well-written with complete references, but sometimes aren't as deep as I'd like. Like most academic papers, the content never includes step-wise examples. That is, an algorithm is presented but no examples of its operations or its partial results are discussed; it's left to the reader to code the algorithm (or simulate it on paper, or mentally) to realize how it functions when applied.
Introduction to 80x86 Assmebly Language and Computer Architecture by Detmer. This book starts with a low-level introduction to the computer: It describes the interaction of the processor and memory to show how individual op codes are run, which allows the reader to understand how programs are actually executed by the machine. This is the "Computer Architecture" part of the book, which might be a bit thin. The book moves to writing assembly language programs with Visual Studio and debugging them. (Consequently, the book uses Intel syntax rather than the AT+T syntax used by some Linux- or Unix-oriented books.) The point of the tools section seems to be getting the reader familiar enough with the toolset so that they can complete the exercises. Perhaps my biggest knock for the book is that it doesn't explain how the assembler and linker actually work as tools -- the book doesn't explain how the executable file is generated or what it contains, or what really happens when it lands in memory. After the section introducing the tools, the book provides an introduction to assembly language, as the title suggests. The book does this well, covering branching and looping, string manipulation, integer math, bit manipulation, and floating point math. The book stops short of using any advanced features such as SSE or MMX instructions, or investigating protected mode or interacting aggressively with the operating system. The book provides some I/O routines for Windows to write to the console, which minimizes the dependency on any high-level language. The book's treatment of Computer Architecture is superficial, but enough to get someone new to programming started. The treatment of assembly language is, indeed, an introduction. This is a great book to get started, but the more aggressive developer will run out of steam afterward.
The C Programming Language by Kernighan and Ritchie. These two guys did most of the original implementation of the C language at Bell Labs in the 70's. The book is written for people who have previous experience programming, and don't need to learn anything but the syntax and design of C itself. While the book is a classic, the newest release doesn't cover any of the newest features of the language. The examples are quite thin, and the book isn't for beginners to programming. Notably, however, it's helpful to beginners to C because it explains the different phases of the implementation of the language -- pre-processor, compiler, linker -- properly, and remarkably few students pick up on these important roles.
C Primer Plus by Prata. This book is similar to the C++ Primer Plus book listed in the C++ section. I believe, but don't know for a fact, that Prata wrote his C++ text, then stripped it to produce this text. I'm afraid the result is a book that breaks down badly as a reference, but and is slightly less useful as a tutorial than the C++ book. While the C++ book is easy to recommend, this one isn't as good in its genre. However, if you prefer Prata's writing style, this is the book to get.
Programming in C by Kochan. This book has been very popular and increasingly so throughout its revisions, which have been carefully edited and improved. The book discusses programming concepts and re-inforces them with examples that aren't appropriate for readers who are using the book to learn the language. The framework of examples, however, require the user to be familiar with their progression through the book -- using the book as a reference isn't as facile as it might be.
Pro C# 2010 and the .NET 4 Platform by Troelsen. This book starts out by discussing the .NET Framework, which implements the run time features of all of MIcrosoft's managed language. From this introduction -- which explains how a program uses the framework, and how the framework fits into the installation and architecture of the program -- the author discs uses programming in C#. The book quickly approaches advanced features like delegates and generics, and treats -- even if superficially -- the use of ADO and LINQ to write data management applications. Windows Presentation Framework development, as well. While the aggressive scope of the book might spread its depth a bit thin, the title is a very valuable omnibus tour of the language and its platform.
Essential C# 4.0 by Michaelis. Of the C# titles, this is probably one of the best tutorials for those with little previous programming experience. The author starts by discussing data types, flow control, and operators, and how they come together to make simple programs. The book spends a great amount of detail on these fundamental concepts before broaching the more advanced issues in C# such as multithreading, reflection and inspection, and LINQ. Perhaps the only flaw to this book as an introduction is that it leaves the discussion of the common language infrastructure -- the .NET platform itself -- to the very end o the title.
C# in Depth by Skeet. Skeet's title is probably more appropriate for experienced developers; perhaps those who have a bit of exposure to C# or some other language, and are interested in honing their C# skills. The book doesn't provide much of a tutorial, but does examine lots of interesting facets of C# development and provides insight to how the language handles different problems. The book discusses different architectural and conceptual ideas by reviewing how they apply to C#, and by discussing some of the unique concepts that C# brings to programming.
CSS: The Missing Manual by McFarland. McFarland's book starts with a chapter titled "Rethinking HTML for CSS", which sets the tone for the title. Assuming a working knowledge of "flat" HTML, the author expands the readers knowledge by teaching them how to approach web page implementation with CSS styles instead of attributed HTML. The book continues by showing how to best apply CSS to style a page, then investigating style cascading and inheritance. With this foundation, the author continues to show real-world applications of CSS to solve specific design problems -- implementing margins and borders, handling graphics, and so on. It's pretty easy to approach HTML and learn it without CSS, and readers who've done so without considering CSS will find this book invaluable towards modernizing and furthering their knowledge.
The Eric Meyer books on CSS include CSS: The Definitive Guide and Smashing CSS: Professional Techniques for Modern Layout. The Definitive book is not as approachable for tutorial use as the Missing Manual book, but does provide an excellently structured reference to the language itself. Smashing is for more experienced designers and discusses innovative tools and techniques for good CSS design and implementation.
HTML, XHTML, and CSS by Castro. Castro's book starts out with a bit of file management, then explains how to write simple HTML files, including which editors to use and how to save and test files before sending them to your web site. She then shows how to build CSS around HTML web pages, including what inclusion means, how the CSS is processed by the browser against the HTM file, and what tools you might use to diagnose simple problems. Once's she has wed HTML and CSS, she begins explaining how they fit together to build pages. One of the most interesting aspects of this book is its format. The author uses two narrow columns on each page. One contains her text and the other contains the code snippet or rendered page or screen shot that's being discussed. It's an innovative idea and one that works very well to help make the text clear and approachable. Unfortunately, the book was last revised in 2007, so it doesn't quite cover HTML 5.
Creating a Web Page With HTML by Castro. This book is only 150 pages or so, and discusses the very basics of HTML usage. It doesn't offer much in the way of anything else; little coverage of CSS, nothing about scripting. Instead, it focuses on the most rudimentary aspects of developing web content. Some users might be able to get by only using Castro's X/HTML and CSS book, but some might find the thin coverage of HTML-only design a little bit thin. For those readers, this book fills the gap. Like the X/HTML book, this book is aging; it was published most recently in 2005. Beginners won't be too concerned that the newest features of HTML aren't covered, however.
Introducing HTML5 by Lawson and Sharp. Despite its title, this book isn't an introduction to HTML programming. It's an overview of HTML5, specifically. The authors say that they expect the reader is familiar with HTML and markup -- but I think they assume a fluency rather than a familiarity as the book tours new features without explaining old features at all. This book might be one of the best to augment your basic HTML understanding with the new level of knowledge, but Teague's title is probably better if you're just starting out. Curiously, this book is written as a tour of the new features rather than a reference. That might limit its usability for some.
CSS3: Visual Quickstart Guide by Teague. Teague's book includes a very brief overview of CSS and HTML, continues with a review of using the simpler CSS constructs, then explains how to apply different style attributes to realize particular effects. The book does couple CSS3 and HTML5 at the tutorial level, so if you're starting out to learn both this is probably the title for you.
C++ Primer by Lippman, et al. I like this book because it is a very approachable tutorial, but it works very well as a reference. It is well-organized and has a great index, so once you work through it you'll want to keep it around to look up things you don't understand or things you've forgotten. The book is sectioned to cover different structures of the language. It does so succintly and with excellent examples.
C++ Primer Plus by Stephen Prata. Despite its similar title, this book is different than Lippman's book. It's more of a tutorial, and not so useful as a reference because of poorer indexing and organization that favors the tutorial more than the book's use as a reference.
The C++ Programming Language, by Bjarne Stroustrup. This is the definitive reference for the C++ language, written by the language's designer. Not much of a tutorial, but if you need an answer it's most likely in this book. If not, you'll need a copy of the language standard itself.
C++ Templates: The Complete Guide by Vandevoord and Josuittis. Templates are something of a language within a language in C++, and confound even experienced programmers because of their different semantics. This books helps programmers approach and understand templates with concrete examples, deep discussions of the exceptional use of their semantics, and appropriate explanations of the language design underlying the implementation of the language. The first part of the book provides an overview with simple approaches, while the second part of the book reinforces that basic knowledge with details about more aggressive usage of the language feature. A third section discusses the use of templates as an architectural tool in the development of extensive libraries or large-scale programs.
The C++ Standard Library: A Tutorial and Reference by Josuittis. The STL is an important -- though sometimes overrated -- part of the C++ language standard. This book provides a sound overview of the design and implementation of the STL, discussing considerations important for the appropriate use of the library. Unfortunately, the book is becoming dated -- last updated in 1999 -- and doesn't discuss some of the newest changes and features in the STL. Further, the book falls a bit short on discussing some of the architectural pitfalls of the STL. If you don't have good documentation for your compiler's STL, or want a more approachable overview than the documentation you have, this book is still very useful.
Effective C++, More Effective C++, and Effective STL, all by Scott Meyers. The Meyers books are approachable because they've got few pages (all less than 300) and are broken into short essays about different programming techniques. The books provide maxims about programming strategy in very a prescriptive format. The essays are intended to suggest techniques that can be implemented through code rather than thinking about very specific examples. While the authors' opinions are sometimes a bit pedantic and have fueled no shortage of religious wars, overall they're sound and sensible approaches toward implementing involved programs with the C++ language. If the books have one flaw, it's that they're not aggressive enough at reminding the reader that rules can be broken. There are always reasons to ignore advice in the real world -- not every maxim applies to absolutely every situation. Discussing the fringe cases where the popular practices might not perfectly apply can be just as important as understanding the mainline cases.
Computer Architecture: A Quantitative ApproachHennessy and Patterson. This is a common graduate-level text for computer architecture classes. The book describes how multi-core systems work and focuses on the issues of concurrency in multi-processor and multi-core systems. Great discussions about issues affecting program efficiency and concurrency are covered here, but the book is certainly not an introduction to architectures. For an entry-level book, readers should consider Computer Organization and Design by the same authors. This book is more formal than the titles on the informal book list, but explains how the processor works, how it interfaces to memory and persistent storage, and how peripherals will interact with the core system.
Code: The Hidden Language of Computer Hardware and Software by Charles Petzold. This book explains how computers work by discussing fundamentals of signaling theory and information storage. The book broaches these concepts by using simple analogies and explaining how the fundamental solutions that computers use for different problems were discovered and, most importantly, why they were chosen and still used to this day. Why do computers use binary? Why are transistors so important? How is information actually represented in a computer? What is memory and how does it work? And so on -- all these questions and more are answered by this title, which is very approachably written and an ideal introduction to the layman about what makes a computer actually function.
Write Great Code: Understanding the Machine by Randall Hyde is the first book of a trilogy that discusses low-level programming concepts and implementation ideas. This first book stands alone as a very good introduction to computer architecture and implementation. By describing how the machine works, Hyde gets programmers an excellent introduction into issues they'll face throughout their careers. Hyde's book is aimed at providing a basis for computer programmers, so it's more technical than Petzold's Code book, which doesn't always cement the concepts it introduces to the more formal computer science-specific concepts they under pin.
Compilers: Principles, Techniques, and Tools by Aho, etal. Called the "dragon book" because of its cover art, this title investigates compiler implementation by discussing various types of parsers, tools for implementing grammars and producing parsers from those grammars, and implementing language features. Coverage provided is very broad, in that each step of the compiler ends up demonstrating and comparing different methods for achieving the result; the compiler generation chapter includes SLR, LR, and LALR generations. While this book is the essential reference for compiler developers, it falls short in failing to provide a much implementation details. While you might never write a compiler in your career, understanding how to implement a good parser is a very im0ortant skill whether you're cracking a data file or skimming through a simple script language they you've built to help implement a particular tool. A casual read of this title can help add some important skills to your repertoire
SQL and Relational Theory by CJ Date. Relational theory is a deep subject, and it seems a bit pure -- inapplicable to tactical, real-world problems. Finding a good database model, however, requires a strong understanding of relational theory and predicates success on all but the most trivial database projects. This book does a brilliant job of uniting the ideas behind relational theory with practicable and clearly implemented SQL queries and samples. The result is a very approachable investigation of relational theory that is easily applicable to tangible problems and not "in the weeds" like so many books on theory.
Transaction Processing: Concepts and Techniques by Gray and Reuter. Having worked with Dr Gray at Microsoft and being saddened by his loss at sea in 2007, I have a bit of bias. Even withstanding this disclaimer, I don't think there's a better book about transaction processing available. The book investigates the basic requisites of transaction processing systems, then investigates how they might be implemented, and how they're applied. Locking, locking, and management are all treated sensibly, and the book covers distributed and multi-phase transactions as well. This book is invaluable for someone implementing their own database management system -- however simple -- but also helps developers understand how their commercial relational database management system (or transaction coordinator, or distributed components) should behave when handling transactions. Unfortunately, since Dr Gray is no longer with us, an update to this title is probably not forthcoming. A similar title more recently published is Principles of Transaction Processing. Its scope is a bit less ambitious but the material it does cover is just as deep as the Gray-Reuter book.
Data Modeling Made Simple by Hoberman. Without an appropriate data model, your database project is damned to failure. Hoberman's book explains what a data model is at the subject, logical, and physical levels. It describes entities, attributes, relationships, and keys, then discusses ways to measure data model quality. The book gives lots of very clear examples to support its claims, but falls short at providing prescriptive, step-by-step advice for creating an appropriate data model. Given this last feature, it would be a very appropriate title for large organizations pursuing data-oriented projects as both the non-technical staff and the technical staff could read it and use it to find common ground when inventing databases for business needs. The title is still a great reference for technical readers, however, and is one of the few approachable titles in the field.
Introduction to 3D Game Programming with DirectX 11 by Luna. This book assumes you know C++ and a bit of Windows. The author devotes some time to matrix algebra, but perhaps not quite enough time for some less experienced readers. Given those pre-requisites, the author jumps right into developing 3D rendering code with DirectX. The book discusses lighting, texturing, mapping, various shading effects, and has suggestions for implementing different atmospheric effects like fire and rain. The book seems a bit focused on simple rendering, however, and doesn't do much for actual game development. To write a game, you'll need to know how to do rendering -- but this book doesn't include much information on creating entities, AI, game design, or implementing frame loops to drive the game engine and rendering engine. Code examples use "real" C++, so understanding classes is requisite.
3D Game Engine Architecture: Engineering Real-Time Applications with Wild Magic by Eberly. This book examines the architecture of a game engine by studying Wild Magic, a game engine implemented by the author's company. The book serves to discuss the application of the core components of a game engine by implementing them, then reviewing the implementation as applied to the development of a simple game. By studying how the system actually performs, the reader gets a strong sense of how the different features fit together in order to form the architecture, where the pitfalls and difficulties of the design of a game engine occur, and how the engine fits together to meet the requirements of its consumers. The book is an outstanding treatment of the subject. Perhaps the largest flaw is that the book hasn't been updated lately, so some of the limits the application ahs are now solved problems. The game engine itself has been updated, so code you're likely to encounter on the job (or after downloading the newest version from the supporting website) won't perfectly match what's discussed in the book.
3D Game Engine Design, Second Edition: A Practical Approach to Real-Time Computer Graphics by Eberly. This title is something of a companion to the Wild Magic title by the same author, but is not tightly-coupled to the other title. The author draws on his experience implementing and using his Wild Magic game engine in this tome, but doesn't use it as an authoritative reference for his discussions. This book is structured to visit most of the graphical features of a game engine -- the graphics system, renderers, scene and object management, curves, space management, and so on. There are sections on physics and collision detection, but these are relatively superficial. Techniques for implementing the different aspects of a graphics engine are reviewed and the math discussed. (The math can get rather involved at points, but if you're not up for the math, you're not up for graphics development.) You can think of this book as treatment of the graphical parts of a game engine that is far deeper than the discussion provided in the Architecture book, while the Architecture book investigates all aspects of a game engine fairly equally. This title doesn't tie itself as tightly to Wild Magic as the Architecture book does. Together, they're a deep, applied investigation of game development.
Java Concurrency in Practice by Goetz.
Effective Java by Bloch.
Java Tutorial and Java EE 6 Tutorial from Oracle's imprint at Addison Wesley with a total of eight authors.
Java Performance by Hunt and John.
The Elements of Java Style by Vermeulen et al. A tiny book (just 125 pages and small format) that more than 100 concise tips for programming in Java. Mostly around style -- how to format, name, and document your code. But covers packaging and some structural issues, as well.
JavaScript: The Definitive Guide by Flanagan.
JavaScript: The Good Parts by Crockford. Lots of jokes about JavaScript are spurred by the length of this; only 175 pages (so there must not be much good about JavaScript -- get it?), but the treatment of javaScript here is very succinct and focused. This isn't a tutorial on programming, though it is an acceptable tutorial for developers experienced in other languages who want to learn JavaScript effectively. The book investigates attirbutes an experienced developer knows will exist in a particular language, and discusses them without explaining them deeply. The section on objects, for example, spends only four or five paragraphs introducing the notion of an "object". That's not a tutorial on OOP, but it is enough to remind even a rusty reader about what they need to absorb the following chapter. There's a chapter on programming style, which is incredibly important when writing large systems and succintly justified by the author: "style matters in programming for the same reason that it matters in writing. It makes for better reading."
Operating System Concepts by Silberschatz, Galvin, and Gagne. The Operating System Concepts book has been around for years -- this is its eighth edition -- and has been a staple on college operating system courses. The book starts from the basics, defining an operating system by discussing its roles and requirements. It visits each of the major features of any operating system in depth, discussing different implementations and features, as well as some pitfalls and compromises within those implementations. The book visits memory management, process scheduling and structure, storage management and interfaces, security, and distribution. It includes a couple of special interest topic and spends some time investigating the specific decisions made in Linux, Windows, and a set of other less-widely used but still influential systems. Perhaps the most common competitor to this book is Tanenbaum's Modern Operating Systems book. Tanenbaum's book is a bit more approachable in writing style, but spends a great deal of time investigating commercial implementations and discussing their features and benefits. This is a bit of a distraction from the pure theory, but conversely cements the facts the book covers with practical implementations.
PHP Cookbook by Trachtenberg and Sklar. I'm a big fan of the "Cookbook" series titles from O'Reilly because I find them very approachable. The titles contain a couple hundred short solutions for the platform they discuss, from formatting a string to enumerating directories; from very simple one- or two-line solutions to programs that are a couple pages long and implement useful tools that you can use yourself as a starting point for your own solution, or to use as a tool for some other chain of commands that gets the job done. The PHP title in this series epitomizes this approach, providing examples about error handling, instructions for performance tuning, crafty regular expression applications, several security hints, and lots of lower-level language idioms and cliches. This isn't a great book to use when learning programming from scratch, but if you're already a programmer and PHP isn't your first language, or you don't use it often enough to become extremely facile in its application, the book is a great help because you know what you're looking for and will be able to find it very quickly in this title. If you like to learn by example, or by having your disorganized questions answered promptly, this might be a helpful title -- but you'll still need a book that teaches you the practice of programming.
Learning PHP, MySQL, and JavaScript: A Step-By-Step Guide to Creating Dynamic Websites by Nixon. This recently-revised book covers the core web development technologies. It shows how to set up a development server that runs Apache, PHP, and MySQL on your Windows, Linux, or Macintosh box, and how to use it to start building web sites. The title contains a few chapters on the basics of PHP and shows how to build simple dynamic web pages with the language. It then investigates MySQL and merges the two to develop form-based applications. Finally, it investigates using Java script in the pages to script and augment some of the client-side page features to help with validation. The final chapters bring each of these technologies together to start using AJAX to build robust pages. If you're making the transition from being a page designer to doing web development, this title is probably ideal for you; it doesn't spend much time on HTML or CSS, skips the rudimentary aspects of HTML, and gets right to the good stuff. The coverage here will get you started and might be enough to help you start implementing real web sites, but you might also need to get a secondary reference for the other involved languages and tools.
Programming Python by Mark Lutz is a title in the well-recognized O'Reilly series. The book starts of with a basic overview of the Python environment, describes the interface between Python's environment and the operating system, and then discusses GUI implementation using the Tkinter layer. The book devotes a large section to scripting various tasks and treats server- and client-side scripting with appropriate discernment. The book isn't much of an introduction; it's aimed at those who have experience writing software in some other language. The same author's book Learning Python: Powerful Object-Oriented Programming is an exceptional introduction to programming. The book uses Python to explain how programs interact with computers, how programmers interact with programs, and then investigates the various features of the Python language -- data types, control flow statements, functions, and so on. Someone starting out with zero programming experience might consider the Learning title and a copy of the Python environment as way to start programming with few barriers, though they'll still needs some mentoring and a way to identify projects meaningful to them personally.
Python Cookbook by Martielli, Ascher, and Ravenscroft. This book has all the features I like about the O'Reilly "Cookbook" series applied to the Python language. (See the PHP Cookbook description for details.) The title is getting a bit old, though Python hasn't changed in ways that demand a substantial revision of this title. The scope of the cookbook includes useful advice about generating UI with Python, applying the language to multithreaded applications, and doing some debugging and tuning as well.
SQL For Smarties by Celko. Joe's book is the one I always recommend to those who want to learn SQL. It explains that SQL is based on set-oriented operations, and holds this theme firmly throughout the title. Such an approach might make the title a bit intimidating, but it turns out to result in a simplification of the introductory topics and lays an impenetrable foundation for the more advanced issues the book discusses. Celko sticks to ANSI standard SQL, which is a bit of a problem as there are few (maybe there are none!) database management systems which fully implement ANSI-standard SQL. The reader will always need to do some translation to the dialect their servers run, whether they're using MySQL, Microsoft SQL Server, or Oracle. The book is still better than any vendor-specific title I've read, and a great introduction to the language even for those who don't have experience writing software in procedural languages.
Microsoft SQL Server 2012 T-SQL Fundamentals, Ben-gan. If you're using SQL Server, I don't think there's any replacement for the Inside SQL Server series. The entry point to this series is this T-SQL Fundamentals title, which discusses ways to use T-SQL to write queries. It's strictly focused on commands that work against tables and views, and how data is extracted from the database. It focuses on thinking about sets of data, helping readers avoid the trap of iterative data management, which often kills any hope of figuring out the most efficient way to write a query. It also discusses query optimization significantly enough to give insight into working with the QO to tune queries. It visits lots of advanced techniques like partitioning, and includes a large section on writing statements that alter data -- updates, inserts, and deletes. The book doesn't discuss database design or implementation; for that, you'll want one of the relational theory books.
Microsoft SQL Server 2012 Internals, Delaney, Beauchemin, Cunningham, Kehayias, Randal, Nevarez. SQL Server's database engine is large and complex, full of features and interesting implementation details. This book discusses exactly how the query engine, the storage engine, and the execution engine within the server are implemented at a level of detail intended to help developers understand the server's architecture well enough that they might avoid problems in their architectures, diagnose symptoms, and investigate issues in performance of the server. The book is thick with technical information, but is organized well enough that it is approachable as a troubleshooting reference. If you're wondering what the difference is between two different types of indexes, for example, the book certainly answers that question -- and does so down to the a level which describes what data is in the data file.
Inside Microsoft SQL Server 2008: T-SQL Programming, Ben Gan, et al. Aside from a data manipulation and modification language, T-SQL is also a procedural language. This book examines the procedural constructs in T-SQL and some of the more advanced enhancements to the data-oriented constructs. It discusses views, error handling, temporary and table-based variables, cursors, stored procedures, and triggers. It explains how Service Broker works, how the various new advanced data types in SQL Server are used, and discusses SQL Server's support for XML. If you're writing aggressive T-SQL for your application, you'll want to get this book ad well as the Querying book in the same series. (So far, it seems like this book isn't updated for SQL Server 2012.)
MySQL by Dubois. You'll want to be sure to get the fourth edition of this title (or a newer one) because that's the first release of the book that covers MySQL 5.0. The book provides an overview of MySQL including its installation and administration, discusses programming MySQL in C, and has overviews of some of the basic MySQL features like stored procedures and the various data types used by the server's implementation of SQL. The book has reference material providing overviews of the different storage engines supported by MySQL, plus their various modes and settings, as well as references for the PHP and C APIs. The book is very broad in its coverage, though not always as deep as you might like it to be.
MySQL Administrator's Bible by Cabral and Murphy. Despite its title, this book has a large section (more than 250 of its 830 pages) devoted to a section called "Developing with MySQL". This section covers things that people writing SQL need to know about the server; creating views, using transactions, the different data types and index schemes supported by the server, and MySQL's implementation of events, triggers, and stored procedures for procedural programming. This section also contains a useful chapter about MySQL's deviancies from the SQL language standard. The balance of the book covers the regular administrative tasks, including backups, handing caching issues, tuning the server, optimizing queries, monitoring and securing the server, measuring performance, and high-availability solutions. While the book is not quite as broad as the Dubois book, it is better organized and more focused.
Windows Internals, Part 1 and Part 2 by Russinovich, Solomon, and Ionescu. Inside knowledge of the Windows operating system is difficult to come by because Microsoft struggles to document all of its features, implementations, and interfaces. The Internals book provides tremendous insight into how Windows works, which helps users understand how it can be best diagnosed and tuned, and helps developers understand how to best write software for its subsystems. There would be many fewer arguments in the OS section of this forum, for example, if more users took the time to understand the chapters on memory management and security. The chapters on storage, security, networking, and file systems are extremely valuable to anyone who needs to use Windows in high-availability or high-performance environments.
Programming Windows by Charles Petzold. This book is out of print, but I don't think there is any better tutorial or reference for the developer who is writing Win32 code in C or C++. And developers who are using another language probably also need to learn the concepts here so that they fully understand the system they're using -- particularly how USER and GDI work. The examples are all in "flat" C, so there is a huge amount of repetition and boilerplate code, but the details exposed by such a low-level approach are vitally important to writing good code for the platform. There are many substitutes for this book, such as Windows via C/C++, Win32 Programming, and my own MFC-oriented book Professional MFC with Visual C++. While you can learn some of the things you'll need from these titles, the Petzold book is the definitive reference for Windows developers choosing C as their language. If you want to write more modern apps (using C# and XAML, targeting Windows 8 and newer), you'll want http://www.amazon.com/dp/0735671761/ by Petzold.
Last edited:
As an Amazon Associate, HardForum may earn from qualifying purchases.