HackerNews Readings
40,000 HackerNews book recommendations identified using NLP and deep learning

Scroll down for comments...

The Pragmatic Programmer: 20th Anniversary Edition, 2nd Edition: Your Journey to Mastery

David Thomas, Andrew Hunt, et al.

4.8 on Amazon

396 HN comments

Masters of Doom: How Two Guys Created an Empire and Transformed Pop Culture

David Kushner, Wil Wheaton, et al.

4.8 on Amazon

262 HN comments

Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems

Martin Kleppmann

4.8 on Amazon

241 HN comments

Clean Code: A Handbook of Agile Software Craftsmanship

Robert C. Martin

4.7 on Amazon

232 HN comments

Code: The Hidden Language of Computer Hardware and Software

Charles Petzold

4.6 on Amazon

186 HN comments

Cracking the Coding Interview: 189 Programming Questions and Solutions

Gayle Laakmann McDowell

4.7 on Amazon

180 HN comments

The Soul of A New Machine

Tracy Kidder

4.6 on Amazon

177 HN comments

Refactoring: Improving the Design of Existing Code (2nd Edition) (Addison-Wesley Signature Series (Fowler))

Martin Fowler

4.7 on Amazon

116 HN comments

Thinking in Systems: A Primer

Donella H. Meadows and Diana Wright

4.6 on Amazon

104 HN comments

Superintelligence: Paths, Dangers, Strategies

Nick Bostrom, Napoleon Ryan, et al.

4.4 on Amazon

90 HN comments

The Idea Factory: Bell Labs and the Great Age of American Innovation

Jon Gertner

4.6 on Amazon

85 HN comments

Effective Java

Joshua Bloch

4.8 on Amazon

84 HN comments

Domain-Driven Design: Tackling Complexity in the Heart of Software

Eric Evans

4.6 on Amazon

83 HN comments

Weapons of Math Destruction: How Big Data Increases Inequality and Threatens Democracy

Cathy O'Neil

4.5 on Amazon

75 HN comments

A Philosophy of Software Design

John Ousterhout

4.4 on Amazon

74 HN comments

Prev Page 1/16 Next
Sorted by relevance

nindalfonJan 8, 2019

Have you read Effective Java? I'm not fond of Java but Effective Java is a good book. Can't speak for others but I learned more from it than Clean Code.

rainhackeronFeb 22, 2017

If you don't mind Java, Effective Java by
Josh Bloch has good API design material. Josh designed collections API in Java

mustardoonFeb 11, 2018

Effective Java by Joshua Bloch

sage_jochonMay 7, 2011

If you will be programming in Java, these books will serve you incredibly well:

  * Effective Java
* Java Concurrency in Practice
* Head First Design Patterns

anuragonMar 21, 2011

Assuming you know the basics of the language, Effective Java by Joshua Bloch is very good: http://www.amazon.com/gp/product/0321356683/

pigsonJan 13, 2012

Joshua Bloch in Effective Java argues that the java bean is an anti-pattern and should be avoided.

pk137onFeb 10, 2012

Java Precisely (Sestoft) gives you the crispiest syntax.
Effective Java (Bloch) gives the best practices.
Core Java (vol 1, 8th ed) gives you a pro-C++, no-nonsense comprehensive coverage.
Official Java Tutorial is the best intro, save it's not a book!

ScarbuttonAug 17, 2015

Effective Java by Joshua Bloch

arockwellonDec 16, 2008

That was how I originally learned Java in undergrad. I think that its a pretty good book. I think that its a great introduction to the basics. A good follow up book is Effective Java by Joshua Bloch.

mduponSep 5, 2013

Effective Java and Effective C++ have a good format for listing best practices, and nowadays more and more languages seem to adopt their own "Effective" book or web page... I like how useful they are to see real-world problems before you decide picking up a language.

brown9-2onOct 4, 2010

I think that Effective Java by Josh Bloch deserves to be added to this list.

espinchionMay 16, 2014

It depends heavily on what stage of your career as a programmer you are.

I strongly suggest most junior programmers I work with to read Effective Java and Head First Design Patterns. To me, it's a great combination to help you write code that's easy to understand and maintain.

wr1472onDec 25, 2011

I would suggest reading Effective Java by Josh Bloch, it has some great tips on how to write code and design APIs as well as nicely structured sample code. I'm a much better developer (not just in Java) for it.

Also browse some of the core Java source code to see really elegant implementations by him.

kschuaonAug 8, 2010

Two books I recommend

1) Head First Design Pattern

2) Effective Java (Joshua Bloch). The principles in this book can be applied to almost any programming language not just Java

pbnaiduonJune 18, 2008

I would also read Effective Java along with Struts related text book. Here's the link to the book http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/032...

smackfuonApr 13, 2012

If you are interested in this kind of stuff, Effective Java is a must-read book. Long, good explanations of how to do stuff right.

Also, the 2nd edition covers up through Java 1.6.

will_work4tearsonMay 16, 2014

I've got this right at the top of my wish list. Got a list of other books I gotta finish first though, lol:

Code Complete 2, The Web Application Hacker's Handbook, Algorithms in a Nutshell, and Code.

Not to mention an Arduino book - but I'll probably get Effective Java and read it first.

zackattackonMar 26, 2012

Work got me Effective Java to go through, but I don't have enough basic Java knowledge to get through it (I know enough Java to be dangerous). I can program in other languages, though, especially in perl, python, JavaScript and PHP. What book should I read before Effective Java?

__derek__onDec 24, 2013

Agreed. I cannot recommend that book enough. It's a natural extension of The Good Parts and should be considered required reading (in the same way that Effective Java is for Java developers).

nayukionJuly 16, 2020

Indeed. The book Effective Java dedicates several chapters to how serialization works, what are the pitfalls, and how to avoid them (with care and effort, not automatic).

