With 'networking essentials' I mean software components which constitute the infrastructure which a webapp lives within: e.g reverse proxy, DMZ, firewall, etc.
I’d recommend High Performance Browser Networking by Ilya Grigorik[0]. It’s definitely less in-depth/comprehensive than some of the other suggestions here but I’ve found it to be a really clear, accessible exploration of networking concepts relevant for web development.
There's not much about firewalls etc. there IIRC, more about low level concepts like DNS, TCP and so on. Anyway it's a great book. You can also read online at https://hpbn.co
It's one of the most practical and in-depth books even among others shared in this thread so far. It's in the top four books I'd recommend every developer to read (particularly because it's so practical)!
I've read through about... half of it; at least from my perspective (as a current software engineer at Google with experience with most of the systems / processes outlined in the book), a lot of it is philosophical about the "why" of software engineering.
I've read through half of it as well. I think it's pretty good but poorly edited somehow because of how long it's taken me to get through even just the first half.
So ultimately I don't think it will break my top list even when I finish it.
It reads like a lot of self-contained chunks (~15-20 pages per chapter, for most chapters), but right around the halfway mark, there's 100 pages on testing philosophy, which is a slog. Don't get me wrong -- testing is a fundamental aspect of modern software engineering! But I suspect that's why I got to that point and then put it down for a few months.
To harp on the testing section some more, there's some amount of redundancy across the sections. For instance, the unit testing chapter has a page on testing state rather than interactions, and then it's followed by 5 more pages expanding on the same subject at the end of the next chapter (test doubles).
It's a shame, really, since I think chapters 20+ contain some of the more technically interesting topics (yes, including another testing section -- CI!).
You said Effective Python is one of the books you'd recommend to "every developer," are the topics covered broadly applicable rather than tied to language features specific to Python?
I think it's more that I've met so few developers who don't end up using Python in any form (scripting or actual application development). So if you never actually do anything in Python then sure it's not going to be relevant.
Looking at https://sre.google/books/, I find that "Site Reliability Engineering: How Google Runs Production Services" is the third one, after two others that are very similar (judging solely by the titles...) Any insight about them? Maybe some of the other two has become a better first read?
The SRE workbook doesn't sound like a book focused on teaching (it sounds like a book on application for after you've been taught).
But no I haven't read that or the "Building Reliable..." book.
I'll look into the Building book. In general though all these Google books are really fantastic for anyone who has been a developer for a while and at any company size. I often feel like the chapters just couldn't explain the problem better.
My biggest problem is that the books kinda drone on and cover so much at once. I think they could have been better edited/cut down to make getting through them easier.
I think Beej's Guide to Network Programming is IMO hands down the best resource I've come across:
https://beej.us/guide/bgnet/
It also doubles as a very great introduction to C, if that something you're interested in. It's funny because both C and socket level programming are often a barrier, or at least they were for me. It's an attestant to the quality of Beej's guide that he introduces both simultaneously, and makes it very approachable.
This is one of those sources that helped me disproportionately grow as a programmer in a short period of time.
I'd recommend Kurose's Computer Networking: A Top Down Approach (now in 8th edition) book if you want to learn a proper computer networks concepts because this is the definitive textbook.
If you want the practical aspects of computer networks, you can try Niall Manfields' Practical TCP/IP designing, using and troubleshooting TCP/IP networks on Linux and Windows book. Granted it's a bit old (2nd edition is essentially the same 1st edition), but because you are after the essentials it should be more than fine. Here's the review of the book:
I read Kurose’s book in college and recommend it as the perfect book for this topic. As a neophyte at the time, I remember really drilling into the details of TCP and just being in awe of how well thought out the whole system was. This book laid such a good foundation for my career as a software engineer.
I really didn't like it (whatever version was current in 2004?ish), so I'd suggest Tanenbaum's Computer Networks. Not sure if it got updated in the last 15 years, but the basics should still be there.
Try the CCNA course of CISCO, “The Complete Network Fundamentals”. I did one of those years ago. It’s a great course to achieve a good base of networking. CCNA is just the first step to a good introduction, if you like it, you can expand your knowledge with more.
I took CCNA about 10 years ago and I would say its hands down one of the best certification programs and applies to my day-to-day as a software engineer. I also wrote about why all software developers should have some basic network troubleshooting skills here: https://dev.to/memattchung/why-all-developers-should-learn-h...
Me too. Took it in classroom from a Cisco partner when i was a junior webdev 20 years ago and not exposed to any network equipment. instructor was a network admin at big Co and made us crimp ethernet Jacks and shared a Lot of stuff between the lines. most of things i learned there still applies in my daily job as Solution arch
This is a little more idiosyncratic than the other recommendations, but the “Bite Size Networking” zine by Julia Evans is a really nice overview of networking tools on Linux.
This and the Ross/Kurose one are definitely the canonical textbooks, but Beej's Guide is a lighthearted and more easily digestible alternative if you don't want to learn everything in detail.
This is my favorite networking book but I think it would be overkill for OP's needs. TCP/IP illustrated walks through basically every protocol in depth starting from layer 2 and it sounds like OP really just wants to understand the basics of network administration like what you would see in a CCNA exam, and even that might be excessive for their needs.
Udacity has a Networking for Web Developers course[0], but I'd recommend trying out things (such as running a simple web-app on your own server). Things like:
- Playing around with various X-Forwarded header options in the context of your application
For a web developer, the most useful skill is knowing what each and every component on the pipeline is doing before your code executes on the request. As a common eg, if your application seems to be loading stylesheets from `http://` instead of `https://` despite being loaded over HTTPS, it is often because your application didn't honor the X-Forwarded-Proto header (which most frameworks will do for you). Similarly, seeing a local IP address (192.168.x.y for eg) on a log, and realizing that you should be using the X-Forwarded-Ip by "trusting your proxy"[1] and doing it securely[2].[3].
For networking background and history, I came up with [this list](https://sunriseprogrammer.blogspot.com/2019/09/a-network-rea...) for some new people at work. It includes things "everyone" used to know: a little bit about internet history from the original sources, some of the most useful RFCs, and some stuff about certificates.
This is an oldie but goodie: “ TCP/IP Network Administration (3rd Edition; O'Reilly Networking)” by Craig Hunt. However, I think nothing teaches networking better than making your own network devices from open source components, for example, creating routers/firewalls/access points from barebones Linux/Unix machines.
I came here looking for exactly this comment, otherwise to make it myself. Book _and_ setting it all up yourself part!
To be fair, there is probably more up to date literature nowadays especially if you want to try and do it in 'condensed' format but this is how I first grasped this whole networking thing. I'm getting old, that was probably more than 20 years ago by now.
I always wonder why many if not most of the devs I work with don't seem to actually understand even simple IPv4 and how their computer connects to the Internet. IP addresses, ports, firewalls, NAT, DNS, email, routing.
I definitely don't know as much about this any longer as I used to, when I ran all this stuff at home/did networking admin at my company on the side but just knowing that something like STP and BGP exist and still underpin this all helps if you ask me, even if you totally forgot how BGP actually works in detail.
Networking is probably not what you're looking for. You are probably more interested in DevOps and architecture. Topics like DNS and edge caching. Reverse proxies are typically web servers (ie nginx) or cloud services like API Gateways. Things like TCP are rarely relevant unless you're doing serious micro optimization.
I've never been much for following courses and really the best way to learn is practice. Working with a cloud stack like AWS is a great start. Try to setup a an app server behind a load balancer, CDN (Cloudfront) and DNS (Route53). Read up on VPCs, what a CIDR block denotes. The core functions of these kinds of appliances is actually really simple. Just routing, caching and occasionally transforming requests. The ins and outs of specific products (ie CloudFront vs Cloudflare) is going to most useful and you get that from reading product docs. That and learning to use command-line tools like curl, dig and maybe tracert if you're feeling fancy.
On the contrary, I’d say the details of TCP/IP are inseparable from the design, implementation, and practical understanding/configuration of these elements.
The whole point of the internet stack is to abstract away the details of the lower layers.
A web developer does not need to know TCP. They need to know HTTP. Even if they did know stuff about lower level networking the browser completely locks you out of that level.
The abstractions are super leaky. Infrastructure fundamentals are consequently significant in all applications. Failure or refusal to understand and inwardly digest this leads inexorably to bad software, or more precisely, bad systems. Web developers that do not know TCP/IP and do not wish to are a consequent burden to everyone else; a fountain of horrors arises, from latency issues to security blunders, when mechanical sympathy is disregarded.
I still disagree. As a web dev, there is absolutely nothing you can do to affect the networking stack. This is all completely buried in web servers and the like. Most CDNs are complete SaaS tools where you can't anything beyond the highest-level. Everything devs do to optimize performance is at the application layer. You can observe things like latency or number of connections and change your code or infra, but you're absolutely never going to inspect a packet. Unless you're actually developing those web servers.
I have countless times inspected packets on the wire when writing web applications, and there is tons we do to ensure service behaviour aligns with the networking stack.
I have also inspected traffic when investigating/writing patches for server code or the kernel, but that’s a completely separate matter.
What’s more, most nontrivial application code causes additional network activity, from DNS queries to database connections, calls to external APIs et cetera. The all-the-world-is-HTTP fallacy is how wheels get reinvented, but badly, as with websockets or JWTs.
I disagree. I learned the structure of TCP frame in college and that's the last time I've looked at one. 99% of my job is at layer 7. Understanding bits like TLS handshake and http headers is plenty.
And now you’re here handing out authoritative and contextual advice on what to study. Like it or not, you’re still using what you learned. A merely superficial awareness wouldn’t suffice.
Depending on your interests/needs, you might not find yourself actually writing network code, but dealing with it tangentially when things go weird. Programming blogs where people detail one of these weird edge cases and explain how they debugged them are super interesting and might be more relevant to your day-to-day work.
Here's one I really like, you could learn a lot just reading through all the networking-related posts here:
https://jvns.ca/#computer-networking
I think you are looking for a book which covers details of all the "Hardware Appliances/Software Components" which live in a network serving "Web based Applications". I don't know of any one book which will cover everything but you might find the following useful.
* An Engineering Approach to Computer Networking: ATM Networks, the Internet, and the Telephone Network by S. Keshav - This is a great text on fundamentals of Networking. Nothing to do with the "Web" but everything to do with what underpins it.
* Web Protocols and Practice: HTTP/1.1, Networking Protocols, Caching, and Traffic Measurement by Krishnamurthy and Rexford - Best book i have seen yet which explains the interplay between HTTP and the underlying TCP/IP protocol suite.
* Load Balancing Servers, Firewalls, and Caches by Kopparapu.
[0] https://www.amazon.com/dp/1449344763