Summary
As we saw in this chapter, client-server application development (and generally speaking, networking on the application level) isn't necessarily inherently complex. Even the low-level code utilizing sockets is quite manageable.
There are, of course, many gray areas and aspects that are hard to get right when writing an app that makes heavy use of the network. Examples of these include working around high latency, restoring an interrupted connection, and syncing across a large number of nodes (especially peer-to-peer or multi-master, when none of the machines have the full dataset).
Another relatively new class of network problems is the political one. Lately, Internet regulations are being implemented by governments of varying oppressiveness, ranging from relatively logical (for example, blocking resources promoting terrorism) to completely nonsensical (for example, banning educational sites like Wikipedia, major news sites, or video games). This type of connectivity problem...