Якщо ви програміст, не вважайте себе "комп'ютерним науковцем"; комп'ютерні вчені створюють комп'ютери наступного покоління, деякі з яких досі залишаються науковою фантастикою до тих пір, поки не буде отримано правильне поєднання матеріалів, мініатюризації та теорії обчислень. Вони лише початок трубопроводу. Люди, які розробляють програмне забезпечення тут і зараз, є "програмними інженерами"; вони беруть теорії та інструменти, інколи накладаючи практичну теорію та інструменти реального світу зверху, щоб використати потужність у цьому потенціалі цього складного електромагнітного майстра і змусити його робити те, що ми хочемо. Це, в свою чергу, одна спеціалізація галузі "комп'ютерної інженерії", яка приймає теорії комп'ютерних науковців і застосовує їх, апаратне та програмне забезпечення, до електронних рішень реальних кінцевих споживачів.
Це ІМО, де бізнес відповідає теорії. У таких типах випадків стара приказка «ворог кращого є достатньо доброю» може бути легко перевернута, щоб прочитати «ворог достатнього добра є кращим». Вважаючи себе "інженером" замість "вченого", а те, що ви робите паралельно з іншими інженерними дисциплінами, кидає відмінності на полегшення.
Скажімо, до вас приходить клієнт, інженер з будівництва / будівництва, і просить побудувати міст. Міст повинен бути простягнутий 20 футів, підтримувати себе і одна тонна переносити навантаження, він повинен тривати 10 років при регулярному обслуговуванні, і вони хочуть його через місяць за 20 000 доларів. Це ваші обмеження; відповідати мінімумам, не перевищуючи максимумів. Робити це "досить добре", і ви отримуєте зарплату. Для вас було б поганою інженерією побудувати міст Голден-Гейт, що значно перевищує як проектні характеристики, так і бюджет на кілька порядків. Зазвичай ви їсте перевищення витрат і сплачуєте штрафні санкції за перевитрати за час. Було б також поганою технікою для вас побудувати мотузковий мост з вагою 5 дорослих чоловіків, хоча це коштувало лише 1000 доларів у часі та матеріалів; ви не отримуєте хороших відгуків і відгуків клієнтів,
Повернувшись до програмного забезпечення, скажімо, у вас є клієнт, якому потрібна система обробки файлів, побудована для дайвінгу файлів, що надходять і вводять інформацію в систему. Вони хочуть, щоб це було зроблено за тиждень, і він повинен обробляти п'ять файлів на день, приблизно 10 мільйонів MB, тому що це весь трафік, який вони отримують в даний час. Ваші дорогоцінні теорії багато в чому виходять через вікно; ваше завдання - створити продукт, який відповідає цим специфікаціям, за тиждень, оскільки, таким чином, ви також відповідаєте бюджету витрат клієнта (оскільки матеріали, як правило, є краплиною відра для програмного контракту такого розміру). Витратити два тижні, навіть на десятикратний приріст, не є варіантом, але, швидше за все, жодна програма, побудована за день, здатна обробляти лише половину пропускної здатності, з інструкцією виконати дві копії.
Якщо ви думаєте, що це випадкові випадки, ви помиляєтесь; це щоденне середовище більшості власників. Причина - ROI; ця початкова програма не коштує багато коштів і, таким чином, окупить себе дуже швидко. КОЛИ кінцеві користувачі потребують цього, щоб зробити більше або піти швидше, код можна змінити наново та змінити.
Це головна причина поточного стану програмування; припущення, що підтверджується всією історією обчислень, полягає в тому, що програма НІКОЛИ не статична. Його завжди потрібно буде модернізувати, і з часом він буде замінений. Паралельно постійне вдосконалення комп'ютерів, на яких запущені програми, дозволяє зменшити увагу до теоретичної ефективності, а також підвищити увагу до масштабованості та паралелізації (алгоритм, який працює в N-квадратний час, але який може бути паралельний для роботи на N ядрах) здаються лінійними, і часто вартість більшої кількості апаратних засобів дешевша, ніж розробники для розробки більш ефективного рішення).
Крім того, існує дуже простий принцип, що кожен рядок коду розробника - це щось інше, що може піти не так. Чим менше розробник пише, тим менше ймовірність того, що те, що він пише, має проблеми. Це не критика чиєїсь "помилки"; це просте твердження факту. Ви можете знати, як записати MergeSort назад і вперед на 5 мовах, але якщо у вас просто-на-пальчику лише один ідентифікатор в одному рядку коду, весь сортування не працює, і якщо компілятор не впіймав його, це може зайняти вас годин для його налагодження. Контрастуйте це з List.Sort (); це там, це ефективно в загальному випадку, і ось найкраще, воно вже працює.
Отже, багато особливостей сучасних платформ та принципів сучасних методологій дизайну було побудовано з урахуванням цього:
- OOP - вбудовуйте пов'язані дані та логіку в об'єкт, і де б поняття цього об'єкта не було чинним, тому це об'єкт, або більш спеціалізоване виведення.
- Попередньо вбудовані шаблони - хороші 60% або більше коду - це синтаксична суть і основи отримання програми показати щось на екрані. Стандартизувавши та автоматично генерувавши цей код, ви зменшите навантаження розробника вдвічі, що дозволяє підвищити продуктивність.
- Бібліотеки алгоритмів та структур даних - Як і у вищесказаному, ви можете знати, як писати стек, чергу, QuickSort тощо, але навіщо це робити, коли є бібліотека коду, у яку все це вбудовано? Ви б не переписували IIS або Apache, тому що вам потрібен веб-сайт, тож навіщо реалізовувати алгоритм QuickSort або об’єкт червоного чорного дерева, коли доступно кілька чудових реалізацій?
- Вільні інтерфейси - уздовж одних і тих же ліній може бути алгоритм, який фільтрує та сортує записи. Це швидко, але, мабуть, не дуже читабельно; ваш молодший розробник зайняв би день лише для того, щоб зрозуміти це, не кажучи вже про те, щоб зробити хірургічну зміну, необхідну для сортування додаткового поля в об’єкті запису. Натомість бібліотеки на кшталт Linq замінюють багато дуже потворних, часто крихких кодів однією або двома рядками викликів, що настроюються, щоб перетворити список об'єктів у відфільтровані, відсортовані, прогнозовані об'єкти.