Я часто на своїх лекціях
розповідаю студентам, що програмне забезпечення є найскладнішим інженерним
творінням людини. Я, звісно, досі у цьому переконаний, але після декількох
тривалих дискусій зі своїм студентом-дипломником похитнувся мій основний аргумент:
у програмного забезпечення усі компоненти унікальні. Я завзято пояснював, що
якщо з'являються два однакові шматки коду, то їх виносять у окрему підпрограму,
залишаючи тільки виклик на старому місці. У той час електричний ланцюг може
складатися з багатьох компонентів, що мають однакову функціональність:
транзистори, резистори, конденсатори. Але чи доцільна така аналогія? Мабуть,
коли мова заходить про компонент та про екземпляр компонента, це майже у всіх
викликає замішання. І тут порівняння підпрограми з транзистором вкрай невдале,
тому, що підпрограма є компонентом, а
ось транзистор у мікросхемі є екземпляром компонента. Навряд чи хтось
прагнутиме дублювати специфікацію транзистора, яка репрезентує абстрактне
поняття компонента-транзистора. В свою чергу підпрограма багато разів
ініціюється комп'ютером, який в залежності від виконуваної
підпрограми-специфікації "прикидається" різними екземплярами
компонентів. Насмілюся зробити висновок,
що самі по собі компоненти унікальні в усіх інженерних галузях. Напевно замість
згаданого аргументу слід говорити про те, що компонентів ("класів"
компонентів) у програмному забезпеченні набагато більше ніж у інших творіннях
людини, плюс до всього, кожен екземпляр компоненту може бути у величезній
кількості станів. Можна сказати, що транзистор, у принципі, може знаходитись
взагалі у нескінченній кількості станів, проте вони обумовлені законами фізики,
а стани програмного забезпечення цілком визначають люди. А це вкрай складно.