A New Bible For Programmers?
KZigurs writes "The wonders of online publishing... If you are ready to take on a heroic task and read thru all 976 pages of Concepts, Techniques, and Models
of Computer Programming (draft) (pdf file, 3MB, intro here) written by Peter Van Roy and Seif Haridi you won't regret it. Just finished reading it and I feel like I have read the Bible. And who knows? It has the potential, and since current de facto books about programming are aging with increasing speed it very well may become one. (Please read the intro to get more detailed outlook at topics covered)
Anyone before heard about Oz?"
Anyone before heard about Oz?"
I'm not sure why the article links to the April 26th draft version of the book, when the intro page itself has the link to the much newer June 5th version.
d f
http://www.info.ucl.ac.be/people/PVR/booksingle.p
I look forward to reading it from the intro, however, might be really worthwhile.
Please subscribe to see the more insightful version of th
Does this bible also make the prediction that something huge will happen at the end of the millennium?
It appears that the site is already...umm...slashdotted. Google's cached HTML version can be found here.
Anyone have it mirrored? I'd love to read/print it.
"Times have not become more violent. They have just become more televised."
-Marilyn Manson
I am not a programmer but this seems to me a very interesting book for people who want to have a detailed yet general (hope you understand what I mean) idea of what's going on inside their computers as they are hammering their keyboards. Seriously, popular books on computer programming usually learn you how to use a certain programming language and not the concepts behind writing a computer program so this is a must-read for all people that want to learn to program computers.
-- Cheers!
10101000010000011111101001100101001000101000101010 10101000000100000101001010100001000000000000111111 11111111111111100001000000000000000000000000000000 00000000000000000000111111111100000000110010000000 00111111111111111110000000000000111111100010101000 10000000010000111111111101111111110010100100101111 00100010100100000110010000000011110010001000010000 00001000111111100011101000100001000000000011111111 00100001001111111111100000011100100111011111111100 001111111111100000000000111111111100100
Design Patterns.
The google cache of the pdf (converted to HTML by google) is here.
-Adam
I'm sorry to sound susppicious, but the concepts of programming are not out dated. The problem is tat programming has actaully become (or rather started out) incredible sophisticated and that a lot of programmers now have not been properly trained (be it by self study or a rigour CS program). And that flurry of programming books are more lke cookbooks and dont really *teach* anything anymore.
I find it rather hard to believe that Knuth's analysis of algorithms of Sorting and Searching have/will become out dated. I think his title the ART of COmputer Programming was always incredible ironic because he has done more than anyone else to turn into a real science, which it is now, and by which I mean that it has hypothesis that can now be tested. His book lay the foundation for it and I doubt any new programming book, short of specilized computer journal articles have done much to advance programming.
Sigs are dangerous coy things
... we must not forget The Tao of Programming by Geoffrey James.
With luck, someone who does have points will jump in...
-- MarkusQ
More interestingly, it seems may are actually RTFBing.
Oh, I just hope no karma whore posts the book here. 8-)
Yesterday was the time to do it right. Are we having a REVOLUTION yet?
Mozart & Oz are well-developed and worth a look--
your programming may improve because of them.
Cheers, Joel
p.s. here are quick excerpts:
The Mozart Programming System is an advanced development platform for intelligent, distributed applications. The system is the result of a decade of research in programming language design and implementation, constraint-based inference, distributed computing, and human-computer interfaces...
Mozart is based on the Oz language, which supports declarative programming, object-oriented programming, constraint programming, and concurrency as part of a coherent whole...
We have developed many applications including sophisticated collaborative tools, multi-agent systems, and digital assistants, as well as applications in natural language understanding and knowledge representation, in scheduling and time-tabling, and in placement and configuration.
Yep, we had to use Oz in a Programming Languages & Semantics course I took in grad school. All I really remember is that it used "constraints" rather than "values" for variables. For example, a variable doesn't necessary contain a single value, but it might contain the constraint "greater than 100, less than 2000". And you can do all kinds of stuff with intersection and union of constraints, and... ahh, that's all I can coerce out of my brain. I thought I had repressed it forever. :-)
Use Ctrl-C instead of ESC in Vim!
For those curious why this books uses Oz as it's language of choice, it is one of the few, if not the only language, to support the many popular paradigms of programming:
* procedural, like C & BASIC
* object-oriented, like Ada & Java
* functional, like Scheme & Haskel
* declarative, like Prolog
It that way, this book is a good way to keep your mind open to different approaches to doing things.
Anm
It's mirrored here courtesy of SurveyComplete.
Incedentally, I highly recommend the book Code Complete: A Practical Handbook of Software Construction by Steve C McConnell. It tought me more about programming than the rest of my computer book bookshelf!
Another great resource is Safari. It's a web service that for a fee, allows you to view O'reilly, Que, and Sams books online. I find the code search feature to be invaluable. Cheap way to read technical books.
Is this book really as authoratitive as it tries to appear?
There are two kinds of transistors, bipolar junction transistors and field-effect transistors. Bipolar junction transistors are sandwiches made from two layers of N-type silicon separated by a layer of P-type silicon. A bipolar junction transistor has three terminals: an emitter, a base, and a collector. The emitter and collector are connected to the N-type silicon (on opposite sides of the sandwich) and the base terminal is connected to the P-type silicon. When a small voltage is put on the base terminal, current is allowed to flow from the emitter to the collector. (This is for an NPN-type transistor. There is also a PNP type which is the opposite and works with negative voltages instead of positive.)
A field-effect transistor has three terminals, too, but they are called the source, the gate, and the drain. The source and the drain are connected by a channel made of N-type silicon, but the channel is somewhat narrowed by P-type silicon in the middle which is connected to the gate terminal. When you put a voltage on the gate, it creates an electric field which chokes off the current flow from the source to the drain. There is also a type of field-effect transistor with a channel made of P-type silicon, and the voltages are negative.
I have done better than implementing a sort algorithm; I implemented keyless 2-3 trees in a functional style and thus speeded up my LR(1) parser generator from 27 minutes to 4 minutes.
The work of people like us makes the work of people like you possible. So: nyah nyah na-nyah nyah.
Sunlit World Scheme. Weird and different.
Based on reading the Preface and a brief scan of the table of contents, this book is interesting for what the authors do not cover, by design. Nothing on static typing, nothing on algorithms, AI, databases, or numerical techniques.
To some, leaving these topics out of a "bible" would amount to extreme heresy. The content of this book owes more of its lineage to The Structure and Interpretation of Computer Programs than The Art of Computer Programming.
all depends what those 1000 pages are full of. If it's 1000 pages of "teach yourself NEW_FAD_TECHNOLOGY in 21 days" then I'd agree. If it's 1000 pages of authoritative, carefully considered and exhaustive thought, then I'd say 1000 pages is to little... I'd like a lifetime supply.
As for this book... so far I've only skimmed, and for being free on the web as a preprint, I'd say it's fantastic. I'm also reading Programing Language Pragamtics right now, and it's a little more complete treatment of the same subject area.
On the contrary. In my experience, an awful lot of programmers, mostly those who are self-taught but don't realise what they're missing, frequently choose an incorrect data structure or algorithm even for simple things like sorting and searching. If you're working in a field where performance matters at all, that can be crippling.
I agree that hardly anyone should need to write the usual sorting or searching algorithms from scratch today. It's almost invariably easier and safer to use one from a library, though of course there are a few legitimate exceptions. But you do need to understand the basics of the algorithms you use, their performance characteristics and the limitations they have.
This is particularly important with the growing dependence on library code, because most libraries provide only a few "typically best" algorithms. Sometimes an introsort variation isn't the best, or even close, but only the programmer who knows about his own data and who understands the range of algorithms available is able to judge when an alternative is more appropriate.
No, but I could tell you off the top of my head the algorithms for intro sort, quick sort, merge sort, radix sort and several others, and implement them for you in a procedural or functional language without a whole lot of reading. I work with performance-critical applications every day, and you'd expect nothing less from a professional in my position.
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
I had a quick scan over it, and while I'm reluctant to judge on first impressions, I couldn't help feeling that it had a lot of breadth but not much depth. It struck me as somewhat similar in style to the wizard book, though obviously with wider coverage.
I had the same immediate reservation as you did: the OOP section seemed weak compared to established "classics" in the field. Failure to mention things like LSP is unforgivable in a book aiming for a theoretical approach. The offhand comment about "whatever that means" in reference to sending messages to everything didn't much help, either; I'm guessing anyone who's used a language like Smalltalk or Ruby would be quite comfortable with the idea.
All of that said, there appears to be a lot of useful and worthwhile material in the book, and I'll certainly be dipping into other parts of it as time allows over the next few days. It's only a preprint, and I only looked at one section in any real detail at all, so I'll give it the benefit of the doubt for now.
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
What they called the "substitution property" is a waffly version of Liskov's clear and concise principle.
I appreciate the smiley there, but OK, I've now read the first half of the OO chapter in its entirety. Not only does it fail to mention the LSP in any useful way, it also fails to stress the interface/implementation separation, the significance of polymorphism and the way inheritance is used in many languages to allow it, the concepts of invariant conditions on a class' state and pre- and post-conditions on its methods, and just about everything else that's actually important about OO. Instead, they seem to spend lots of time going on about the cute syntax in their pet language.
Just to finally convince me that they don't really understand OO, their example (in section 7.4.1) of bad inheritance is dubious at best. They could have used the circle/ellipse or integer/rational "paradoxes" to demonstrate the hazards of using inheritance poorly, but instead they use an example that actually seems entirely reasonable to me. Their claim about what the outside world can expect violates the very principle of encapsulation: the outside world shouldn't know that, because it's an internal proprerty of that class... Unless, of course, it's documented in the interface as a post-condition of the method calls, but in that case, the derived class is breaking LSP. Oh, but they haven't mentioned post-conditions and how they are constrained by LSP, so it's kinda hard to say that.
Sorry, but having read 50 pages of that book, I'm quite convinced that it's not the new bible of programming. On the contrary, I would actually steer anyone interested in learning OO away from it, as I think its overweight theory and underpowered practice would be harmful to a newbie.
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
...I'll apologise now for the perhaps overly harsh tone of the parent post. As I noted in my original reply, there seems to be a lot of worthwhile material elsewhere in the book. I'm afraid I really don't like your presentation of OO, though.
Programming is my full-time job, and I use this stuff (and other programming styles you mention) all day. I also teach it to newbies from time to time. At that level, I've found that it's vital to get across concepts like invariant/pre-/post-conditions, and the focus on using inheritance with polymorphism and aggregation when it's not required. You can worry about the technical differences between subtyping and subclassing later, once they have some framework for the concepts. Introducing it all up-front from a purely theoretical viewpoint loses the major practical points of using OO, and leads to people like me objecting to examples of "bad" inheritance such as the one in the book. Obviously, this is just MHO and you're free to disagree. :-)
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
I'm going to partly retract what I sad above now that I've read more. While Programming Language Pragmatics may cover more ground, a lot of it is just trivial mention. This book sticks to the core of illustrating the concepts of modern programing, and fully exploring their possibilities. It's a different kind of book, and doesn't address the implimenters view as other "programing languages" books do. So far I'm really enjoying it.
science aims to understand some phenomenon; software science would try to figure out how to produce/test/maintain effective software. some of that happens in software engineering, but really, that's a bit of a misnomer, since software engineering is purely the application of what software science finds.
;)
ultimately, software engineering is just technique to a software artisan (programmer). a decent painter will study vision, brush-handling, art history in order to gain technique. but technique does not make an artist/artisan.
none of this was news to Knuth. and thinking it through also explains why I always thing of software engineering people as utter knobs
It certainly won't be the bible of the programers who think java is a good language, and it won't suit the people who trust the people who built Rational Rose to teach them how to make software. I had the chance to work with PVR when he was working for digital (hey peter!), before digital collapsed, and, though i have yet to start reading the boook, I expect some serious coding kung-fu!
Dev elpizw tipota, dev phoboumai tipota eimai lephteros http://euclidian.org
So what good does coding your own hash tables do?
Programming is about thinking - and two mean really involves two stages. Thinking and coding. Of course we need to know more than STL, and modification of standard algorithms is very important - in one of my algo courses a lot of time was spent describing how to make a modification to a simple BST to solve a complex problem. Once you can think critically and apply these skills to a programming problem, the coding is almost always trivial.
Coding up your own hash tables or whatever hardly ever gives you any advantage over really, critically thinking about data structures and algorithms outside of a coding scheme. You can learn to think in this way, and you can learn to code in this way - but there are more efficient ways to do both, not to mention more interesting ones.
I just looked at the section on Object-Oriented programming. I haven't read much of it, but just about everything I have read is wrong or confused. They continue this common misconception that objects are a form of ADT (abstract data type) and the inheritance is the only important concept in object-oriented programming. Some examples of their confusion: "We can loosely define object-oriented programming as programming with encapsulation, explicit state, and inheritance." On inheritance: "... stateful abstract data types are a very useful concept for organizing a program. In fact, a program can be built in a hierarchical structure as ADTs that depend on other ADTs. This is the idea of component-based programming." and "Inheritance is the essential difference between object-oriented programming and most other kinds of stateful programming." "In the most general case, a class is an incremental definition of an ADT, that defines the ADT as a modification of other ADTs. There is a rich set of concepts for defining classes. We classify these concepts into two sets, according as they permit the class to define an ADT completely or incrementally: *Complete ADT definition*... -Defining the various elements that make up a class (Section 7.2.3), namely methods, attributes, and properties. ...
-Taking advantage of dynamic typing. This gives first-class messages Section 7.2.5) and first-class attributes (Section 7.2.6). This allows powerful forms of polymorphism that are difficult or impossible to do in statically-typed languages. ...
*Incremental ADT definition* These are all the concepts related to inheritance, that is, they define how a class is related to existing classes."
As far as I can tell the entire presentation is completely muddled. If people are interested I can give references and more detailed discussion for their confusion. For example, they don't seem to understand the difference between subtyping and inheritance (extends and implements in Java). If I get time, I will write to the authors to complain. But there is probably nothing that can be done about it before publication at this point.
The trick is to use a truly high-level language, so the coding is trivial as long as you remember the basic algorithm:
Link ==> Discussion on Concepts, Techniques and Models of Computer Programming
Here is my conclusion from the disucssion:
Here is one of their final statements