Any designer knows that real lenses aren't just surfaces; they're whole objects with edges, bevels, scratches, bubbles and so on. In real optical systems, some light always reflects when it should refract, and that light has the annoying habit of getting where it shouldn't. Twenty-first century optical design software can model a system as a group of optical objects, not just surfaces. These objects can have a complex set of properties, including scattering, that change just where the light hits. You can design these objects, like lenses, mirrors and diffraction gratings, within the lens code, or you can make them completely arbitrary in shape and just import them from a computer-aided design program. What's more, the object scene that your system is looking at is a lot more realistic. Instead of calculating based on simple point sources, you can use 24-bit color images or even measured data taken from a real lamp source. And you can get output in candela, watts per square meter, lux and so on. You can use as many sources as you like, with as many detectors as you like, wherever you like. Another area where software is evolving is in tolerancing a system. This is where you have to face up to the fact that nobody can make a perfect system, so you need to understand what happens when things aren't perfect. This used to be done on a surface-by-surface basis, but now you can write an alignment procedure and execute it just the way the technician will when she builds the system.