Ask HN:  Rate this Start Up - Venmo.com - <AUTHOR> http://www.venmo.com

<comment><USER2> I like it - it's software the encourages you, maybe even forces you, to share the experience with someone else turning every user into evangelist. It also seems like it would make financial transactions very simple.

My only concern would be that phone numbers still haven't become non- transferable identification.

I'm sure you have considered these issues before but I would wonder about:

My parent dies and their cell phone account is turned off - how do I get their money out of this service?

My wife and I share a cell phone but we don't share checking accounts.

Someone has already created an account for my phone number.

I use multiple cell phone numbers.

etc.

</comment><comment><USER3> Just curious: Do you eat the transaction fee if people fund their accounts with credit cards? If so... it seems like people might pay themselves thousands of dollars to rack up rewards at your expense.

</comment><comment><USER4> It's a great idea, but in reality, it's going to be a very tough job to make it secure and legal. If you haven't read the PayPal chapter in "Founders at Work" yet, you should.

<comment><USER5> Or, PayPal Wars: [http://www.amazon.com/PayPal-Wars-Battles-Media- Planet/dp/09...](http://www.amazon.com/PayPal-Wars-Battles-Media- Planet/dp/0974670103)

It also mentioned the legal hoops they had to jump through...and was a very interesting read.

</comment></comment><comment><USER6> In South Africa (I moved to New York five years ago), it is common for people to transfer money from their bank account to that of a friend's electronically - either online or on your phone.

I was quite surprised coming to the US that it is not common here as well.

<comment><USER7> It's the same in Europe. My wife is Spanish and when I learned that you could transfer money to anyone's bank account easily and free, my brain exploded.

It's amazing that the U.S. is (was?) considered the leader of technological innovation, but we're still so backward on something like this. It reeks of corruption and lobbyists.

</comment></comment><comment><USER8> The fact that the site is "godaddy secured" fills me with confidence.

<comment><USER9> I get the sarcasm, but I don't get the point. Does the fact that GoDaddy has a horrible site/shopping experience from a usability standpoint somehow translate into a security stamp of approval that is "watered down"? Has GD has some major security breach? (maybe they have, I don't know).

Are everyday users of this service going to care?

<comment><USER10> The point is that GoDaddy has destroyed their brand to the point where their security guarantee inspires nothing but a visceral "ugh" reaction from everyone who's ever used them.

<comment><USER9> 250% revenue growth over 3 years isn't evidence of a destroyed brand, IMO.

