Also, we have this classic book: The Art of Computer Programming.
It is like a bible of algorithms. It might be more for computer scientists, but programmers should read it from time to time.
Interesting. Why would programs read it from time to time? What will they get from it?
Because it is like a complete reference of algorithms.
Let us see, the complexity of a software system comes from:
Functional requirements (problem domain)
Non functional requirements (user interface, persistence, ...)
Almost the 85% of the code correspond to the 2., but those can have generic solutions and most of the type they are included into software components or frameworks.
Nevertheless, from time to time, a programmer would need to face the 1. type.
There you'll need to know the data structures inherent to the problem you are trying to model, how to represent them in your system and which algorithm fits its resolution.
This is a more higher level of programming that, let us say, make a web site or query a database system. It is more unlike to be replaced by future software stacks.
So learning to face problems of type 1. a programmer its more likely to be needed in the future.
Actually the natural evolution of a programmer is to become a computer scientist (type 1.) or a software engineer (type 2.) or a system admin (type 2.)
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.