Three Tribes of Programming (2017)
This is fantastic and surprisingly close to how I tended to explain computer science to students and graduates:In Computer Science, there are 3 kinds of problems:1. The problems that Math gives you: algorithms, data structures. These are the problems you think you're going to solve and sometimes you do, but often we just need a few really smart programmers to solve this and the rest of us can just use those solutions.2. The problems that Physics gives you: hardware, device drivers, network latency. Sometimes you do systems programming and work close to the hardware. But once again, once one engineer has solved this, most of the time we can just use those solutions.3. The problems that other engineers give you.And that is where you're likely to spend most of your time: gluing APIs together, reading code and documentation, and arguing about code formatting.This is why in so many ways computer science is a social science. Certainly "software engineering" is. Everything you do is going to be about communication. When you write code, you're not just communicating with the compiler and the machine, you're communicating with other engineers.  You're going have to craft smart documents, emails and collaborate. Any nontrivial solution will require these skills, so you better start investing in them.