judkonJuly 6, 2014

Effective Java is the textbook of junior professional programming. All your new hires shoyld read it.

javabean22onJune 5, 2017

Programming Pearls (2nd Edition) by Jon Bentley

Effective Java (2nd Edition) by Joshua Bloch. It's a Java book but it's language-agnostinc in a way. A great book.

jryan49onSep 6, 2018

After you get some Java under your belt try Effective Java and Java Concurrency in Practice. Also I read the Javadocs for all the built in libraries like java.util [1] and the Javadocs for the stream api [2]. After that I read the language spec, and the memory model spec.

1: https://docs.oracle.com/javase/8/docs/api/java/util/package-...
2: https://docs.oracle.com/javase/8/docs/api/java/util/stream/p...

_old_dude_onSep 20, 2020

I recommend Effective Java, the third edition is updated for Java 9 I believe and Java Concurrency in Practice for the core parts of the language.

For Spring, Jakarta EE, Micronaut or Quarkus the docs of their respective websites is enough.

a3nonMar 30, 2014

Aside:

Your invocation of Effective Java made me look for Effective Javascript, and it does exist. Amazon users give it five stars: http://www.amazon.com/Effective-JavaScript-Specific-Software...

Can anyone comment on how well this books fulfills the expectations implicit in a book calling itself "Effective X?" Or just how effective the book is with respect to accepted javascript practice?

edwinnathanielonMar 6, 2015

While the preamble said something along the line of "these books are valuable for 'enterprise' dev situation', I find that a lot of ideas from those books are fully applicable to startups/hot-tech-companies.

Release It! => applicable

Continuous Delivery => applicable

