We examine the issue of separation and code design for network data transmission environments. We demonstrate that source-channel separation holds for several canonical network channel models when the whole network operates over a common finite field. Our approach uses linear codes. This simple, unifying framework allows us to re-establish with economy the optimality of linear codes for single transmitter channels and for Slepian-Wolf source coding. It also enables us to establish the optimality of linear codes for multiple access channels and for erasure broadcast channels. Moreover, we show that source-channel separation holds for these networks. This robustness of separation we show to be strongly predicated on the fact that noise and inputs are independent. The linearity of source, channel, and network coding blurs the delineation between these codes, and thus we explore joint linear design. Finally, we illustrate the fact that design for individual network modules may yield poor results when such modules are concatenated, demonstrating that end-to-end coding is necessary. Thus, we argue, it is the lack of decomposability into canonical network modules, rather than the lack of separation between source and channel coding, that presents major challenges for coding in networks.