[http://www.inc.com/inc5000/2009/company- profile.html?id=2009...](http://www.inc.com/inc5000/2009/company- profile.html?id=200912410)

</comment></comment></comment></comment><comment><USER11> That will work only if it is guaranteed that the sender phone number in an SMS message cannot be spoofed. Is this the case? Does anyone know?

<comment><USER12> SMS isn't secure.

<comment><USER13> Not even close to secure.

I haven't worked with US phones, but in Europe I can send you a SMS message that appears to be from any MSISDN (phone number). Violates all kinds of terms of service and contracts, but there's absolutely no technical verification of origin of standard SMS.

</comment></comment></comment><comment><USER14> What's the revenue model?

<comment><USER15> I love how this comment has no upvotes.

<comment><USER16> It clearly states on the site they make money of every text message sent.

edit: from the info pages

"We charge a transaction fee every time you receive money. Sometimes, the person sending you money can pay for the fees associated with the transaction. Those fees are outlined on our Venmo Fees page."

There's also a premium service for businesses.

<http://info.venmo.com/pricing/pricing-plan-comparison/>

<comment><USER17> But the person who submitted the story says otherwise:

<http://news.ycombinator.com/item?id=948793>

<comment><AUTHOR> As of right now they are not charging... it is open beta... but i'm sure that will change.

</comment></comment></comment></comment></comment><comment><USER18> You need some kind of a security code / pin system to prevent against fraud. Venmo has to match the pin in the message sent along with the phone number the message is sent from. And proceed with the payment only if the pin matches.

Venmo $10 to Jenny 1990

Where the last 4 digits of the message - 1990 in this case - is the security pin code.

</comment><comment><USER19> A bunch of you all emailed for invites--we're sending a batch out later this week. We'd love to hear more of your thoughts once you use it. A few cursory answers: everything is free for now (we're still trying to figure out what the transaction fees will look like, but they will be competitive with credit card), Paypal is a great comparison and as someone recced with a link Paypal Wars is an awesome read, we love the Godaddy brand too, the syntax is very flexible and constantly adapting to the way people want it to work, if anyone knows the textpayme guys would love to chat with them (i'm @kortina), Fundraiser events-YES!, and yes security and fraud are tough problems but we are eager to tackle them. Think that covers most of them. Again, thanks to those who wished us luck and provided criticism.

</comment><comment><USER20> If it's a service that holds any large amount of money, I'd want to make sure it's associated with or somehow endorsed by a major, trusted organization. The site looks nice and all, but still like a small business.

Also, doesn't Paypal offer this?

</comment><comment><USER21> _and we use advanced encrypting algorithms to protect the financial information stored in our system._

encryption algorithms

</comment><comment><USER22> Have you thought about giving the option to link to paypal accounts?

Early adopters will not have venmo accounts but will have paypal accounts. You may get more new users if you give the option to use funds in the paypal account. The service could at minimum send the user an e-mail with a link to the paypal destination and amount.

</comment><comment><USER23> <http://www.crunchbase.com/company/textpayme> anyone?

<comment><USER24> Also:

[https://www.paypal.com/cgi- bin/webscr?cmd=xpt/Marketing/mobi...](https://www.paypal.com/cgi- bin/webscr?cmd=xpt/Marketing/mobile/MobileAdvancedFeatures-outside)

</comment></comment><comment><USER25> There are A LOT of rules around money transaction services and the feds have only gotten stronger in their enforcement of them post-9/11. You'll need to watch out for so much fraud from carders. Best of luck, but perhaps you should talk to the textpayme guys, who did some very fancy things to avoid regulation.

</comment><comment><USER26> I'd make that "godaddy secured" animation static. It completely distracted me from your how-it-works anim up top.

</comment><comment><USER27> I think buying your own SMS short code is key to making this service look legitimate to new users. No one wants to text information about money transfers to a phone number that could be anyone.

Also, the phone graphics on your homepage are copied directly from the TextMarks site!

</comment><comment><USER28> This is a hot space, note that Gartner just released a list of the top 10 consumer mobile applications for 2012 and Money Transfer via SMS is #1: <http://www.gartner.com/it/page.jsp?id=1230413>

</comment><comment><USER29> first impression - how flexible is the input syntax? as a user, i'd be mad if i thought i typed in something syntactically correct (e.g., "venmo $5 to bob for lunch") but there was actually a syntax error and my transaction didn't go through

</comment><comment><USER30> This is almost exactly how Paypal started - except they 'beamed' it over instead of using SMS.

Eventually they realized that people were much more interested in using their website to transfer money, hence what we have today..

</comment><comment><USER31> Nicely done interface. A minor nitpick, if you send SMS to 646-863-9557, shouldn't the second screen have a different phone number? Or does all of the interaction you show there happens on the person sending the money?

</comment><comment><USER32> Very cool & good luck! I hope you can bring down PayPal to their knees.

</comment><comment><USER33> what happens if someone picks up your phone and writes venmo $100 to 555-123-4567 for hack. 555-123-4567 being their number? how can you issue a refund or deal with issues like this?

<comment><USER34> They got around this with Pago in NZ (<https://www.pago.co.nz/section261.aspx>) by working with the banks. The money doesn't get transferred from your primary chequing account - you have a separate account which is your Pago 'wallet'. Only that money is accessible to the service, and you have to use internet banking to transfer money from your chequing account into your wallet.

<comment><USER33> i understand. but the money still gets transferred from your 'wallet' account to the destination. how is that a reversible action in case of user error or malicious intent?

</comment></comment></comment><comment><USER35> Pretty cool, but I don't like the logo, it's hard to read. V & e have too similar colors and the "Ven" part is too tight above each other.

</comment><comment><USER36> My bank does this for free, and I can also withdraw the money from any of their ATMs as cash instantly if I want.

<comment><USER37> Your bank lets you send payments via SMS? What's your bank? Mine doesn't do that, I'd be interested in switching.

<comment><USER36> <http://www.garantibank.com/index.html> Best online banking I've seen so far too, I think they've won awards for it.

<comment><USER38> Home page has annoying animation. Guess there's still room for improvement.

</comment></comment></comment></comment><comment><USER39> I tried it out, it's super viral... I think it'll spread very easily, just like Paypal did.

<comment><USER34> That's what I thought when I signed up for Pago - an identical service which launced in New Zealand three years ago:

<https://www.pago.co.nz/section261.aspx>

It was launched by one of the major banks in co-operation with one of the major wireless providers. Still, it never took off. I certainly never found myself using it. I would've thought New Zealand was a prime test market, because we are incredibly reliant on txt messaging down here; around 85% of the population regularly use txt messaging.

I should note that when I say 'identical', it was identical. They have since shifted more toward online payments. It used to be solely for one-to-one payments. In fact one of the use cases on their original marketing website was the ability to 'split a restaurant bill'. Which is similar to the use case from the venmo website.

</comment></comment><comment><USER40> Whoever makes mobile payments ubiquitous will make billions.

</comment><comment><USER41> There are no transaction fees?

<comment><AUTHOR> 100% free

</comment></comment><comment><USER42> I don't see the point here. I mean, I could pay Jenny back next time I see her. Am I missing something ?

<comment><USER43> There are a few things here - 1) You don't have to remember that you need to pay. You pay instantly and be done with it. 2) Jenny may be someone you don't often see. 3) You're away but want to pool in for a gift or celebration back in town.

<comment><USER42> Thank you.

</comment></comment></comment><comment><USER44> Word.

1\. I am confused if I text a shortcode, or if I have to text that 646 bullshit?

2\. I should be able to click on step 1/step2/step3 in your animation in case I want to review the information contained in that slide a little longer.

3\. You have to be EXPLICIT about fees on the front page.

</comment><comment><AUTHOR> Think about use for Political/Charity Fundraiser events... I think the product is very beneficial.

</comment><comment><USER45> great idea, very clever. i posted this to pikk: Thrive or Fail? Send And Receive Credit Card Payments Through SMS Text Messages [VOTE] - <http://www.pikk.com/297fd>

<comment><USER46> I am not sure why you would want to do this. If it is interesting, then please discuss it here. Don't spam for another website to discuss it there.</comment></comment>


Ask HN: Share your long-term travel experiences - <AUTHOR>

I've been thinking about going away on a long trip. Driving from Toronto to Vancouver to Panama over the course of about 6 months, then flying to Asia and Europe.<p>I was curious about this crowd's experiences, since I'm pretty nervous about going. <comment><USER4> I finished up my masters degree in computer science last December. To celebrate I traveled to Japan, SKorea, China, Taiwan, Kenya, Tanzania, Madagascar, Comoros Islands, Seychelles Islands, Israel, Jordan, England, and Hungary. I did this all in about two months. An entire month in east Asia, a week in Israel.

I traveled a lot before that too: Russia, Czech Republic, Central America, Vietnam (3 times), Japan twice, Cambodia, Hong Kong, Canada, England, France, Purto Rico, Dominican Republic, and a few more. I built up a lot of airline miles over the last couple of years and used that on my last world trip. The biggest cost was my hotels, I didn't go cheap.

Traveling is the best thing I've done with my life. I'm 30 years old and feel like I have lived several lifetimes with all of the experiences and people I met through my travels.

Go for it. And one piece of advice... live debt free as I have so you can do those things. It's not worth going into debt over. You can always take shorter trips like I did. My longest was two months. I was able to keep working and finish up school while doing that.

If I can recommend places, Israel, Japan, and Vietnam are my favorite. China was the worst place I've ever been. If you want to experience China, go to Taiwan.

<comment><USER5> Why so down on China? I found it wild - like Russia, but without the fear of getting kidnapped or shaken-down by the cops.

As for advice...

Don't plan too much in advance. Know where you're going to start and where you're going to end, but be flexible about what you do in the meantime. Some of the best experiences I've had have come from meeting people and hearing lines that start with "So I went to..." and "I've got a free seat in a car tomorrow going to...".

Be positive. When faced with a decision, don't think of reasons you shouldn't deviate from your earlier decision; instead, think of reasons why you should. You're from a prosperous country with a good passport, you speak English, and you've got access to someone at home with some back-up money to bail you out if you get into something really serious.

Trust your gut. Despite being in places you've never been and dealing with cultures you didn't even know existed, your sixth-sense of danger is still pretty good. Ignore the "this is kinda unfamiliar/scary" gut feeling, as that's the whole point of travel. But when you get the "he's gonna kidnap me" one, listen to it hard.

Dress up. Few other places in the world wear t-shirts and sneakers as proper attire for going out. Go to Old Navy (or somewhere else suitably cheap) and buy four or five solid-color polo shirts - these should be your go-to everyday wear shirts. Bring a t-shirt, but only for outdoorsy things. Also no cargo shorts. My standard attire for rolling into a country I didn't know was a polo shirt, some worn-in darker khakis, and a pair of Pumas. This will be appropriate dress (within one standard deviation) pretty much anywhere in the world. After you arrive, look at what everybody else is wearing and correct up and down. Especially in not-Western Europe, local clothes are dirt cheap.

Travel light. Pack your back as perfectly as you would like, and then force yourself to take out five or six things. If you need it desperately, you can probably buy it there. If you buy something there, you can probably ship it back.

Learn fix or six words of the local language. I can greet people, order and direct a taxi, and find the washroom in more languages that I can count. I can almost never understand the responses I get to those statements, but you can usually get the gist from the body language.

Don't let pictures get in the way of the real thing. If you're going somewhere to see a particular thing, look at it. Take photos as an afterthought - <USER2> the other way around, and may people do subconsciously. While you're at it, take an hour before you leave to get a hang of using your pocket digital camera without looking at it; I can hold mine in my palm, hit the shutter with my thumb, and have a pretty good idea of what the picture will look at - <USER3> make up for the "pretty good" part by simply taking _lots_ of pictures. You can get photos of a lot more cool things when people don't notice the camera. If you can, get a camera that takes AA batteries, as well as the standard rechargeable - I have yet to go anywhere that doesn't have AAs at some price.

Get interested in sports. Know a few players who play for the Yankees, Red Sox, Liverpool FC, Manchester United, Chelsea, McLaren Mercedes, and Brawn Racing, and one or two reasons why you "like" that particular team. Armed with this information, you can strike up a conversation with a guy pretty much anywhere in the world. Probably a hockey team too, for the Canadian part of your trip. Also know that if you say "football", no one else will think you mean the kind in which you score a touchdown.

Do some reading. Not guidebook, but literature - both fiction and non-fiction. If I know I'm going somewhere, I'll try and find a few books written by authors from where I'm going and/or about where I'm going (ideally both). It gets me excited about the trip, provides some local background, and gives you a few common cultural reference points before you even get there. Your local independent book store is key for this - if you can find one that specializes in travel literature, even better. The best one I've found so far is in London, and they organize their travel section by country, as opposed to by topic. So if I was going to Argentina, I'd go to that section, and it would have guidebooks, cook books of Argentine food, books written by Argentinians, and books written by others about Argentina. Many countries have one "classic" or "definitive" book about them; see if you can find them (e.g. Argentina's is Bruce Chatwin's _In Patagonia_ ).

[Note that most of this advice is about the non-Canada/US part of your trip. Canada is very similar to the NE US except with different accents/slang/minorities, and fewer guns.]

Lastly...

Ignore this advice, and all the rest you get here. Travel is really an organized series of mistakes. Some end well, some don't, some you can't really tell. Accept what happens, go with the flow, and try not to die. Do that, and things will work out fine.

</comment></comment><comment><USER6> A few suggestions (hardly comprehensive):

Less is more, in terms of luggage.

If you have a U.S. type fashion sense (if you are Canadian, hopefully living under the maple leaf has provided some protection ;-), realize that the rest of the world tends to dress a bit "better". Not necessarily expensively, but e.g. slacks, a shirt with a collar, and leather shoes rather than jeans, t-shirt and sneakers. Although this may have changed in the last 10 or 20 years. I don't say this by way of worrying about appearance for its own sake, but rather just as a matter of better fitting in and not standing out quite as much. If you can afford to and will be in an area long enough to warrant, have someone help you pick out a few local wardrobe items.

Listen to local music to help train your ear (of whatever genre, but preferably with some lyrics). Even if you never master the language, you'll have a better feel for it. Ask people to explain the songs to you.

Have a reliable contact to check in with. Someone not too uptight, but who is capable and who can and will get the ball rolling if you need some sort of bailing out or rescue. Not that that's likely, but having arrangements in place may help you rest easier. In less secure areas, it may be worth registering with your government's local consulate.

Drop us a line now and then and tell us how it's going.</comment>


Ask HN: What are the most fundamental books on computer science? - <AUTHOR> I'm relatively new to CS (4 years) and I've seen a lot of great book recommendations here. But every discipline has it's most fundamental books ... e.g. philosophy -> Socrates, Plato, Aristotle, civil law -> code civil, christianity -> bible, etc. one should read to get a truly deep understanding.<p>What are those books for CS? <comment><USER2> Structure and Interpretation of Computer Programs (), Introduction to Automata Theory, Languages and Computation (Hopcroft Ullman), don knuth's art of computer programming, Tanenbaum's Modern Operating Systems, Compilers: Principles, Techniques, and Tools5 (Aho Sethi Ullman)

<comment><USER3> While "The Art of Computer Programming" is a great book, it's not a fundamental book. I'd say it's more of a re-distillation plus some of Knuth's personal take on things.

Also, I'd add, at least:

Introduction to Algorithms / Cormen, Leiserson & Rivest (and recently also Stein)

<comment><USER4> If by "fundamental" you mean "original research" then yes - a lot of Knuth's content is re-distillations on original research.

On the other hand, Knuth has an _incredible_ capacity to read, interpret, understand, and especially _apply_ and _expand_ the contents of research papers -- far beyond the capacity of nearly anyone else.

So if you want to spend a lot of time reading through ACM and IEEE journals, have fun. But you'll understand the research and be able to apply it far better when helped by Knuth.

<comment><USER3> I mean it doesn't serve as the fundament, as the basis, of most people's knowledge and understanding of Computer Science, or of programming.

By the way - the same goes for Graham-Knuth-Patashnik's Concrete Mathematics.

</comment></comment></comment></comment><comment><USER5> CS is such a wide field, I think that fundamental texts mean different things to different people. These are some examples of various CS verticals (from off the top of my head), and each has canonical texts:

For instance, there is a whole subset devoted to turing machines, the halting problem, finite state machines, provability, incompleteness, the set of all sets, diagonalization proofs etc

There is a whole subset devoted to programming languages: computational complexity, reducing the time spent in loops, and so on.

Then there is a whole bunch spent on best practices: git and other version control, review, commenting style.

Then there is this actual thing called programming: learning different languages, arguing when functional is better than object oriented, please build a web server in prolog as an exercise, and so on.

Then there is a bunch about operating systems, and where the hardware meets the software, and garbage collection, and parsing and all that stuff.

Then databases are their own thing: boyce-codd normal form, ACID properties, is the web a database? how do you prove the ACID properties? Distributed databases, and B-trees time for storage and retrieval.

These are just various sort of "verticals".

I myself like to think of it in terms of specializations: data science/machine learning is one, web apps are another, mobile apps are another and so on. Each specialization depends on what useful thing you are trying to achieve.

<comment><USER6> Speaking of specializations... sometime ago I asked a similar question about AI and ML. Unfortunately it never got much attention:

[https://news.ycombinator.com/item?id=20920018](https://news.ycombinator.com/item?id=20920018)

</comment></comment><comment><USER7> CS is like math, not philosophy -- the fundamental ideas are gradually refined by a community, and eventually someone puts them into a book. Usually there are many books and people have different favorites.

So the closest parallels are original research papers like Turing's and Shannon's; but you're probably better off reading more recent textbooks.

That said, to balance out the heavy emphasis on programming and engineering books here, some recommendations:

\- Sipser. Introduction to the Theory of Computation.

\- Russell, Norvig. AI: A Modern Approach.

\- For algorithms I don't have a preference. There is Dasgupta-Papadimitriou- Vazirani; Cormen-Leisersen-Rivest-Stein; Kleinberg-Tardos; and more.

A bit farther from core CS, I also like:

\- Cover, Thomas. Elements of Information Theory.

\- Li, Vitanyi. An Introduction to Kolmogorov Complexity and Its Applications

<comment><USER8> Mathematics has a linear progression though.

You need to know numbers and simple algebra to tackle trig, you need to know all that to tackle calculus or linear algebra, you need to know those to tackle differential equations.

I would argue CS is closer to philosophy.

Sure you have programming building blocks like variables, loops, conditionals, objects blah blah.

But you quickly head into patterns and conventions that started out as someones opinion on how things should be set up, rather than some fundamental principle.

<comment><USER9> Mathematics has a (mostly linear) _historical_ progression, not _logical_ progression.

It very often happens that the shortest, simplest derivation is discovered a century after the original discovery.

E.g. if you define exp(x) as \sum_0^\inf \frac{x^n}{n!}, a crazy amount of things that (historically) took a lot of effort to derive, become exceptionally simple and straightforward.

Now, historically, it didn't make sense to define it that way (especially because limits and infinite sums were only rigourously defined much later). But complexity wise, it is much simpler to first define limits and only then the exponent as an infinite sum.

> But you quickly head into patterns and conventions that started out as > someones opinion on how things should be set up, rather than some > fundamental principle.

That's not computer science. That is indeed philosophy, specifically software engineering philosophu. Science, it is not.

</comment></comment></comment><comment><USER10> Structure and Interpretation of Computer Programs is frequently recommended here. I would especially recommend understanding section 3.2, which I've found very helpful for understanding the environment model of other languages.

Computer Systems: A Programmer's Perspective has a lot of good explanations of hardware/os subsystems that can be hard to find detailed explanations of elsewhere. I especially like the sections on virtual memory.

<comment><USER11> The interesting bit is that the original author's no longer feel that SICP is the right way to approach programming any more. In their words, we've moved to 'programming by poking' and hence the latest incarnation of the course uses python and not LISP.

<comment><USER12> "The interesting bit is that the original author's no longer feel that SICP is the right way to approach programming any more."

I think it's more accurate to say that they didn't see a reason to require engineers to learn CS. The class is now completely different. Why python? Not because it's a good programming language, but because there was a library the students could call to control a robot, which was the new goal of the class, _not programming_.

Here's the quote:

You have to do basic science on your libraries to see how they work, trying out different inputs and seeing how the code reacts. This is a fundamentally different job, and it needed a different course.

So the good thing about the new 6.001 was that it was robot-centered — you had to program a little robot to move around. And robots are not like resistors, behaving according to ideal functions. Wheels slip, the environment changes, etc — you have to build in robustness to the system, in a different way than the one SICP discusses.

And why Python, then? Well, said Sussman, it probably just had a library already implemented for the robotics interface, that was all.

[https://www.wisdomandwonder.com/link/2110/why-mit- switched-f...](https://www.wisdomandwonder.com/link/2110/why-mit-switched- from-scheme-to-python)

</comment></comment></comment><comment><USER13> Code: The Hidden Language of Computer Hardware and Software by Charles Petzold

This one's for you if you want to learn or just recap principles of computers (and read on evolution as well). I just started reading it and found it suprisingly easy to follow. It's perfect if you like things explained step-by- step and in a simple way.

<comment><USER14> I see this book recommended often and I like Petzold's writing. I think this book is excellent introductory book.

However, I bought this book in 2013 and was disappointed. I kept the book in the hopes that my high school and college aged kids might get something out of it. This is a book appropriate for someone new to programming. I don't consider this a book for computer scientists that already have a university degree, since it provides only a very basic introduction to Boolean algebra, logic gates, computer arithmetic. If you know what a NAND gate is and what a XOR instruction does you don't need this book.

For the practicing professional or a serious CS student interested in bits and bytes I might recommend _Hackers Delight, Second Edition_ by Hennry S. Warren Jr.

</comment></comment><comment><USER15> I'm going to cast a vote for 'Unix & Linux System Administration Handbook' \- it's been around a long time and is currently on edition 5. It's the book that made me fall in love with system administration.

It's an extensive and well-rounded look at various fundamental system administration topics with examples included from multiple different *nix distributions (topics like work management, logging, networking, security, the kernel, systemd, permissions, etc.). If you're at all interested in Linux, this is a great book to have on your shelf.

[https://admin.com/](https://admin.com/)

</comment><comment><USER16> > every discipline has it's most fundamental books ... e.g. philosophy -> > Socrates, Plato, Aristotle, civil law -> code civil, christianity -> bible, > etc. one should read to get a truly deep understanding.

I dispute this idea. For some disciplines, this may be so. For other, such as physics, biology, chemistry, mathematics, civil engineering, poetry...actually, for most disciplines they aren't based on fundamental books. They're based on a living community of practice.

In these disciplines a book is important only insofar as it can be used to increase your abilities. No one goes and studies the textual details of Landau & Lifshitz as a guide to anything, any more than they do so with TAOCP.

Rather than worry about fundamental books, worry about opening up black boxes at a steady rate.

<comment><USER17> Except there are. For example, biology has "Campbell Biology", formerly just called "Biology", and it gets frequent revisions to ensure it's still relevant as the field evolves.

The question as posed does not strike me as one of worry, but of curiosity: what ARE the seminal works that the different fields point to as being the "bibles" of their discipline? Comp. Sci. has Knuth, Russel and Norvig, etc. Other fields most certainly have their own, and knowing which those are is interesting and worth getting an answer to.

<comment><USER18> I have a PhD in biology and I've never heard of Campbell Biology, or any book just referred to as "Biology".

<comment><USER19> "Neil Allison Campbell (April 17, 1946 – October 21, 2004) was an American scientist known best for his textbook, Biology, first published in 1987 and repeatedly through many subsequent editions. The title is popular worldwide and has been used by over 700,000 students in both high school and college- level classes."

[https://en.m.wikipedia.org/wiki/Neil_Campbell_(scientist)](https://en.m.wikipedia.org/wiki/Neil_Campbell_\(scientist\))

<comment><USER18> Yup, so an undergrad textbook that's popular in some countries. Hardly foundational!

</comment></comment></comment></comment></comment><comment><USER20> I've spent this entire year taking a break to learn fundamental CS(I'm not a CS graduate) Here are the books I found most useful/interesting: 1\. The Annotated Turing by Charles Petzold : Used it because I had a hard time digesting the original Alan Turing paper 2\. An Introduction to Formal Languages and Automata by Peter Linz : To grab the concept of state machines 3\. The description of sequential processes by Iverson 4\. Clrs: Have kept it for reference

Then I studied a matrix of math books, along with other CS books regarding compilers, operating systems etc. My aim was to get good enough understanding to comfortably digest the famous research papers.

I am yet to find definitive books that teach a way of thinking on their own merit as a single book. Cs like others is a matrix of knowledge that clicks as a whole 'chunk' of understanding, changing the way you have thought about things like programming in general. I'm having a hard time explaining this.

If you're not a CS graduate, I highly suggest simply going through academics of places teaching theoretical CS.

</comment><comment><USER21> Do you want to know about CS or do you want to know about programming? A lot of the suggestions I've seen so far in this thread are really about programming and not general CS. The basic math and principles for CS date back to before we had computers. I'd argue that if you want a real CS bible then you need to look at things published back when computer was a job and not an object. For example, you could check out "Introduction to a General Theory of Elementary Propositions" by Emil Post. Reading it will teach you about CS fundamentals but it will not make you a better programmer.

</comment><comment><USER22> I don't think there is a definitive answer for your question because computer science is a relative new area of knowledge and "fundamental books" are still being published.

If I had to say _one_ text that is the fundamental one, I would go with a paper: "On Computable Numbers, with an Application to the Entscheidungsproblem" [1], by Alan Turing.

\---

But if you just started your course in Computer Science, then I will give you some "bookshelf advice" based on my experience. I had the pleasure to study all the books I am going to recommend you, and most of them I was able to read cover-to-cover during the university years. And they are also in my bookshelf for reference.

The book order does not represent rank of importance.

* "Introduction to the Theory of Computation", by Michael Sipser.

        * I also recommend the "Elements of the Theory of Computation", by Christos Papadimitriou.

        * Another good complement is "Introduction to Automata Theory, Languages and Computation", by Hopcroft and Ullman. (Thanks, @reacweb, for the reminder.)

* "Graph Theory", by Reinhard Diestel.

        * If you feel you want to go deeper, and like a book which you cannot skip a single word, I strongly recommend "Modern Graph Theory", by Béla Bollobás: it is one of my favorite textbooks ever!

* "The Algorithm Design Manual", by Steven Skiena.

        * While a lot of people seems to praise either the Cormen et al. or the Sedgewick books, I have the feeling that "Algorithms" by Dasgupta, Papadimitriou  and Vazirani is my choice for "fundamental" book. But I decided to

* "Computer Architecture: a Quantitative Approach", by Hennessy and Patterson.

* "Modern Operating Systems", by Andrew Tanenbaum.

* "Artificial Intelligence: a Modern Approach", by Russel and Norvig.

* "Modern Compiler Implementation (in ML)", by Andrew Appel.

I would like to also recommend "Concrete Mathematics", by Graham, Knuth and Patashnik, but I remember to not feel it the most pedagogical book on the subject.

Good luck!

\---

[1]: [https://www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf](https://www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf)

<comment><USER23> > If I had to say one text that is the fundamental one, I would go with a > paper: "On Computable Numbers, with an Application to the > Entscheidungsproblem" [1], by Alan Turing

Certainly that one, but I would add a couple of others:

"[https://en.wikipedia.org/wiki/The_Laws_of_Thought"](https://en.wikipedia.org/wiki/The_Laws_of_Thought") (George Boole) - lays out boolean algebra; fundamental to everything in computing

"[https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_a...](https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_and_Switching_Circuits") (Claude E. Shannon) - basically lays out the equivalence of switching circuits to boolean algebra, fundamental to electronic computing

Note in fact many of Shannon's works and research could be considered "fundamental"...

<comment><USER24> By the currently accepted definition of Computer Science (at the nexus of its core basis in mathematics and philosophy), I would say "On Computable Numbers, with an Application to the Entscheidungsproblem" by Alan Turing, without any close peer to date. It is the first paper that invoked the most all- encompassing idea of a computer (e.g. not necessarily having to be a physically realizable electronic computer, which one could consider more of a matter for engineering).

Its contents have had continued relevance as computer scientists study the properties and capabilities of non-deterministic computers.

<comment><USER25> Charles Petzold (who wrote "Code") has written a very good book which goes through Turing's paper in small sections:

The Annotated Turing: A Guided Tour Through Alan Turing's Historic Paper on Computability and the Turing Machine

</comment></comment></comment></comment><comment><USER26> I've found this to be a pretty good list ([https://teachyourselfcs.com](https://teachyourselfcs.com)), I can't say I've read every book on the list but I hope to someday.

</comment><comment><USER27> The Art of Computer Programming

Structure and Interpretation of Computer Programs

Purely Functional Data Structures

Programming in the 1990s

A Logical Approach to Discrete Math

<comment><USER28> > The Art of Computer Programming

I'm guessing like most people who bought it, it sits collecting dust on the shelf.

Youthful naivety is the only reason I bought it. Completely impenetrable but look, "I'm a real™ software engineer now"

<comment><USER29> That's pretty much what my copy does. I'm grateful the profession has TAOCP as a resource, but the reality for the majority of workaday engineers is that most of the sort of art described in that series is abstracted out into libraries. As fun or challenging as it might be to thinking about developing your own implementation of a fundamental algorithm or data structure, you're probably far better off reusing whatever you have available to you already in your environment. This has the tendency of pushing the work to the boundaries, where engineering is more about connecting existing pieces than anything else. (Which isn't a problem... I'd hate to live in a world where every home that's built requires the builder to cut down trees and process their own lumber, etc.)

I do least take solace in the fact that the contents of TAOCP are a lot less likely to get stale than the majority of tech books.

<comment><USER30> > you're probably far better off reusing whatever you have available to you > already in your environment

I think even Knuth himself would agree here - but it's also worth going through the implementation yourself once or twice (even if you just throw it away) until you really understand what it's doing, so that you know what's most useful when.

<comment><USER29> > but it's also worth going through the implementation yourself once or twice > (even if you just throw it away)

I tend to agree, but I'm not completely sure where I'd draw the line between things you have to implement to 'really understand' and things you can just use. ie: I've written hash tables over the years, but I've never written a persistent (think Clojure) style hash table. Maybe I should write one to really understand it? It sounds like fun, and I'd probably learn a lot, but I'm also not at all convinced it would help my effectiveness. The argument becomes even less convincing at larger scales and lower layers. (I don't need to implement a language runtime or SQL database to understand how to use one effectively. Even if, again, both of those sound like a lot of fun and a good way to learn some thing.)

If I had to come up with a general guideline, it would be to encourage developers to be mindful of what's around their layer of the stack and be prepared in the (very unlikely) event to work in one of those layers. But even that's kind of handwavey.

</comment></comment></comment></comment></comment><comment><USER31> The Elements of Computing Systems: Building a Modern Computer from First Principles[0] and its accompanying class Nand to Tetris[1]. Starting at logic gates and moving up through the levels of abstraction until you can build a programming language and implement a video game is the most fundamental approach that I'm aware of.

[0][https://www.nand2tetris.org/book](https://www.nand2tetris.org/book) [1][https://www.nand2tetris.org/](https://www.nand2tetris.org/)

</comment><comment><USER32> A lot of great books have already been recommended. Going to go a different route than others here have and recommend The Elements of Computing Systems.

It's a book that explores hardware from the ground up. It's one of the most insightful books I've found for getting a real intuition for hardware.

</comment><comment><USER11> The books that really shaped my understanding of CS are:

\- Theoretical CS: \- Compilers: Principles, Techniques, and Tools (The Dragon Book) \- Introduction to the Theory of Computation, Sipser

\- Programming: \- Java Concurrency In Practice, Brian Goetz \- Generics in the Java Programming Language, Gilad Bracha \- Professor Frisby's Mostly Adequate Guide to Functional Programming \- Unix for Poets \- Modern C++

</comment><comment><USER33> To stick to the more theoretical interpretation of "computer science," and with a focus on theory of computation/programming languages:

\- Discrete Mathematics And Its Applications, Kenneth H. Rosen (this is more foundational, but it's definitely targeted at a CS audience and touches on things like automata theory)

\- Types and Programming Languages, Benjamin C. Pierce

\- Semantics of Programming Languages, Carl Gunter

</comment><comment><USER34> One possible answer to this question is the most assigned books on computer science syllabi: [https://opensyllabus.org/results- list/titles?size=50&fields=...](https://opensyllabus.org/results- list/titles?size=50&fields=Computer%20Science)

</comment><comment><USER35> _Concrete Mathematics_ by Knuth et al is a dense but joyful overview of discrete math for CS: [https://www.goodreads.com/book/show/112243.Concrete_Mathemat...](https://www.goodreads.com/book/show/112243.Concrete_Mathematics)

</comment><comment><USER36> Operate on first principles, what do you need to know to be a "successful" programmer in the technical, social, and/or ideological context.

Data Structures and their relationship with each other to be a great technical programmer. These books (just highlight not everything) I would think -> Algorithms Sedgewick, Lisp Programmers Manual, Designing Distributed Systems. .To be a great collaborative programmer (in a work enviornment) -> Pragmattic Programmer, Code Complete, Mythical Man Month, A Philsophy of Software Design by Ousterhout. For philsophy of programming itself -> The Soul of a Machine

Edit: Programming is very broad and operates in many context from the technical, social, to the ideas behind it. I would say it is almost to early to have those definitive fundamental books

</comment><comment><USER37> 1\. Knuth. Skim it all then keep as a reference. Dive deep into anything that catches your fancy.

2\. "Programming Pearls" by Jon L. Bentley IMO this is the most concise yet accessible gateway to the inner Mysteries of Computer Programming. Read between the lines, the prime thesis is implied not explicit.

3\. "Thinking Forth" by Leo Brodie (Available as a PDF here: [http://thinking- forth.sourceforge.net/](http://thinking-forth.sourceforge.net/) ) _Most_ software is _grossly_ too large. This book shows how to grok and extract the essence of your problem into minimal code. (Chuck Moore had a 3D wireframe CAD program he used to carry around as a deck of punch cards in his shirt pocket.)

</comment><comment><USER38> Not sure I'd say "fundamental" but possibly the one I refer junior developers to the most often is Clean Code

</comment><comment><USER9> Iverson's "The description of sequential processes" is eye opening (as our "Notation as a tool of thought" and "A programming language"). But that's about describing the science than the actual science (imagine a book about the merits of Leibniz notation vs. Newton notation of derivatives...).

The actual science in computer science? Weyuker, Sigal & Davis - Complexity, Computability and Languages; CLRS - Introduction to Algorithms. Harel - Algorithmics, the spirit of computing; And nand to tetris, in whatever format you find it.

</comment><comment><USER39> I would personally say SICP. Also a bit far fetched, but I would love to see more people read Compilers: Principles, Techniques, and Tools aka The Dragon Book, is what made me fall in love with compilers

</comment><comment><USER6> I'm going to go a bit against the grain here and suggest the

Feynman Lectures on Computation: [https://www.amazon.com/Feynman-Lectures- Computation-Frontier...](https://www.amazon.com/Feynman-Lectures-Computation- Frontiers-Physics/dp/0738202967/)

In pure Feynman style he builds up a the theory of computation from first principles. YMMV but it really helped me put many of the ideas and concepts from my CS MS into context and find new ways in which they relate with each other.

</comment><comment><USER40> K&R ([https://en.wikipedia.org/wiki/The_C_Programming_Language](https://en.wikipedia.org/wiki/The_C_Programming_Language))

<comment><USER3> While it's a great book to learn C with - easy to follow and just the right length for an introductory book - I'd say it's more of an (software) Engineering book than a (computer) Science book.

<comment><USER41> I thought it was wildly agreed that it's a pretty _terrible_ book to learn modern C with?

It is however in other respects a fantastic example of great technical writing and a great text book.

But as I understand it it's today mostly an extraordinarily great book on inflicting legwounds on yourself.

<comment><USER42> K&R C is a minimalist introduction to the C language. And I love it for that.

The book does not try to forewarn you of the myriad pitfalls inherent in C code. Nor does it delve into the language's extended API available via a plethora of internal and external libraries.

What the book _does_ do in only 228 pages is get you up and operational in C as quickly as possible. Then caveat coder.

Personally, I'd like to see more minimalist CS books. I'm tired of having to surf through introductory tomes that often exceed 1000 pages. I'd rather an intro book introduce me to its concepts in as few pages as possible and put the programming advice and copious reference materials elsewhere, like online.

</comment></comment></comment></comment><comment><USER43> The New Turing Omnibus: Sixty-Six Excursions in Computer Science.

</comment><comment> dawg- I never formally studied CS, but I can strongly recommend Code by Charles Petzold.

If you want to learn how a computer does what it does at the absolute lowest levels, it's a great starting point. It's all written in laymans terms so it's good as a conceptual overview or for people without a strong math background. If you're interested in diving super deep into that kind of stuff I imagine it would be a great high level overview to anchor yourself.

</comment><comment><USER44> SICP gave me nice insight into the way that things works but I found much more valuable to read 'The Elements of Computing Systems'. It is a long book but you will build each element of the computer if you follow it. It might not reflect nowadays computers, but surely it will bring an idea how everything works, from the very ground of gates and bits to the kernel, compiling and so on... just my personal opinion.

</comment><comment><USER45> My recommendations are not exactly what you ask but what I suspect you'll enjoy if you're asking this.

(1) "Understanding Computation" by Tom Stuart. Not "fundamental" as a deep textbook, but very approachable for programmers intro into a big chunk of CS, explaining deep ideas about languages using rigorous working clean code (in Ruby, no prior knowledge needed). I especially loved the first few chapters about what it means to define a programming languange and various kinds of formal semantics.

(2) Designing Data-Intensive Applications, Martin Kleppmann. This gives you a phenomenally good survey of concepts and practice of distributed systems. This is more software engineering than pure CS, but in my view you can't approach the field of distributed systems without blending both anyway.

(3) POODR — Practical Object-Oriented Design, in Ruby, by Sandi Metz. This is 100% software engineering, where there is no single definition of "foundational", but many people who read this swear by it. It's remarkably thin but lucid distillation of ideas that were "in the air" but Sandi nailed them down. An important thesis is that good code is not an aesthetic judgement of how it _now_ looks, but objective question how easy it will be to _change in the future_. Not Ruby-specific at all, but it teaches the original Smalltalk "message-passing" view of OOP, that for people that only learnt statically-typed Java, C++ etc view of OOP is a fundamental idea they're missing on.

Finally, not a book, but "the morning paper" [https://blog.acolyer.org/](https://blog.acolyer.org/) is excellent "return on your time" if you want to sample academic papers, both classic foundational ones, as well as cutting edge.

</comment><comment><USER14> _Feynman Lectures on Computation_ by Richard Feynman. Interesting perspective from a Nobel Prize winning Physicist.

Chapters: Introduction to Computers, Computer Organization, The Theory of Computation, Coding and Information Theory, Reversible Computation and the Thermodynamics of Computing, Quantum Mechanical Computers, and Physical Aspects of Computation.

</comment><comment><USER46> In 1973 I was 26 years old and for about ten years I tried to build a library that included the fundamental computer books. Your education needs to exceed the narrow field of computer reference books only.

First comment is I did get the Knuth books but I never got the college courses and problem solving work to use them. As Professor Marc Nicolet said: You have got to do the problems to master the subject (referring to his Caltech area of physics).

The second comment is computing is all binary. Go beyond that and learn about fractals, chaos, topology and knot theory. For instance, in Kaufman's Knot Theory, there are obviously true but rigorously unproven theorems in the first chapters of the book.

The third comment is after Turing's paper and Godel's uncertainty arguments, all real world computer programs, no matter how carefully they employ something from a fundamental book, must be tested.

</comment><comment><USER47> Introduction to Algorithms by Cormen et al.

<comment><USER48> No. The authors are purposely obscure and arrogant.

There are much better books to learn algorithms from. Even Elements of Programming Interviews is better.

It is worth coming back to if you want to read proofs to understand things in depth. But it is terrible as a fundamental instructive text.

</comment></comment><comment><USER49> Design Patterns: Elements of Reusable Object-Oriented Software (also known colloquially as "Gang of Four").

<comment><USER50> I avoid the principles espoused by this book like the plague. There are entire domains of programming don't cover this stuff.

I'm not saying that design patterns isn't right for you, but the fact that me and many other programmers avoid it shows that it's not fundamental at all.

<comment><USER49> Sure, some of them don't apply if you don't do object-oriented programming. The vast majority of programmers do, though. And I challenge you to name a domain in which you can't use the Facade or Command patterns.

<comment><USER42> If design patterns don't overlap in a major way with objects then something is very wrong. Re-use of design (concepts and implementation) lie at the heart of both initiatives.

</comment></comment></comment></comment><comment><USER51> The Mythical Man-Month: Essays on Software Engineering by Frederick Brooks should be read by everyone, even though it was written in 1975. Some things don't change no matter the technology change. Sometimes I am amazed to have co-worked who have never heard of it.

</comment><comment><USER52> From [http://www.michaelnielsen.org/ddi/lisp-as-the-maxwells- equat...](http://www.michaelnielsen.org/ddi/lisp-as-the-maxwells-equations-of- software/)

> Alan Kay has famously described Lisp as the "Maxwell's equations of > software".

Maxwell's equations could be considered fundamental axioms in electromagnetism and physics. Lisp, likewise, expresses the heart of computer science at its core. I'm still working on grokking it myself, but believe that studying Lisp could be precisely what you're looking for (even if you also mean writing software in addition to strict computer science).

Paul Graham's essays could prove interesting as well.

</comment><comment><USER53> I'm a big fan of Algorithms by Jeff Erickson (free to download at [http://jeffe.cs.illinois.edu/teaching/algorithms/](http://jeffe.cs.illinois.edu/teaching/algorithms/))

</comment><comment><USER54> For Computer Science, Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Jay Sussman with Julie Sussman. For programming, Computer Systems: A Programmer's Perspective by Randal E. Bryant and David R. O'Hallaron

</comment><comment><USER55> Tangentially related to the topic but I am going to ask here since it seems to be trending. Based on this query and another topic that was popular a couple of days ago around SICP, here is my question:

The last time I did any kind of math that was more complex then simple operations was a long time ago and math was never my strong subject.

I have pretty much forgotten any kind of algebra, calculus etc I learnt. So assuming I know very little math, what is the best way/book/method to learn algebra/calculus etc to tackle SICP ? I would like to do that before I begin my SICP journey.

Any suggestions appreciated!!

<comment><USER45> You don't really need much math for SICP. You can learn a few random pieces of math _from_ SICP, and without background that will be harder and you might feel like you're missing out, but these are just examples; you can just trust the math works and focus on _how_ they implement it in code, it's structure of the code they want to teach you about.

And, it gets better, IIRC from chapter 2 there is much less math.

What happens in the first chapter, is that SICP is exploring various control structures (and abstractions over them) before teaching any compound data structures at all. So all it has to work with is numbers. But as number theory teaches us, numbers actually have a rich internal structure, and SICP uses that to make "interesting" examples!

(This aspect of SICP is one of the big critiques in the paper [http://cs.brown.edu/~sk/Publications/Papers/Published/fffk-h...](http://cs.brown.edu/~sk/Publications/Papers/Published/fffk- htdp-vs-sicp-journal/paper.pdf) which explains the motivations beyond HtDP textbook. In particular, HtDP shows compound data structures first, and uses those to start with explicit methodology for data-directed design of code. These are smart programmers and smart educators, and I trust they made a better _intro_ course. I won't recommend SICP for people who don't know any programming at all. But I feel SICP has a magical voice about the _art_ of programming that HtDP didn't replicate — though I haven't read HtDP, only leafed through it a bit.)

So I don't recommend to to cram algebra/calculus before you begin SICP journey! Just start on SICP, and look up math stuff if/as you want.

At the beginning, IIRC you'll encounter: prime vs composite integers; base-2 representation of integers; some calculus but it's enough to understand derivative = slope. There is some symbolic algebra stuff later that's maybe trickier, but I think (hope?) SICP is actually a great book to demystify that.

\---

If you do want to learn math relevant to CS, but mainly for the purpose of learning math:

\- If you're comfortable with code more than math: A Programmer's Introduction to Mathematics by Jeremy Kun.

\- "Concrete Math" by Knuth/Oren/Patashnik is wonderful. Don't feel you have to finish it! I stopped ~60%.

</comment></comment><comment><USER14> Over the years I find myself often referring back to _Numerical Recipes, The Art of Scientific Computation_ now in it's third edition by Press, et. al.

I realize that for practically any topic covered by this book that there are more heavily optimized solutions available in the best numerical libraries, but this book nicely rounds out my reference books with clear and easy to understand coverage of subjects I don't know. (e.g. Savitzky-Golay Smoothing Filters).

I enjoy reading this book.

</comment><comment><USER14> For new computer scientists that want to understand the interface between programs, operating systems, and hardware, I recommend _Computer Systems, A Programmer 's Perspective, Third Edition_ by Bryant and O'Hallaron.

It's detailed enough to use when trying to understand how a shell works or how to write a signal handler, but the writing couldn't be clearer.

</comment><comment><USER41> Good recommendations in this thread, but seems a bit thin on the data side - both in terms of abstract datatypes, and in terms of database theory.

I don't have a concrete recommendation off-hand - but certainly something by Codd on databases/normalization should be on such a list?

A lack of understanding data normalization can hurt even "simple" code that uses structs and procedures.

<comment><USER56> For database theory probably something from C.J. Date.

<comment><USER41> Oh certainly. Maybe Codd and Todd for papers, Date for books?

Somewhat related, this interview with Date on the relational model:

[https://www.red-gate.com/simple-talk/opinion/opinion- pieces/...](https://www.red-gate.com/simple-talk/opinion/opinion-pieces/chris- date-and-the-relational-model/)

<comment><USER41> Relevant (to TFA) quote from the interview:

> A related piece of advice is: Learn the relational model first, SQL second > (doing it the other way around is hard). Finally, read either or both of Ted > Codd's first two papers every year. (Those papers are "Derivability, > Redundancy, and Consistency of Relations Stored in Large Data Banks", IBM > Research Report RJ599, August 19th, 1969, reprinted in ACM SIGMOD Record 38, > No. 1 (March 2009), and "A Relational Model of Data for Large Shared Data > Banks", CACM 13, No. 6, June 1970, which you can find online.)

Ed:

DERIVABILITY, REDUNDANCY CONSISTENCY OF RELATIONS STORED IN LARGE DATA BANKS E. F. Codd:

[http://domino.research.ibm.com/library/cyberdig.nsf/papers/B...](http://domino.research.ibm.com/library/cyberdig.nsf/papers/B7765CC7C03E358D85257593005B42EF/$File/RJ599.pdf)

A relational model of data for large shared data banks:

[http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf](http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf)

</comment></comment></comment></comment><comment><USER57> A big problem is that software organization success largely depends on "soft sciences" like psychology and physiology. Science may find ways to make faster machines, but being that the actual bottlenecks are the cost of humans reading code and designs and managing changes to systems, the human grokkability factor is usually the largest.

Software should be written mostly with humans (code readers) in mind, and not machines. The soft sciences are much harder to study; it's expensive to use trial and error on real projects in order to compare outcomes. Equations on a blackboard or chips in a lab are probably not where most real IT revelations will come from.

There are pet theories that focus on overly-narrow factors. For example, those who focus on linguistic parsonomy (less code) may conclude that functional programming is "better" because it usually can be made the most compact. However, a good many coders have a hard time working well with functional programming. Some take a Darwinian view and say "fire them all and hire elite functional coders". But so far that has rarely paid off in the market-place, barring a few grow-fast-at-all-costs startups. Short code is not always legible code to the majority of coders.

<comment><USER58> I mean no offense but this is a crap answer. They're asking for book recommendations.

<comment><USER57> I guess what I'm trying to say is that there are _no_ books that address and "solve" the real issues of typical software design, and I am explaining the reason why there are no such books. It's kind of like asking for good books on Pluto before any probe had visited Pluto: you are only going to find a lot of speculation.

The closest thing are books with specific examples that explain the trade-offs made and try to find general rules and apply them to the examples. But I find such to be either mostly opinions, or too vague to apply in practice. At best they exercise your brain in terms of questions to ask in exploring the different design options, but they don't give clear-cut rules for the final choice that stand up to scrutiny.

They can tell you about the kinds of beasts you'll encounter in the dark forest, and give suggestions for defeating the beasts, but the recipes for success are either subjective or nebulus, yet to be subjected to real testable science. They could be if some research institution spent big bucks on it, but so far nobody has.

Our field has a "science gap" which results in a book gap. The blunt truth is that IT is more about people than machines or math.

</comment></comment></comment><comment><USER59> Green Tea Press has some good ones, "How to Think Like a Computer Scientist" one with Java and one with Python, they're open source books so some people have produced more interactive (browser) books.

[https://greenteapress.com/wp/](https://greenteapress.com/wp/)

</comment><comment><USER14> _Pearls of Functional Algorithm Design_ by Richard Bird. Is a collection that demonstrates through thirty small examples spread over the same number of chapters, the appeal of functional programming. Most books on functional programming get a bit bogged down on a particular language, this one doesn't.

</comment><comment><USER60> Joel on Software by Joel Spolsky

Code Complete by McConnell

<comment><USER61> I would classify these in the realm of software engineering, not computer science.

<comment><USER60> Thanks, I agree. I was thinking about adding a note with something like "Not sure if you're using a broad of narrow definition for computer science. Many people use CS to refer to lots of things including software. If broad, I found the books below really helpful in planning and writing software. If precise, then please ignore them."

</comment></comment></comment><comment><USER62> Not a book, but fundamental nonetheless: [https://homepages.inf.ed.ac.uk/wadler/papers/propositions- as...](https://homepages.inf.ed.ac.uk/wadler/papers/propositions-as- types/propositions-as-types.pdf)

</comment><comment><USER63> This is not a book (youtube lectures), but I add it here: [https://www.youtube.com/watch?v=uaAvVNWvi4A&list=PLm3J0oaFux...](https://www.youtube.com/watch?v=uaAvVNWvi4A&list=PLm3J0oaFux3aafQm568blS9blxtA_EWQv)

</comment><comment><USER64> The Art of the Metaobject Protocol.

</comment><comment> yoz-y When these lists of books threads pop up I always feel ashamed at how few I have read myself. I've only read Perl by Larry Wall and most of Effective C++. I wonder how much I am actually missing out by not digging into the theory more.

<comment><USER14> We all started out that way. Effective C++ is a valuable book that takes study, so you're off to a good start.

I still have my first programming book that I bought in the 60s. Now, my library includes most of the books mentioned here. I've skimmed every one of them and read portions of many over and over. I've found that in the long run, they've really helped me in my career. Notice however that I've had half a century to do this reading so just give yourself time.

<comment> yoz-y But I've been in the business for almost 10 years now, mostly learning from people around. I am running out of fiction so maybe this would be a good time investment though.

<comment><USER14> Several of the books mentioned here are actually a lot more fun to read than the really excellent _Effective C++ ..._ books by Scott Meyers that you mentioned reading.

This isn't a criticism of _Effective C++_ , just the opposite. Better than anyone, Scott Meyers makes many of the very technical intricacies of C++ understandable and I think every professional C++ programmer could benefit from understanding the issues he explains. Nevertheless, I find the book more of a chore to get through than most of the books mentioned here.

You might find a random CS subject really interesting and get motivated to read up on it. I done this over and over.

Personal projects are a good way to get interested. In the past personal projects have caused me to do independent study of cryptography, hash tables, compilers, operating systems, machine learning, AI, etc. I've never been interested in game development or GUI programming, but recently I decided I would write a simple chess playing program just for fun. I'm currently stuck building the GUI for it, but it's caused me to study game engines and GUI frameworks.

</comment></comment></comment></comment><comment><USER65> The answers from this[0] post can be helpful.

[0] [https://news.ycombinator.com/item?id=20729252](https://news.ycombinator.com/item?id=20729252) (What book to read to get a footing in CS theory?)

</comment><comment><USER66> [https://www.goodreads.com/book/show/722414.Computer_Lib_Drea...](https://www.goodreads.com/book/show/722414.Computer_Lib_Dream_Machines) by Ted Nelson :)

</comment><comment><USER67> I suppose we should talk about our favourite algorithms/data structures books here. I like Drozdek for data structures: very clear yet concise with both theoretical rigour and application

</comment><comment><USER68> "The Art of UNIX Programming" was certainly one of the most formative personally. It's more holistic than technical, but has changed me in a number of ways for the better.

</comment><comment><USER69> "The Rust Programming Language" [https://doc.rust- lang.org/book/](https://doc.rust-lang.org/book/)

<comment><USER50> I like rust but how the heck is this fundamental?

<comment><USER70> (Unrelated to the thread, just saw your profile):

Based on your comments, you seem like an interesting guy. How do I get in touch about potential opportunities?

<comment><USER50> I put my email back up in my profile temporarily.

</comment></comment></comment></comment><comment><USER71> Refactoring by Martin Fowler and Kent Beck.

Patterns of Enterprise Application Architecture by Martin Fowler.

Domain Driven Design by Eric Evans.

Growing Object-Oriented Software, guided by tests by Steve Freeman and Nat Pryce.

<comment><USER72> There's a bevy of (pretty good) books in this "Enterprise Software" vein, but I don't think they are "computer science" books. If CS is fundamental physics, then this would be something like biology - all biological systems are composed of physical systems, and refer to physics sometimes, but the concern is a different, much higher, level of abstraction. An enterprise system is many orders of magnitude more complex than what, e.g. Knuth deals with (programs that are expressed in MMIX in a few 10s of operations assuming a very small amount of running memory). In the same way, an ant is far more complex than a single hydrogen atom.

<comment><USER73> You make a fair point but I think it raises a more general question that has come up before plenty of times and that is whether classical computer science is good training for 95% of students.

Take civil engineers. Yes they will do some physics but usually only basic stuff in first year. After that they focus more on the higher level systems they will be working with because most working civil engineers will never need anything more advanced than first year physics.

So if the person who posted this Ask HN is not going to do CS research (or the like) then Domain Driven Design might be as fundamental to their education as structural engineering is to a civil engineer. The fact is that nearly all systems that we work with are composed of services/models of some kind. DDD deals with these but more importantly deals with the domain where you can make the most impact as a working engineer (as opposed to a scientist who is like a force multiplier but we need a lot less of them).

"Domain work is messy and demands a lot of complicated new knowledge that doesn't seem to add to a computer scientist's capabilities. Instead, the technical talent goes to work on elaborate frameworks, trying to solve domain problems with technology. Learning about and modeling the domain is left to others. Complexity in the heart of software has to be tackled head-on. To do otherwise is to risk irrelevance" \- Eric Evans

</comment></comment></comment><comment><USER74> Check out [https://github.com/cbourke](https://github.com/cbourke) \- free Comp Sci books (I, II, and III).

</comment><comment><USER75> Algorithm Design by Kleinberg and Tardos. It is a wonderful book especially because of the well-designed problem sets. Most of them come with answers too.

</comment><comment><USER76> I wanted to say that if you study CS at an University you will most likely read many 'fundamental' books.

I find it funny 'Structure and Interpretation of Computer Programs' is considered fundamental when it's basically an MIT textbook. Presumably it's a very good textbook, but it's not fundamental because the rest of the world doesn't really study it. The world does study Aristotle.

CS is also a wide field (and I presume you said this on purpose to separate the software engineering books?). Something by Chomsky for formal grammars comes to mind.

<comment><USER77> SICP has been (and still is) studied outside of MIT.

</comment></comment><comment><USER78> SICP if you want to learn programming side of CS.

<comment><USER79> Relevant: Recent post on SICP discussed on HN: [https://news.ycombinator.com/item?id=21299546](https://news.ycombinator.com/item?id=21299546)

</comment></comment><comment><USER80> Is Hennesy & Patterson, "Computer Architecture: A Quantitative Approach" still used in universities?

<comment><USER81> Yes, my computer architecture class has this as its recommended textbook, although readings aren't required and I'm sure that nobody in the class has the textbook

</comment></comment><comment><USER82> Communicating and Mobile Systems: the Pi-Calculus (Milner) Fundamental, but rather painful to digest.

</comment><comment><USER83> "Design Patterns: Elements of Reusable Object-Oriented Software" by the Gang of Four. It has sold over 500k copies and has been translated to numerous languages.

[https://en.wikipedia.org/wiki/Design_Patterns](https://en.wikipedia.org/wiki/Design_Patterns)

<comment><USER57> I have to say the "GOF" book was giant fraud, or at least a big mistake. It has no clear rules on when to use what pattern over another. This resulted in ambitious but naive programmers throwing design patterns at everything in ways that appeared haphazard to those not owning the coder's mind, creating "spaghetti objects". I went round and round in online forums trying to clarify the "rules" for pattern selection. It never resulted in anything definitive or fruitful. It's horrifically vague. The "art" had a cult-like quality to it.

<comment><USER48> Pretty much.

There are only five patterns that matter in real world software development.

Observable

Singleton

Composition

MVC

Inversion of Control

And the last one isn't even covered by GOF. The book is an out of date relic of 90s programming. Let it die already.

</comment></comment></comment><comment><USER84> computational complexity a modern approach by sanjeev arora

don knuth's art of computer programming [if you like some rigor][it is a bit time consuming to read the whole thing , but be sure to atleast try reading the first volume]

<comment><USER3> 1\. I think it's Barak and Arora. Also, it feels a bit too encyclopedic to be fundamental. Still, looks like a good book (I'll be honest and say I just skimmed it)

2\. Like I said elsewhere - TAoCP is an impressive book, but it's certainly not fundamental. It's not used as the "fundament" or foundation of people's CS knowledge.

</comment></comment><comment><USER85> Computer Science -> The Art of Computer Programming

Software Engineering? no clue

</comment><comment><USER86> I've found Martin Fowler's Refactoring very practical

</comment><comment><USER87> One of my favorite fundamental books is "The Pragmatic Programmer: From Journeyman to Master" by Andrew Hunt and David Thomas

<comment><USER50> This is a fundamental book for programming or software engineering. I would argue that it's not fundamental for computer science.

</comment></comment><comment><USER88> TAOCP and SICP

</comment><comment> Iwan-Zotow TAOCP

</comment><comment><USER89> Knuth!

</comment><comment><USER48> The C Programming Language.

And I am surprised no one mentioned Operating System Concepts (the dinosaur book).

It was the most useful CS text I read in college. I see a lot of SICP love; I never had it for a college course, but it looks good as well.

</comment><comment><USER90> Smalltalk-80: The Language and Its Implementation

</comment><comment><USER91> CLR

</comment><comment><USER92> leetcode.com

</comment><comment><USER93> Panini's Ashtadhyayi.

<comment><USER94> What is it, and what makes it a fundamental CS book?

<comment><USER39> You know every one who should call himself a programmer should learn Sanskrit, the language of quantum computing. /s

<comment><USER94> Oh, I'm fully aware of that theme :) I just wanted to know _what_ the supporting arguments were.

</comment></comment></comment></comment><comment><USER95> The C++ programming language by Bjarne Stroustrup. Whether you plan to learn C++ or not, this is a great book to read

</comment><comment><USER96> "Fundamental" is a matter of perspective. To use an analogy, if you were looking for the most fundamental books about the English language, would you be reading about grammar, or would you be reading Shakespeare?

<comment><USER42> Yes to both.

Doesn't 'fundamental' often span a wide range, from bottom-up to top-down? Surely CS fundamentals lie not only at the bottom (e.g. assembly language or discrete math or algorithms), but also at the top (e.g. programming concepts or software design and engineering)? Where would an education in CS be without at least an introduction to high-level concepts like object orientation or computational complexity?

And yes, I think Shakespeare is fundamental to the study of English. If the omission of any set of works would have the degree of cultural impact and leave so great a void as overlooking his would, then it qualifies as essential canon, and thereby fundamental.

<comment><USER96> Agreed. So I'd be looking stuff like compiler theory at one end, and distributed systems at the other.

</comment></comment></comment><comment><USER97> I don't think there are any. The problem with learning computer science from textbooks is that most textbooks will go a lot further than just the fundamentals on the subjects they cover. So if you try to learn the basics by choosing a textbook for each area and read it cover to cover you'll never finish. Perhaps the answer is to thoroughly read the first few chapters/skim the remainder of Introduction to Algorithms; the Dragon book; Computer Networks/Architecture/etc.: A Systems/Quantitative/etc. Approach; Types and Programming Languages; Security Engineering; AI: A Modern Approach and so on -- that was certainly my experience of undergrad CS. A few exceptions are K&R, The Mythical Man-Month and What Every Computer Scientist Should Know About Floating-Point Arithmetic which are short enough that you can easily read them in their entirety.

</comment><comment><USER98> The depth of programming is following the code down to electricity, like the Ben Eater youtube videos show. What you want that code to do has it's own depths; math, ml, ai, games, business ect.

It's not like classical art or architecture where the principles closer to all commanding or 'figured out'. Your everyday work is like swimming through code solving problems as you go. Pushing blocks into permanent place never works, they find a way of getting crufty, old and replaced to fit new requirements. I imagine any field that deals with flowing quantities of objects, or fluid-like systems would have structural overlaps with programming. Fields like plumbing, finance, the energy sector, ect.

I would describe programming to be at it's very base to be ascribing meaning to quantities of meaningless numbers and building a structure to pipe those numbers around to a qualitative result.

Measuring principles in depth here is not that useful, the river of valuable information runs left to right in code. You'll likely restrict how deep and how abstract you go and instead focus on churning out a high quantity of solved problems. It's just not that useful to be thinking in machine code when you're programming in C++, but knowing all the functions of C++ and where it should be ending up is very important.</comment>


Pagesnap takes automatic screenshots of your sites - <AUTHOR> http://www.pagesnap.io/?

<comment><USER2> Interesting piece of software; Really small app. definitely a good way to get your feet wet in the product business.

Congratulations on shipping!

</comment><comment><AUTHOR> I launched a beta of Pagesnap on HN a few months ago. Here's the previous discussion:

[https://news.ycombinator.com/item?id=7305329](https://news.ycombinator.com/item?id=7305329)

</comment><comment><USER3> CLI version. [https://github.com/paulhammond/webkit2png](https://github.com/paulhammond/webkit2png)

</comment><comment><USER4> This is a dupe of [https://news.ycombinator.com/item?id=7305329](https://news.ycombinator.com/item?id=7305329). Please don't post stories that have already had a significant discussion on HN recently.

</comment><comment><USER5> I've been in the beta trial of this, and it works pretty well.

A few thoughts: 1) It would be really great if I could schedule when the pagesnaps were taken 2) It'd be nice to be able to take snaps of only one div 3) Would be very cool if there was a URL that always had the most recent snap

</comment><comment><USER6> Here's a competitor: [http://url2png.com](http://url2png.com)

<comment><USER7> I thought [https://browsershots.org/](https://browsershots.org/) was the big one. I suspect there are many.

</comment></comment><comment><USER8> I like the concept, but you really need a "Try it First" option that lives outside the paywall. I am very hesitant to type in my credit card before I have any idea if the service works how I expect. 2 cents.

<comment><AUTHOR> Great suggestion. A one-off form where you can plug in a URL and email address would be pretty easy to add.

</comment></comment><comment><USER9> It seems terribly expensive, if I understand the pricing right.</comment>


Designing Workplaces For Creativity (June 2012) - <AUTHOR> http://www.metropolismag.com/story/20120608/designing-for-creativity

<comment><USER2> "something as incidental as the color of paint on the walls can dramatically influence the way we think" - and there were banner ads cramped on either side, restricting me all round.

I'm not sure if it's deliberate, but reading just the text on it's own was much, much easier. Good old Readability. :)</comment>


The Tech Canon - <AUTHOR> http://www.theatlantic.com/technology/archive/2010/09/the-atlantic-tech-canon/62818/

<comment><USER2> This has a bizarrely eclectic flavor. (What is with all the SF movies? And if you're going to throw movies in here, why not games or music?) And it is painfully short on actual, you know, tech. No K&R? No introduction to quantum mechanics? No _Art of Electronics_? No _Structures: Or Why Things Don't Fall Down_? You would think there might be room in the canon for some actual science or engineering.

Still, upmodded as a fun list of things to read. Just because it doesn't live up to its bombastic title doesn't mean it isn't useful.

<comment><USER3> Well, there's some real stuff including the _Art of Electronics_ in the Google spreadsheet. But your points are well taken.</comment></comment>