Effective Java => absolutely IF you use Java (see other 'effective' series such as Effective C#, Effective C++ [_the_ grandfather], Effective JavaScript)

Patterns of Enterprise Application Architecture => Guess where Rails come from? (hint: DHH name is also mentioned somewhere in the book)

organsnyderonApr 4, 2018

The books on my desk are a combination of reference books and books that are good conversation-starters (I've read them already and don't need them as reference, but they're good for lending out to people, especially junior devs).

Reference:

  - Effective Java (good for learning the mindset of developing backward-compatible APIs in any language)
- Enterprise Integration Patterns (I work on an enterprise APIs team)
- Designing Data-Intensive Applications
- Camel in Action

Good for lending out:

  - The Phoenix Project
- Making Work Visible
- Effective DevOps
- The Pragmatic Programmer
- REST in Practice

vibrunazoonJune 30, 2011

I agree, reading books of different perspectives is great.

I would also like to bring up the importance of reading "good practices" books and articles. Learning not only how to write good code for yourself, but good code for your colleagues to work with is an important skill to have. Writing maintainable code is often not trivial. I recommend reading Effective Java by Joshua Bloch.

crooonSep 29, 2018

You don't know javascript: https://github.com/getify/You-Dont-Know-JS

I would also mention that the 3rd edition of Effective Java is still a standard for anyone using java7-8-9:
Joshua Bloch
Effective Java (3rd Edition)

mahmudonJuly 30, 2011

Hortsman & Cornell's, two volume "Core Java 1.2". I only read the first.

Gosling's "The Java Programming Language".

And Josh Bloch's "Effective Java".

After that, Java Concurrency in Practice.

Langr's "Agile Java" is good for just that.

Bloch, Goetz, and Doug Lea have each written excellent books on java concurrency.

That's just about all the java books I would want to recommend. Many j-books are trash.

electrumonMay 29, 2012

There are two books we recommend to every developer:

Effective Java: http://java.sun.com/docs/books/effective/

Java Concurrency in Practice: http://www.javapuzzlers.com/

Everything else is covered by the excellent online documentation, including the language and VM specification books: http://docs.oracle.com/javase/specs/

Java Puzzlers (http://www.javapuzzlers.com/) is a fun read that highlights many corner cases of the language and might be helpful for code reviews and debugging.

doktrinonFeb 10, 2013

>Recommending Javascript the Good Parts to Javascript beginners is like recommending Effective Java to Java beginners.

Or, like recommending K&R C to beginners (C beginners, but even worse to programming beginners). There are a handful of books out there that, IMHO, are vastly mis-recommended, and I would agree that JS:The Good Parts is one of them.

andrewcookeonJune 1, 2011

Effective Java is the best book for general Java that I know - http://www.amazon.com/Effective-Java-Programming-Language-Gu... It's not a tutorial, but a collection of recommendations that could take you from just-learnt to competent.

Very slim, and very good - Javascript: The Good Parts http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockfor...

For a C reference, Harbison & Steele is excellent - http://www.amazon.com/Reference-Manual-Samuel-P-Harbison/dp/...

acangianoonJuly 12, 2010

Effective Java (2nd Edition) by Joshua Bloch: http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/032...

It's not for beginner Java programmers, but if you have experience in other similar programming languages you may get away with it.

bdittmeronNov 16, 2008

I think as a language C# is superior to Java. That being said, learn Java. The open source community alone makes it a much more attractive platform to build apps on. The number of choices in terms of frameworks + no vendor lock in makes it a winner. If you're serious about learning it pick up a copy of Effective Java by Joshua Bloch -- by far the best general Java book out there.

shubik22onApr 11, 2021

I haven’t written Java in my day-to-day for quite some time now, but the first thing that came to mind for a good open source Java codebase is Guava by Google: https://github.com/google/guava

It’s a collection of core libraries for Java that I believe should have a lot of useful patterns/concepts to learn from.

I also highly recommend Effective Java by Joshua Bloch (https://www.amazon.com/Effective-Java-Joshua-Bloch/dp/013468...). An incredible text for any kind of programmer, and even better if you’re specifically interested in Java.

Good luck!

diegoonNov 27, 2010

Kernighan and Ritchie's C Programming Language, Second Edition (when it came out in the late 80s).

Expert C Programming, Peter van der Linden (a decade later).

Effective Java by Joshua Bloch.

macandoonSep 27, 2019

I can't recommend Effective Java enough. Even if one hates Java with passion. I haven't managed to find a better book on how to design an API in any language. It learned me to think about the consumers of my code all the time (even if I'm the only author on a given project) The chapters on exceptions, defensive coding, generics are brilliant. The whole book is written in an effective manner. Dense with information, short and still readable. The second best: Eloquent Ruby. Brilliantly written and mature. Instead of hyping everything up, the author elaborates the downsides of each described technique and power tool.

meddlepalonJune 19, 2018

JVM dev here... unfortunately there aren't any great holistic books for modern Java that I can think of. A lot of it is just community learned (e.g. put the XML away, stop making everything a damn GoF design pattern, stop trying to create mega class hierarchies, favor small libraries over mega frameworks).

I will say Joshua Bloch's Effective Java is something ever Java dev should have read at some point.

ignoramousonJuly 30, 2019

From the ones I've read: The Head First series of books are really really nice... other such books... D Crockford's JavaScript: The Good Parts; B Eckel's Thinking in Java; Skiena's The Algorithm Design Manual; M Nielsen's Neural Networks and Deep Learning; J Kurose's Computer Networking: A Top-Down Approach; R Lafore's Data Structures and Algorithms; J Bloch's Effective Java.

why-elonMay 16, 2014

Effective Java. A very succinct collection of wonderful practices and ideas on how to code great software that you can finish in a couple of days, even if you are on a working schedule. Don't mind the "Java" in the title; I read the book regularly and it applies to pretty much any language capable of some OO.

Check the table of contents, it will give you an idea of what to expect from the book.

bitmapbrotheronJune 29, 2015

The snippet of code you used was written by Joshua Bloch (author of Effective Java and a then employee of Sun). When Joshua was working for Google he implemented the rangeCheck method for Android from scratch, but since he was the original author for the Sun Java implementation he naturally did it the same way.

alisonatworkonMar 2, 2020

I think there is some value in certifications as a way of teaching unusual corner cases you might not otherwise come across.

I only have one cert - the Sun Certified Java Programmer, from back in the day when Sun still existed - and i can say it encouraged me to dive deeper into the quirks of the language. For sure, reading Effective Java gets you more bang for the buck in becoming a great Java developer, and stuff like Clean Code probably helps more with learning how to build maintainable apps, but i still feel like the SCJP was worth my time to do.

The thing i found about doing the SCJP is that it increased my curiosity around programming languages in general. Those contrived "gotcha" questions on visibility, inheritance etc made me think more deeply about how to design code in a readable and safe way - not just in Java but in other languages too.

squidsouponMay 29, 2011

I got the most value from Effective Java by Joshua Bloch when learning Java. It's not specifically for beginners, but teaches best practice that would encourage a beginner in the right direction from the start. I suspect there are many instructional Java books that would teach coding practices that would not be considered best practice today.

http://java.sun.com/docs/books/effective/

ninjakeyboardonJuly 25, 2015

I think I disagree with this. It seems natural to start to code with a functional style as you become a better developer. I worked on scala for quite a while, and took a detour to write Java. The Java that I wrote was way more readable and testable than any of the imperative code I wrote before learning FP well because I approached the imperative language from a functional perspective.

If you look at Bloch's book Effective Java you'll see he describes functional approaches quite a lot (eg prefer immutability) - these are places you go when you see that they're better.

foobarianonJan 4, 2014

I would suggest Java. It has a really clean object model, is statically typed, and if you use Eclipse it will compile-as-you-write to highlight errors, suggest fixes, and autocomplete a lot of useful stuff like methods you can call on an object.

While you are at it, read "Effective Java" by Josh Bloch--it's full of excellent advice about OOP, and applies way beyond Java itself.

My biggest epiphany about OOP was realizing that just because you can use inheritance, you don't have to use it everywhere. You read a lot of toy examples where you have e.g. a shape, then you have children like square, rectangle, etc. and try to do everything this way in your projects. But it's actually often a really bad idea to overdo it, and Effective Java has some good explanations on the tradeoffs.

spacemanakionMay 7, 2012

Ok, so there are a few comments claiming that this kind of revelation only seems valid because the author hasn't seen OO done right, or has only seen bad OO code. As someone who has gone through a similar shift and feels disenchanted with a lot of the OO code I deal with on a daily basis, but is still very much aware of my own inexperience and naivete, I'm wary of these claims but I'm curious.

So what's some really great, clean, elegant object oriented code that I could read to better understand what makes up good OO design? What are the books one should read to develop a deeper understanding of OO's qualities? It doesn't matter what language or platform they focus on, since I think the fundamentals ought to be independent, and I'm willing to work hard. Rails internals, Django internals? Some Java framework? Or is there some awesome piece of Smalltalk code out there that demonstrates the roots of OO? Is the Gang of Four book still relevant? Where do you go for getting the bigger design picture?

For context, I've done a lot of Java (Android) but I don't think I've been exposed to good large scale design in Java (I've read Effective Java and Java Concurrency in Practice, but both of those deal with the nuts and bolts of programming in the small) Most of my functional programming experience is with Clojure, which is very opinionated and takes a radical approach to OO, and I think the bar has been set kind of high by Rich Hickey.

Please don't tell me to go get a job at Google or your company where the code is beautiful all the time; that's just not fair.

jasonhongonMay 23, 2020

This will only address part of your question, about API design.

I'd highly recommend Josh Bloch's writings. Josh is perhaps best known for the book Effective Java and the Java Collections library. Here is a paper he wrote about good API design (https://dl.acm.org/doi/abs/10.1145/1176617.1176622) and a short interview with him about API design (https://www.infoq.com/articles/API-Design-Joshua-Bloch/).

Brad Myers at CMU also has done research on API usability. See here for more details: http://www.cs.cmu.edu/~NatProg/apiusability.html

Lastly, if you're doing anything remotely related to security, I'd also recommend Matthew Smith's research. He's studied a lot about weaknesses of today's API designs and how they have led to security vulnerabilities.
https://ieeexplore.ieee.org/abstract/document/7676144

ganonmonDec 18, 2017

What is up with the seemingly popular knee-jerk reactions towards OO design patterns? It genuinely feels like some sort of mass hysteria... Yes, strategies like dependency injection might seem like pointless complexity if you don't examine why they exist in the first place, but they do solve genuine problems. And no, these aren't just problems that wouldn't exist if you used a functional language... (no silver bullets or else we'd all be writing Scala or Haskell)

Yes Java has a lot of problems but they are mostly ones that have workarounds and aren't fundamentally dealbreakers. A few example issues are assignment isn't final by default, @Override isn't required to override methods, you can't have abstract static methods (sort of can workaround this now get this now with default interface methods). Java is basically just a really un-opinionated language that requires careful practices to wield it properly (see Effective Java by Joshua Bloch) but other than that it isn't a completely terrible language and you can write some really robust, easy to read code with it.

I would also have a lot more time for this article if the author actually took the time to explain the motivation behind the *FactoryFactoryFactory class instead of just discounting it without explanation and using it as the proverbial Straw Man for his article. I'm sure something this unusual must have a very interesting reason as to why it exists (I'm taking him literally here and assuming he isn't just exaggerating for comic purposes).

tjronDec 16, 2008

I've not done much Java for a while, but my most useful resources have been The Java Programming Language and The Java Developer's Almanac (especially the code samples, which I believe are available somewhere on java.sun.com).

Effective Java is also a great read for becoming a "better" Java programmer, but may or may not be useful to you right off the bat.

hrgigeronNov 12, 2019

Thanks for Fluent Python, is this one [1]?

Java: Even for an early version I still revisit [2] Kathy Sierra SCJP 6 book beside of new ones, a great reminder for core concepts and basics, also 'effective java' by Joshua Bloch

C: As HeckFeck mentioned it was fun to follow C Programming Language by Brian W. Kernighan, Dennis Ritchie

[1] https://www.amazon.com/Fluent-Python-Concise-Effective-Progr...

[2] https://www.amazon.co.uk/Certified-Programmer-Study-Guide-CX...

martincedonFeb 26, 2013

Oh the memories. It's not very well written but most advices are sound if you're stuck in that very particular Java / C# hell.

The book "Effective Java" (from 2001) still has to one the "must read" for any Java programmer that didn't read it.

In it Joshua Bloch has always been very clear, from the start, about all the deeply ingrained ugly Java warts that Java had from the start (and still has). Like for example the complete and total utter impossibility to respect the equals() and hashcode() contracts in the face of inheritance.

Took a long time to set in but now quite some Java programmers are beginning to accept that having equals() and hashcode() at the top of an inheritable OO hierarchy may not have been the greatest thing since sliced bread.

The second book to read is Goets and al.'s "Java Concurrency in Practice" (one of the best looking programming book cover ever, which never hurts an incredibly high-quality content).

But the real lesson is that: Java is too complicated and has way too many warts to ever produce beautiful code. The JVM is not all bad but "Java the language" is really fugly.

Switch to a language that has a saner way to deal with concurrency (Say Clojure's STM or Go) and you can throw most of the pages in these books to the trash.

friggonNov 8, 2013

I think it depends on the framework/language you are learning. Books sometimes have several advantages over tutorials online. Off the top of my head:

  - You have everything organized in one place.

- You are sure they are accurate (they often have an errata posted online).

- You don't bother searching for content online.

When I wanted to learn about Servlets/JSP/JSTL/Filters/DAO it was much easier for me to buy a book (Pro JSP 2) than to search for online tutorials, even though there are plenty. This book explained everything I needed to know about the subject.

As for programming languages, I don't really buy books because I find they're fairly easy to pick up once you know 2-3 (with the exception of books such as Effective Java). Don't forget there are also video tutorials which are an important resource.

kccqzyonSep 27, 2019

Contrarian opinion here: I've instead found the constant philosophizing tiring. But I still commend his effort because as he explained, he's trying to articulate the inarticulate and the visceral. Most programmers would probably benefit from reading a book in the style of Effective C++ (Scott Meyers) or Effective Java (Joshua Bloch), where recommendations are more concrete and more unequivocal. Once you've done that, the matter of software design only really comes with experience—experience designing software and having an almost tactile reaction to the future maintainability and readability of the code; it doesn't really come from reading a book like this.

mmahemoffonMay 24, 2012

I don't think the topic is new per se, as really a lot of software engineering history has been about dealing with the human aspects of development. Even fundamental concepts like object-orientation are grounded in psychology and even before software, there were precursors for this kind of thinking in the way machines and working environments were designed. Josh Bloch's Effective Java is a more recent example.

The difference now is that UX has become a popular, well-understood, discipline. So we have a lot more concepts to take back into API design.

Some of us have been capturing relevant links on the topic on a Developer Experience page (https://plus.google.com/116834904360889286443/posts) and under the #devexp hashtag. We don't have t-shirts, but we do have a logo in need of much love! I'll go add a link to that presentation too.

crooonJan 26, 2019

I second Effective Java. It's an advenced/master level guide to write good java code. Some of the subjects are outdated as it is so engraved in Java that probably a tool does it for you(eg. dependency injection) but really helps to get the big picture if you are an experienced developer but new to java.

To work with legacy code I recommend Working with Legacy Code by Martin Fowler. Lots of good ideas for handling messy codebase are described there.

Cthulhu_onJune 9, 2020

I personally (anecdotal) feel that the Java world is a lot more formal; there are some Strong Opinions held in what "good" Java code is, which is missing in Javascript. This is in part due to great books like Effective Java, and in part due to editor / IDE support that will warn you and help you write great code - keep in mind that good IDE support has been missing in Javascript for years because of its lack of support for e.g. modules or namespaces, and its lack of Opinions.

Java's community has been Opinionated, whereas the JS community has been a lot more freeform. JQuery and NodeJS have been very influential in adding an opinion to the language; jquery by adding a kind of namespacing and scoping (also thanks to its predecessors / peers like YUI), NodeJS by adopting a module system (CommonJS) and centralized dependency management (NPM).

I came into JS via Java and while the lack of standards and rules / expectations was liberating, I was also missing it. It took a while before the best practices of Java made it into Javascript; in my experience, AngularJS was a big push for that, in that it was a much more opinionated way to structure your components and application - with a strong emphasis on (unit) testability.

hackermailmanonJan 26, 2019

Effective Java by Joshua Bloch is probably the best book for starting to work with a large codebase, supplemented with course notes from any software engineering intro course like https://www.cs.cmu.edu/~charlie/courses/17-214/2018-spring/i... if new to Java. SEI CERT has some recommendations too you can adapt to whatever version you're using at work https://wiki.sei.cmu.edu/confluence/display/java/SEI+CERT+Or...

sadliononMar 4, 2016

I recently had an on-site interview at a big SV tech company. I had 4 interviews and 3 of them flat out told me they haven't read my resume. I didn't do as well on the whiteboard hazing but I'm confident that I could have solved them if I had more than 30 minutes to come up with an efficient solution.

What disappointed me was, 3 of the interviewers had no idea about my background and weren't able to extract my strengths. Even though I am a new grad, I have interned for 2 years as an app dev and learned a great deal about design, code quality, testing and etc...

I have read Effective Java, Clean Code, and Head First Design Patterns. I'm reading Java 8 in Action now. I have not memorized them page-to-page and still need more experience to master them, but at least I know some of resources I can go to for more answers. I have participated in code reviews and enjoy them. I can implement LLRBT and many of the algorithms you can expect a new grad to know but I have not invested my time on hacker rank and uva.

I don't know what SV or big tech companies are looking for. I constantly hear interviewers say they want good engineers but fail to capture the essence of a potential good engineer well. What benefit is there in hazing anyone with problems many engineers don't deal with without the tools they use every day, and with an absurd time constraint. Kosaraju didn't come up with SCC in 30 minutes and he had a PHD. Sure I can spend hours studying for whiteboard questions but to what benefit. I am sure anyone of you can come up with a whiteboard problem you can't solve in 30 minutes, but what does that say about you.

ecyrbonFeb 6, 2010

I happen to work for a company in the financial sector.

Our developers use Java (mostly).

Our research department uses whatever they are most comfortable with for research, but the result of their research is coded up in C++. If we had to do it over, we'd probably do everything in Java. Misc. notes:

Personally, I am WAY more productive in Java.

I supplement Java with Clojure.

I find the performance penalty for using Java is pretty-much negligible. It's always how you do it that matters more than what language you do it in. Don't use Java Generics for number crunching though... use a dedicated primitives collection library like Colt.

Java and C++ are quite similar in some respects. I would say though, that it's easier to go from C++ to Java, than from Java to C++.

Best C++ books:

Accelerated C++ by Andrew Koenig and Barbara E. Moo

Effective C++ by Scott Meyers (make sure you get the 3rd edition)

Best Java books:

Effective Java by Joshua Bloch

Java Concurrency in Practice by Brian Goetz, Tim Peierls, Joshua Bloch, and Joseph Bowbeer

If you have to use C++, start using the Boost C++ libraries early on. You can learn a great deal just by using the Boost libraries, and reading their documentation.

ganonmonApr 4, 2018

I am at an early stage startup which is using Java (and Kotlin) on the server-side. There are various reasons for this, most of them pragmatic, but also some technical ones.
Pragmatic reasons:

- Many engineers know Java to at least an intermediate level, so they can be productive quicker (and hiring is easier)

- We had some existing libraries written in Java, so integrating them with the web platform was much easier if we went down the JVM route

- Java is the language most familiar to members of the startup (including me, although I also have experience in RoR, Kotlin, ObjectiveC and JavaScript)

Technical:

- Java is generally very performant and running on the JVM means we don't generally have to worry about platform specific issues (there are well known exceptions of course e.g. file path issues)

- The language itself is at a reasonable level of abstraction. It is strongly typed and IMO, writing a non-trivial backend in a dynamically typed language is a sub-optimal choice. It has a huge ecosystem of robust, battle tested libraries that are indispensable to us (e.g. JGraphT). There is a huge community - you are unlikely to run into 'uncharted' territory

- It is popular to hate on Java but it really isn't that bad a language, especially if you aim to follow guidelines like those in Effective Java (probably my favourite programming book) e.g. avoiding mutable state and side-effects. It will never be as good as a modern language like Kotlin (data classes are my favourite feature there), but it is good enough

- The server frameworks available are seriously robust and 'just work'

- There is always the option of using alternative JVM languages (we use Kotlin for a large part of the backend)

In summary, we are 6 months into developing the web platform, progress is rapid, and we have no regrets (yet) about the technology choices. IMO, sometimes boring is best.

jzer0coolonMay 5, 2020

Thank you for pointing that out, you are right. I had intended to complement with dates with 3 bullet points and missed that fine point.

2.5 era: " ... some might argue that the third era was the “Effective” era, with books such as Meyers’ Effective C++, Bloch’s Effective Java or Wagner’s Effective C# as flagship examples. But I consider these books, as useful as they are, just an offspring of the second era; a much needed upgrade. Let’s say, then, it was the 2.5 era of programming books".

3.0 era: "... at a time where the dot-com boom opened the door for new ideas, right in the middle of the Web 2.0 craze, and right before the rise of the smartphone and social media. Through the use of comic images, unusual text layout, and a fantastic sense of humor, Kathy Sierra argues, readers can learn the concepts easier; tricking the brain into the proper levels of dopamine".

At barnes & nobles / borders I always grabbed one of these books which made content enjoyable to read. She sparked a new era of genres produced by other authors, for example, an anime version of learning python.

danieldkonApr 4, 2018

I rely mostly on hypertext for referencing, mostly through Dash for macOS and man pages. Books that I still occasionally reference:

- Speech and Language Processing, Jurafsky & Martin

- K&R

- Sedgewick & Wayne, but more for teaching than anything else.

In a previous life:

- The C++ Standard Library, Nicolai Josuttis,

- C++ GUI Programming with Qt 4, Jasmin Blanchette and Mark Summerfield

- The C++ Programming Language, Bjarne Stroustrup

- Effective Java, Joshua Bloch

- Scott Meyers' Effective C++ books.

shreyanshdonDec 12, 2018

  East of Eden - John Steinbeck
Of Mice and Men - John Steinbeck
The Grapes of Wrath - John Steinbeck
Cannery Row - John Steinbeck
Crime and Punishment - Fyodor Dostoyevsky
Man's Search for Meaning - Viktor E. Frankl
Deep Work - Cal Newport
The Little Prince - Antoine de Saint
The Subtle Art of Not Giving a F*ck - Mark Manson
Flowers for Algernon - Daniel Keyes
Notes to Myself: My Struggle to Become a Person - Hugh Prather
Tuesdays with Morrie - Mitch Albom
I Heart Logs: Event Data, Stream Processing, and Data Integration - Jay Kreps
Kafka: The Definitive Guide - Neha Narkhede
Effective Java - Joshua Bloch
Algorithms - Robert Sedgewick, Kevin Wayne

joshkaonApr 5, 2021

>I see a pattern and I feel the older generation is way more capable and knowledgeable when it comes to Computer Science in general. I am pretty sure a lot of people are or were in the same boat as me.

The older generation are in this place because back then none of the technologies you listed existed and so they had to know the more low level things.

A book that might help some of your knowledge gaps (at least directionally) is The Imposter's Handbook[1] by Rob Conery.

If you're specifically aiming to get away from CRUD take a look at the various Domain Driven Design books by Eric Evans[2] and others. This is the opposite direction to your ask though (more high level than low level).

If you want to go deeper in Java, read Effective Java[3] and Java Concurrency in Practice (JCIP)[4]

Lastly, if you want to experience the reasons why some of that early comp-sci stuff happened the way it did, playing with expensive hardware is the least effective way to find understanding of constraints. Instead consider grabbing devices with significant limitations like an Arduino, ESP32, or similar (I'm partial to the Wio Terminal[5] and M5Stack[6] as interesting easy to get started devices, but others would suggest various Arduinos or Raspberry Pi devices). Realistically you're going to learn much more by coming up with a self-challenging project and completing it than just by learning it for the sake of learning.

[1]: https://bigmachine.io/products/the-imposters-handbook/

[2]: https://www.amazon.com/Domain-Driven-Design-Tackling-Complex...

[3]: https://www.amazon.com/Effective-Java-Joshua-Bloch/dp/013468...

[4]: https://www.amazon.com/Java-Concurrency-Practice-CONCURRENCY...

[5]: https://www.seeedstudio.com/Wio-Terminal-p-4509.html

[6]: https://m5stack.com/

brown9-2onJune 10, 2009

Bloch's Effective Java is the true must read here, 80% of this article simply re-iterates what was already published there (and in other places) already. The author just adds this "canEquals" idea, which sounds like it might become annoying and hard to maintain if you have more than a small handful of subclasses to deal with.

rattabonJuly 30, 2011

I don't know how relevant it is for mobile development but I'd recommend Effective Java by Joshua Bloch (http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/032...). It's essentially the equivalent of Effective C++ for Java and it does a good job of explaining how to properly use the language. It also contains quite a few general programming advises which are applicable to other languages.
Just keep in mind that it assumes that you already know the language and have a bit of experience under your belt.

jboothonApr 24, 2010

Read Effective Java by Josh Bloch -- take those lessons to heart and prepare to be dismayed at how poorly designed 7 figure "entreprise" software really is. Then struggle against it for a few years until you say "screw it, my next job will only involve the Collections API, util.concurrent and nio libraries".

rmetzleronJune 6, 2018

I didn't touch much Java Code for ~ 10 years now. I remember reading about the string concatenation problem in the Effective Java book. Using a StringBuilder was the very first thing I usually tried when I needed to improve performance on some unfamiliar code.

I didn't know the Java compiler converts this automatically now. Since which version is this? I suspect there might be still edge cases where it doesn't work.

dcposchonDec 8, 2014

The zero-copy IO in Go is so elegant.

I think you can really judge a language accurately by checking out its standard library. This is one of my favorite things about Go.

By comparison,

* The C++ STL. Fast and useful, but the implementation is nearly unreadable due to template soup. Here's one of the simpler parts! https://www.sgi.com/tech/stl/stl_vector.h

* PHP. So bad it's basically a strawman. I'll include it because it's hilarious:
http://www.forbes.com/sites/quora/2012/08/31/what-are-the-mo...

* Java. A bit better. Compare the readability of OpenJDK's ArrayList.java to the STL vector.h, which does essentially the same thing: http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/s...

But of course the Java standard library is immense and has a lot of cruft in it. To write clean Java you really need to avoid much of the standard library (read Effective Java by Josh Bloch) and add a few important missing parts (use Guava).

Golang is really unique in that regard. You can learn Go by reading the standard library. It is beautiful, linear code. The library is pretty complete--eg you can write a one-line HTTP file server out of the box--but nothing feels extraneous. Lastly, I think it gets close to Knuth's ideal of Literate Programming. Paragraph-length comments thoughout the standard library explain what's happening, how, and why.

For example, the post talks about how io.Copy is awesome. For a concise English explanation, why not go directly to the source!

https://golang.org/src/pkg/io/io.go#L329

atulatulonMay 1, 2020

This comment is not about text blocks as such but the write up by the author. (Brian Goetz... If you are here, when do we see the next edition of the book, please?).

It is not simply 'here's a new language feature'. I find it quite informative regarding what, why, how and why not etc. His articles explain what went into the decision making. Something on the lines of discussions in Effective Java by Joshua Bloch.

His article on records: https://www.infoq.com/articles/java-14-feature-spotlight/

rotiferonJune 8, 2020

Here are some books that have stood out for me. They cover some of the technologies that I either have to work with, or am personally interested in.

Effective Java by Joshua Bloch

Practical, actionable guidelines. The first edition was the best, the second was diluted somewhat by having to cover generics, in the third he admits that he doesn't really use Java much anymore... Despite that, it's well-written and still a good book.

The Linux Programming Interface by Michael Kerrisk

Covers some of the history of the Linux/Unix API, describes it in detail, has plenty of examples, compares different APIs that do similar things so you can make an informed choice (e.g. System V vs. POSIX message queues).

If any book in this list stands out for me, it's probably this one. It might be partly due to the surprise factor of how enjoyable and well-written a 1000+ page, near-reference book is.

Programming in Haskell by Graham Hutton

An intro to the language and how to approach problem solving from a functional P.O.V. Not as comprehensive as some other intros to Haskell, but Hutton is a good writer and educator, making it a good read.

Designing Data-Intensive Applications by Martin Kleppmann

Provides an overview of a number of topics related to databases, distributed systems, consensus, etc. Lots of references (many of them online) if you like that in a book. Enjoyable to read.

Parallel and Concurrent Programming in Haskell by Simon Marlow

Probably a must-read if you're into Haskell; probably too esoteric if you're not... Well written.

Type-Driven Development with Idris by Edwin Brady

Describes a programming language similar to Haskell, but strict by default and with dependent types designed-in from the start. Also describes techniques for leveraging the type system to construct functions (the type-driven part of the title). Well written.

Hacker's Delight by Henry S. Warren

Low-level bit twiddling. 'Nuff said.

einpoklumonJune 5, 2017

Although I liked Effective Java a lot, and it does contain a lot of advice relevant to many OO languages - it is the opposite of language agnostic: It's very Java-specific. Much of the content is irrelevant except in Java itself; and some of it is the opposite of "Effective language X". For example, it has a section named "Prefer lists to Arrays"; any C++ programmer will tell you the opposite (and that goes down to some of the arguments, such as Java not supporting generic arrays while C++ supports them).

So - good book, but not for this purpose.

smusamashahonSep 24, 2020

Unlike almost other books recommended in this thread, this jumps straight to the point without a lot of text.
From the very start it makes a point and continue without delving into too much intro or background or other plain (useless) text.

I find Effective Java an easy read for the exact same reason, it makes a point from the very start without telling so many stories.

strlenonJan 11, 2011

It's not that Scala is Effective Java, it's that "Effective Java" (the book) is a good set of patterns of software developments in many other object oriented languages. You'll note much of the same discussed in Design Patterns (unfortunately, in a more rigid and less accessible form) and visible in well written pieces of software in Java, C++ and many other languages. That's why I highly suggest reading Effective Java even if you hate Java the language / Java the culture, the latter symbolized by horridly designed and implemented frameworks like Spring which have turned design patterns into a set of buzzwords to liberally sprinkle.

twiconDec 25, 2014

You're conflating a couple of things here: encapsulating state, and mutability of state. Your examples are about mutability. But immutability is already standard practice in Java - standard enough that it's one of the items in Josh Bloch's 2001 book 'Effective Java', the bible of righteous Java programmers:

https://books.google.co.uk/books?id=ka2VUBqHiWkC&pg=PA73#v=o...

It's not usually pursued with the same rigour as in many functional languages, but it would be absolutely normal to see a Rectangle class with a stretchedX method which returns a new rectangle rather than mutates its receiver.

Now, you might argue that despite what Bloch, and every other good Java programmer, says, "Java as typically programmed" still trades mostly in mutable state. Since Java is actually widely used in the real world, it's typically incompetently programmed, and so this is probably true.

Nonetheless, i am confident that Java code written using immutable objects could both use and be used by other code. I say this because it's what i and my colleagues have been doing for years.

I had a go at functors in Java a while ago. You're certainly right that it's not elegant:

https://news.ycombinator.com/item?id=7898294

matwoodonMar 26, 2012

How many have actually read Code Complete

Some books are references and some are read throughs. I read Code Complete while in college and thought it really helped my programming. Effective Java is another great book that I've read. The Pragmatic Programmer is another one that I've read that really is worth the time.

Many books are just good references though. Pick it up and read a chapter for example. I think the more experience a programmers gets the less they need to read right through a book. When looking at a book on a particular language I can usually skip the first half because I know the parts that are common across most languages. I only need to know what's different/cool/idiomatic in this particular language.

Algorithm books are another example that falls into mostly the reference category. I don't think I've read any entire algo book, but I have read many chapters from many different algo books that touched on what I needed to learn at the time.

codesurgeononJuly 8, 2009

Like so many other tasks, coding requires a certain amount of knowledge, experience and craftsmanship. Over the years I have come across many developers who don't even know the common best practices of their respective bread & butter language. Even worse, when they don't even suspect that there could be concepts beyond what language syntax and semantics provide for.

As a first step C/C++ developers should have read Scott Meyers' books and Java developers should know Josh Bloch's Effective Java by heart.

WRT to the (ultra-short) post this item links to, IMHO designing everything up front is neither feasible nor possible at all for any but the most trivial projects. That is something that at least the advent of agile methods even within the most conservative corporations should have taught us.

What is lacking in software development are neither the tools nor an atmosphere of less pressure. Much rather it is the sensibility for decent craftsmanship and engineering - and the knowledge of the means on how to acquire such.

jimbokunonAug 10, 2009

"Refactoring is easy, should you need it. If you do not control all the code and it’s usage, you might need to be more careful though."

Bloch's Effective Java is wonderful, but if it has a weakness, it might be that it assumes everyone is writing a library to be used by a lot of developers, many of who are outside your organization.

The example of public fields in data transfer objects is an example of this. Making the fields public is fine if this code is just for you and your team, because you can always refactor it to use accessors later if you need to. But if this code is in a library used by people outside your organization, introducing accessors later without breaking code will be almost impossible.

didymosplonMay 5, 2020

I don't know (yet) about any of the resources mentioned in this post but let me share my experience. Last year I came back to Python after several years spent mostly in JVM land and I was looking for some refresher so when I saw Python book bundle on Humble Bundle I didn't hesitate for a moment. While all books were solid, one really stood out. Fluent Python[0] is one of the best intermediate/advanced level books on any programming language I've ever read. It's like an average advanced course, Effective Java and JavaScript: The Good Parts blended together. Bonus points for numerous references to other languages(How is Python different from X?) and other technical digressions. I couldn't recommend it more if you, like me, wrote some Python before but have the feeling you never really understood its essence.

[0]: http://shop.oreilly.com/product/0636920032519.do

eneveuonNov 6, 2010

I'm currently reading multiple books. Some are technical, some are small enough to read in the subway, some are far too big, and are read before going to sleep ;)

- La Zone du dehors by Alain Damasio, a french author. I must admit I liked his more recent book, La Horde du Contrevent, a lot more. Sadly, it is not available in English. Read it if you understand French and like SF.

- Chronicles of Amber by Roger Zelazny (finishing the 9th book). It's a good story, but not a must-read.

- The Fountainhead by Ayn Rand. Liked the first 150 pages I read.

- Cryptography Engineering by Niels Ferguson, Bruce Schneier, and Tadayoshi Kohno. I'm learning tons about cryptography.

- The Non-Designer's Design Book (3rd edition) by Robin Williams. Only read a few chapters, but I'm learning a lot about design. Very simple principles that change everything.

- Growing Object-Oriented Software, Guided by Tests by Steve Freeman & Nat Pryce. I decided to go with this book instead of reading Beck's book on TDD. I'm learning / revisiting a lot of best practices from TDD masters. I recommend it to Java Developers (once they have read Effective Java, of course).

I still have a lot to read (
http://i.imgur.com/lgpjf.jpg and http://www.google.com/buzz/neveue/Kc4GhaSSoLE/Un-weekend-pro... ), and am looking forward to it :)

I anyone is interested, I've spent some time researching (on HN, StackOverflow, and other communities) about design & UX, Linux & System administration, and programming. Here's the list I ended up with: http://www.google.com/buzz/neveue/NBBSEryBonS/Woot-ordering-...

ExpiredLinkonDec 8, 2014

> Java. A bit better. Compare the readability of OpenJDK's ArrayList.java to the STL vector.h, which does essentially the same thing: http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/s.... But of course the Java standard library is immense and has a lot of cruft in it.

Really? Java's success is - rightly - attributed to its simple and usable libraries.

> To write clean Java you really need to avoid much of the standard library (read Effective Java by Josh Bloch)

Lol, the standard ArrayList.java is written by ... Josh Bloch!

jganetskonAug 19, 2009

The real answer is no. Inheritance is absolutely unnecessary for API for GUIs. Absolutely unnecessary. If we are talking about GUI callbacks, what you want is a type systems that's statically-typed, with functions as first-class citizens (Hindley-Milner type system preferred) and with records (which are syntactic sugar anyway, they are just glorified tuples). Put a bunch of functions into a record and there's your GUI callback. This is a much cleaner and simpler way of doing it.

Inheritance is a fundamentally flawed concept in type systems. It suffers from the fragile base class problem. Josh Bloch, writer of Effective Java, recommends using composition over inheritance. If you want inheritance so that you can selectively override event handlers, and fall back on default implementations... you want something that's broken, because that suffers from the fragile base class problem. You need a guarantee that the superclass you are overriding won't call your subclass methods in an unexpected way... in other words, you need implementation details. A better way is to explicitly call default handlers on the superclass.

masklinnonNov 4, 2010

> I really like that this book was written but $30 dollars isn't actually cheap for a technical book

Is that a joke? $30 is quite literally nothing for a new technical book. Refactoring is still $45 new (hardcover but more than 10 years old now), Effective Java is about the same price, TAPL will set you back $60 and ATPL is $56 on Amazon, HTDP is $67, Koza's "Genetic Programming: On the Programming of Computers by Means of Natural Selection" released in 1992 is $67, SICP is $70, amazon asks for a hundred bucks for the purple dragon books, and then of course The Art of Computer Programming boxset will blow a $200 hole in your wallet.

$30? That's the price of a small and widely-distributed paperback like Friedl's Mastering Regular Expressions. It's basically the lower bound, even The Art of the Metaobject Protocol (345p, published in 1991) is $40.

Here's what's under $30: "For Dummies" books. Even the Head First collection bottoms out around $30.

Built withby tracyhenry

.

Follow me on