Flexible systems have the ability to perform more functions, but they perform these functions less efficiently than specialized systems. As the flexibility of a designed system increases, its usability decreases. Flexibility also comes at the expense of more complexity in the design and higher cost; therefore, a tradeoff between flexibility and usability is needed.
Flexibility in network design refers to the ability to adapt the network resources to accommodate a large set of requirements, or adapt to change in requirements. Software Defined Networking, Network Virtualization and Network Function Virtualization technologies have been created to provide more flexibility in network infrastructure, especially in the design of Cloud infrastructures where application behavior and traffic flows are not known in advance and are hard to predict.
Alternatively, network designs that are based on understanding of the user and applications behavior can deliver optimal performance using simple topology and device configuration. This approach is suited for networks that has limited set of applications and well-understood traffic patterns that remains stable for a long time. The design of these networks can follow the design process mentioned earlier.
Flexibility is needed for the former (dynamic) type of networks but it requires layers of abstractions and virtualization and higher level of skills to build and operate, which translates into higher costs. The latter (static) type of networks cannot adapt to change that deviate too far from the initial design specifications, but they can be built and operated with much less effort and expense.
Read about other Network Design Principles.