Your average windows procedure is nothing but a huge 'switch' statement, designed to handle all possible events. Unlike the evolutionary process, the OS knows beforehand all possible events that may occur and is designed to act on each eventuality. The process is static, not dynamic like evolution.
The difference is IMHO far greater than that. A computer program if well written is designed to handle errors gracefully, but ONLY those errors or problems that have been forseen. As EVERY programmer knows, lusers will be able to find errors and create exceptions far beyond anything the programmers imagined.
Not only is the program static, it is limited in just how well it handles new conditions by the imagination of the designer.
The combination of Random Mutations filtered through Natural Selection has exactly the opposite characteristics. It is totally unbounded and the product is determined not by preplanning but by the errors that happen. As conditions change (which is the functional equivalent of luser actions) evolution reaches into its bag of mutations to find one that might satisfy the new conditions.
IMHO this is the big difference, computer programs are driven by preplanning while life is driven by posthoc patching.
Aslan is not a Tame Lion