Structural engineering theory is based upon physical laws and empirical knowledge of the structural performance of different materials and geometries. Structural engineering design utilizes a number of simple structural elements to build complex structural systems. Structural engineering depends upon a detailed knowledge of applied mechanics, materials science and applied mathematics to understand and predict how structures support and resist self-weight and imposed loads. To apply the knowledge successfully a Structural engineering generally requires detailed knowledge of relevant empirical and theoretical design codes, the techniques of structural analysis, as well as some knowledge of the corrosion resistance of the materials and structures, especially when those structures are exposed to the external environment. Since the 1990s, specialist software has become available to aid in the design of structures, with the functionality to assist in the drawing, analyzing and designing of structures with maximum precision; examples include AutoCAD, StaadPro, ETABS, Prokon, Revit Structure etc. Such software may also take into consideration environmental loads, such as from earthquakes and winds.