Уявіть собі професію, де технології поєднуються із творчістю, а вирішення проблем стає щоденним викликом. Саме так виглядає робота Software Engineer — інженера-програміста. Ці фахівці створюють застосунки, сервіси та системи, якими ми користуємося щодня: від мобільних банків до соціальних мереж та ігор. У цій статті розберемося, чим займається Software Engineer, які навички потрібні для успішної кар'єри у цій сфері та які перспективи відкриває ця професія.

Чим займається Software Engineer?

Software Engineer (інженер-програміст) — це кваліфікований спеціаліст, відповідальний за проєктування, розробку, тестування та супровід програмних продуктів. Він поєднує знання прикладного програмування та інженерного підходу: архітектуру, масштабованість, надійність та якість рішень. На відміну від звичайного програміста, Software Engineer охоплює ширше коло завдань — від системного аналізу до розгортання та експлуатації. Інакше кажучи, вміння програмувати автоматично не робить із людини інженера-програміста. Навчитися кодити може будь-хто, і це набагато простіше, ніж здається. Кожен може створити просту програму для власного використання, але це не дає гарантій, що ця програма підійде іншим. Мій улюблений приклад такий: багато хто з нас співає в душі, але, на жаль, далеко не завжди це виконання варте професійної сцени. Зрозуміло, що за високими музичними враженнями ви, швидше за все, звернетеся до профі. Так само прості програми дуже відрізняються від програм, спроєктованих інженерами. Процес програмної інженерії — це проєктування, написання, тестування та курування комп'ютерної програми з метою вирішити завдання багатьох користувачів. Йдеться про створення надійних та безпечних рішень, які витримають перевірку часом і працюватимуть для деяких, можливо заздалегідь невідомих, завдань, окрім очевидних.
Кто такой Software Engineer. Программная инженерия VS

Основні обов'язки інженера-програміста

Робота Software Engineer охоплює повний цикл створення програмного забезпечення — від ідеї до підтримки готового продукту. Розгляньмо його основні обов'язки.

Аналіз вимог

Унікальною здатністю талановитого інженера ПЗ є не знання, як написати код, а розуміння того, що саме застосунок має робити на виході і як цього досягти. Інженеру необхідно за неповних, а, можливо, і неоднозначних вимог замовника до ПЗ правильно їх оцінити і «зрозуміти». Тому перед початком розробки інженер-програміст бере участь в обговоренні проєкту із замовником, аналітиком чи продакт-менеджером. Його завдання — зрозуміти, які функції потрібні користувачам і які обмеження існують (терміни, бюджет, сумісність з іншими системами). На цьому етапі важливо виявити «вузькі місця» заздалегідь, щоб уникнути дорогих переробок у майбутньому. Програмні інженери не вважають своєю головною метою написання програми як такої. Вони думають у масштабах забезпечення потреб та вирішення проблем. Це важливо, оскільки не кожна проблема вимагає створення програмного рішення. З деякими з них можна розібратися за допомогою вже наявних програм. Виникнення деяких проблем іноді можна передбачити заздалегідь, а за допомогою грамотного проєктування програм – уникнути у майбутньому. Складні проблеми часто вимагають написання багатьох програм. Існують завдання, яким потрібні паралельно працюючі програми, інші потребують послідовного виконання кількох програм. Низку проблем можна вирішити, просто навчивши користувачів. Перед тим, як розпочати створення програми, інженер ПЗ ставить собі низку запитань:
  • Які завдання я маю вирішити?
  • Що ще, крім написання коду, можна зробити, щоб їх вирішити?
  • Що я можу зробити для спрощення вирішення цих завдань за допомогою застосунку?
Кто такой Software Engineer. Программная инженерия VS

Проєктування архітектури

Після уточнення вимог фахівець продумує структуру майбутнього застосунку: як взаємодіятимуть модулі, де зберігатимуться дані, як забезпечити масштабованість та безпеку. Грамотне проєктування заощаджує час команді та знижує ризики при доробках. Один із найважливіших моментів розробки ПЗ — проєктування програми таким чином, щоб надалі її було легко підтримувати та модифікувати (привіт, ООП!). Сьогодні практично все програмне забезпечення модифікується, часто цей процес відбувається навіть без участі користувача або не вимагає від нього нічого, крім «прийшло оновлення вашої програми, натисніть ОК або Відкласти». Зрозуміло, що користувачі мають право вимагати від застосунків нових функцій (особливо якщо йдеться про стале корпоративне програмне забезпечення, яке пишуть на Java, або про онлайн-ігри, в які можна грати роками). Сам собою шматок коду навряд чи можна назвати корисним. Корисні функції ПЗ починаються там, де розрізнені шматки застосунків взаємодіють між собою, обмінюються даними та працюють спільно, виконуючи завдання представлення даних та інтерфейсів користувачам. Програми потрібно проєктувати з урахуванням цих моментів! Які повідомлення вони беруть? Які події моніторять? Як відбувається автентифікація та авторизація?
Кто такой Software Engineer. Программная инженерия VS

Написання та оптимізація коду

Це основна частина роботи. Інженер пише код обраною мовою програмування (Python, Java, C#, JavaScript та ін.), застосовуючи найкращі практики — читабельність, повторне використання коду, модульність. Оптимізація не менш важлива: код має працювати швидко та ефективно, особливо у високонавантажених системах. Хороші програми зрозумілі та читабельні. Їх легко розширювати, вони відмінно працюють з іншими програмами, і робота з ними не стане вашим нічним кошмаром. Якість коду не є предметом переговорів. Вона має бути високою, і все тут. Неприпустимі відмовки на кшталт поганого настрою кодера або надто стислих термінів виконання. Інша не менш важлива ознака хорошої програми — зрозумілість коду, а не кількість тестів, що пройшов застосунок, і навіть не хороше покриття тестами. Здавалося б, прості запитання: «Чи може хтось, окрім мене, розібратися з моїм кодом?», «Чи я зможу, написавши сьогодні цей код, зрозуміти його за кілька тижнів?». Читабельність коду набагато важливіша, ніж прийнято вважати. На жаль, неможливо визначити точні показники або параметри ясності коду. Почасти допоможуть запам'ятовування загальноприйнятих норм, хороших моделей та методів розробки. Але зазвичай цього замало. У справжніх професіоналів із часом і досвідом розвивається, якщо можна так сказати, «відчуття ясності», щось схоже на інтуїцію. Тут добре підійде метафора з писанням: знання великої кількості слів не допоможе вам написати короткий і ясний за змістом текст. Можливість легко та швидко виправляти баги — ключова ознака гарного програмного забезпечення. Помилки в програмі повинні надсилати чіткі повідомлення та централізовано реєструватися для відстеження. Коли надходить повідомлення про нову помилку, той, хто її усуватиме, повинен мати можливість для налагодження. Йому потрібно легко підключатися до системи, отримувати доступ до інформації про виконання у будь-який час, а також мати можливість легко перевіряти працездатність будь-якої частини системи.
Кто такой Software Engineer. Программная инженерия VS

Тестування та налагодження

Коли інженери-програмісти розробляють програми, вони роблять все від себе залежне, щоб ті працювали на комп'ютерах різної архітектури та з різними ОС. Важливо, щоб програмне забезпечення працювало при різних дозволах і орієнтаціях екрана, а ще щоб воно не «їло» більше пам'яті і процесорних потужностей, ніж потрібно. Якщо мова йде про веб-застосунки, то вони повинні працювати у всіх основних браузерах. Створюючи декстопну програму, потрібно переконатися, що вона запускається і коректно працює і на Mac, і на Windows, і на Linux. Ну а якщо програма залежить від даних, то має працювати навіть у разі повільного з'єднання з даними або його відсутності. Щоб написати частину програми, інженери продумують різні варіанти сценарію, а також планують їх тестування. Все починається з вибору ідеального варіанта, коли все працює без помилок. Потім вони документують усілякі можливі проблеми та заносять їх у план тестування. Деякі інженери починають з написання коду, який вони називають тестовим прикладом та в якому імітуються сценарії всіх можливих проблем та помилок. А потім уже пишеться програма, яка зможе працювати за будь-якого з розглянутих варіантів. Отже, Software Engineer пише юніт-тести, проводить інтеграційні перевірки, запускає автоматизовані сценарії. Якщо тести знаходять збої, програміст виконує налагодження – шукає причини помилки та усуває їх. Що якіснішим є тестування, то менше проблем у кінцевого користувача.

Підтримка та розвиток продукту

Після релізу робота не закінчується. Інженер стежить за стабільністю програми, виправляє баги, випускає оновлення, адаптує продукт до нових технологій та вимог ринку. Наприклад, оновлює бібліотеки, оптимізує роботу під нові пристрої чи додає функціонал на запит користувачів.
Кто такой Software Engineer. Программная инженерия VS

Орієнтація на зручність користувача

Хороший програміст веде розробку з думкою про досвід користувача (User Experience (UX)). Ось кілька прикладів, просто для того, щоб ви відчули, що це за напрямок такий:
  • Коли ведеться розробка форм для введення даних, як-от e-mail, хороша програма повинна враховувати особливості обробки адрес електронної пошти. Відповідно до стандарту RFC 5321, локальна частина адреси (до символу @) може бути чутливою до регістру, тобто "User@domain.com" та "user@domain.com" теоретично можуть бути різними адресами. Однак на практиці багато популярних поштових сервісів (наприклад, Gmail, Outlook) ігнорують регістр для зручності користувачів. Тому програма може перетворювати введену адресу на нижній регістр, але тільки якщо це відповідає вимогам цільової системи або якщо відомо, що поштовий сервер нечутливий до регістру. Важливо також перевіряти формат адреси на ранніх етапах введення, щоб попередити користувача про можливі помилки, такі як пропущений знак @ або неправильний порядок символів (наприклад, gmail.ocm замість gmail.com).

  • Коли користувач перенаправляється для виконання якоїсь дії, хороша програма повинна запам'ятати його поточне положення і повернути його після того, як він закінчить. Хороша програма також повинна запам'ятати вже передані користувачем дані, важливі для подальшої взаємодії з ним.

    Припустимо, ви шукаєте авіаперельоти як Гість Expedia. Пізніше ви вирішуєте створити обліковий запис. Програма повинна зберегти всі ваші попередні пошукові запити в новому обліковому записі, і ви повинні мати доступ до них з інших пристроїв.

  • Хороша програма розробляється з думкою про сценарії поведінки користувача. Не потрібно просто додавати нові можливості за принципом «щоб було», поставте себе на місце користувача. Одного разу я бронював квитки на літак та забув вказати мій номер регулярного пасажира. Після отримання підтвердження я вирішив піти на сайт авіакомпанії та додати його, щоб отримати знижку. Щоб зрозуміти, як це зробити, я порався на сайті з добрих 10 хвилин. Програма була настільки неочевидною, що я просто безцільно лазив по різних сторінках сайту, щоб знайти те, що мені потрібно. Пізніше я виявив, що вже кілька разів потрапляв на потрібну сторінку, але навіть не зрозумів цього, тому що потрібне поле загубилося серед інших подібних полів величезної форми.

    Виявилося, що для того, щоб відредагувати інформацію про поїздку, мені потрібно було прокрутити близько двадцяти рядків форми, ввести номер картки лояльності та номер телефону, без якого форму не можна надіслати на перевірку. Це приклад програми, яка розроблялася без думки про те, наскільки користувачеві буде з нею зручно.

Надійність, захищеність та безпека

На мою думку, найважливіша відмінність професійного розробника програмного забезпечення від аматора — врахування таких параметрів, як надійність, захищеність та безпека застосунку під час його створення.
Справжній професіонал знає, що він несе відповідальність за безпеку та захищеність свого рішення.
Частини програми повинні бути стійкими до некоректного введення, некоректних станів та неправильної взаємодії. Це дійсно дуже важко забезпечити, і це основна причина, через яку ми чуємо історії про те, що люди гинуть через помилки в програмному забезпеченні. Користувачі вводили, вводять і вводитимуть некоректні дані в програму. Це потрібно прийняти як факт. Причому деякі робитимуть це спеціально, з метою зламати застосунок і дістатися ресурсів, доступних йому. Випадки, що стосуються інформаційної безпеки, пов'язані не тільки з неправильним і шкідливим введенням, але також і з даними, що правильно вводяться. Якщо користувач забув пароль, скільки разів він може спробувати його ввести? Чи заблокуєте ви його після цього? А що, як хтось інший намагається заблокувати його обліковий запис? Чи може користувач надсилати свої облікові дані через незашифрований канал передачі даних? Що, якщо запит на вхід надійшов із незвичного місця? Що ви робитимете, якщо спроба входу схожа на автоматичну? Що ви зробили для того, аби захистити ваших користувачів від міжсайтового скриптингу та міжсайтової підробки запитів чи банального фішингу? Чи є у вас резервна стратегія на випадок DDoS-атаки ваших серверів? Ці запитання вказують лише на деякі проблеми, які необхідно враховувати. Захищена програма не зберігає важливу інформацію у текстовому вигляді. Вона захищає її за допомогою складного одностороннього шифру (легко зашифрувати, але неможливо розшифрувати без ключа). Це резервні заходи на випадок, якщо програму таки зламають. Хакери виявлять зашифровані дані, які їм не потрібні. Несподівані проблеми виникають навіть у найкращих програмах. Програміста, який не готовий до їх виникнення, навряд чи можна назвати професіоналом. Поки він не чекає на несподівану поведінку, він не інженер. Він — «автор небезпечних програм».
Кто такой Software Engineer. Программная инженерия VS

Гнучкі навички Software Engineer

Технічна експертиза — лише половина успіху інженера-програміста. В умовах командної розробки та постійно змінних вимог замовників дедалі більшого значення набувають гнучкі навички (soft skills). Саме вони дозволяють фахівцю бути ефективним у реальній роботі, а не лише у теорії.

Комунікація

Інженеру-програмісту необхідно вміти доносити свої ідеї до різних аудиторій: розробників, менеджерів, дизайнерів та клієнтів. Від ясності формулювань залежить, як швидко команда прийде до спільного рішення. Наприклад, незрозуміле пояснення може призвести до помилок у постановці завдання, а грамотне — заощадити години і навіть дні роботи.

Критичне мислення

Інженер-програміст постійно стикається з вибором: використовувати готове рішення чи писати власне, оптимізувати продуктивність чи швидше випустити продукт. Критичне мислення допомагає оцінити всі «за» і «проти» і вибрати найкращий варіант. Це особливо важливо, коли ресурси проєкту обмежені.

Робота в команді

Великі проєкти вимагають десятків фахівців, і вміння взаємодіяти є обов'язковою навичкою. Це не лише повага до чужого коду та ідей, а й готовність допомагати колегам, брати участь у код-рев'ю, ділитися знаннями.

Тайм-менеджмент

Інженеру-програмісту важливо вміти оцінювати трудомісткість завдань, розставляти пріоритети та керувати своїм часом. Без цього навіть талановитий фахівець може стати перевантаженим та неефективним.

Вирішення проблем

Інженер-програміст у більшості випадків може швидко вирішити проблему. Якщо ви думаєте, що при наймі на роботу «дороговартісного» досвідченого програміста ви збільшите витрати, подумайте знову. Що досвідченішим виявиться найнятий програміст, то швидше він зможе створити просте, акуратне, надійне та легке в експлуатації рішення. У довгостроковій перспективі це однозначно зменшить витрати на розробку програмного забезпечення. Також необхідно враховувати витрати на виконання програми. Будь-яка програма використовує обчислювальні ресурси, а вони не безкоштовні.
Завдання Software Engineer полягає у написанні ефективного коду, який не використовує обчислювальні ресурси без потреби.
Наприклад, кешування даних, що часто використовується, — одна з можливих стратегій, що застосовуються для отримання бажаного результату. Але це — лише один із, напевно, сотень інструментів та рішень, які можуть зробити програму швидшою та ефективнішою. Програміст-початківець може створити дешеве рішення, але використання такого рішення, зрештою, буде коштувати вам і вашим клієнтам набагато дорожче, ніж у випадку, якби ви працювали з досвідченим розробником, який створив насамперед ефективне рішення.

Професійні навички інженера-програміста

Професійні навички інженера-програміста складаються зі знання мов програмування, володіння фреймворками та впевненого використання інструментів для повного циклу розробки.

Мови програмування

Чотири мови — Python, Java, C++ та C# — займають особливе місце у світі розробки, оскільки кожна з них вирішує різні завдання та користується попитом у своїй сферіі. Python цінується за простоту та універсальність: він підходить як для початківців, так і для професіоналів, які працюють з даними, веб-застосунками та штучним інтелектом. Java забезпечує стабільність та масштабованість великих корпоративних систем, а також є основою для розробки під Android. C++ досі незамінний там, де потрібна висока продуктивність та точний контроль над ресурсами, наприклад, в іграх, вбудованих системах або застосунках для обробки графіки. C# дуже схожий на Java, але тісніше пов'язаний з екосистемою Microsoft. Він використовується для розробки застосунків на платформі .NET і особливо затребуваний в ігровій індустрії завдяки движку Unity. Таким чином, ці мови не конкурують безпосередньо, а радше доповнюють одна одну: Python відкриває шлях до швидкої розробки та роботи з даними, Java та C# формують основу корпоративних рішень, а C++ відповідає за завдання, де важлива максимальна оптимізація. Знання кількох мов дозволяє інженеру-програмісту вільно орієнтуватися в різних напрямках та бути гнучким на ринку праці.

Фреймворки та інструменти

Окрім мов, інженер-програміст повинен вміти працювати з інструментами, що забезпечують повний цикл розробки.
  • Системи контролю версій, такі як Git, разом із платформами GitHub та GitLab дозволяють проводити командну роботу та відстежувати зміни.
  • Інструменти розробки, такі як PyCharm, IntelliJ IDEA, Visual Studio або Eclipse, прискорюють процес написання та налагодження коду.
  • Для управління залежностями та збирання проєктів використовують Maven та Gradle у світі Java, CMake в C++, а також pip та Poetry в Python.
  • Важливою частиною роботи є тестування: тут використовуються JUnit для Java, pytest для Python та Google Test для C++.
  • Сучасні практики DevOps вимагають від інженера вміння працювати з Docker та Kubernetes, а також використовувати системи CI/CD, такі як Jenkins, GitHub Actions або GitLab CI, для автоматизації розгортання.
Справжня цінність інженера-програміста полягає в умінні вибрати оптимальний інструмент для конкретного завдання. Саме поєднання технічної бази та гнучкості робить інженера-програміста затребуваним.
Краща якість та сучасні інструменти допоможуть вам стати найкращим інженером-програмістом. Знаходьте їх, використовуйте, цінуйте, і, якщо можете, — покращуйте їх. І не зациклюйтеся на одному й тому ж: хто знає, можливо, з новим інструментом ви витратите час на встановлення та навчання один раз, а потім вирішуватимете завдання в рази швидше?

Найпопулярніші мови програмування, які необхідно знати інженерам-програмістам

Сучасний інженер-програміст рідко обмежується знанням лише однієї мови. Що ширший його інструментарій, то гнучкіший він у виборі рішень і то вища цінність для роботодавця. Серед найбільш затребуваних мов виділяються C#, Python, Java та JavaScript.

C#

C# — це потужна і зручна мова, створена Microsoft. Вона широко застосовується в розробці корпоративних застосунків, веб-сервісів на платформі .NET, а також в ігровій індустрії — саме на C# пишеться більшість ігор на рушії Unity. Мова відрізняється строгою структурою та багатим набором інструментів, що робить її популярним вибором серед компаній, що працюють в екосистемі Microsoft. Кто такой Software Engineer - 7 Якщо ви хочете розробляти надійні та масштабовані програми та увійти в Microsoft-екосистему, C# — відмінний вибір. А пройти шлях від першої програми до enterprise-розробки, причому швидко, максимально практично та ефективно, можна на курсі C# від JavaRush.

Python

Python іноді називають найуніверсальнішою мовою програмування. Простота синтаксису робить її доступною для новачків, а велика бібліотека модулів відкриває великі можливості: від веб-розробки та автоматизації до аналізу даних та штучного інтелекту. Кто такой Software Engineer - 8 Якщо ви хочете швидкий старт в IT, вивчити Python може бути відмінним вибором. А з нашим Python курсом від JavaRush навчання буде інтерактивним та максимально наближеним до реальної роботи розробника.

Java

Java залишається ключовою мовою для розробки корпоративних систем та програм. Її стабільність, кросплатформеність та багата екосистема зробили мову стандартом у банківській сфері, e-commerce та мобільній розробці. На Java пишуть Android-програми, а також складні системи, розраховані на мільйони користувачів. Кто такой Software Engineer - 9 Ефективний спосіб опанувати розробку Java — навчання на Java курсі від JavaRush. У ньому ви знайдете все, від основ до технологій, які потрібні для сильного резюме, і створите перші 10 проєктів для свого портфоліо.

JavaScript

JavaScript — основна мова фронтенд-розробки. Саме вона дозволяє веб-сайтам бути інтерактивними та «живими». З часом JavaScript вийшов за межі браузера: за допомогою Node.js його використовують і для серверної розробки, що робить цю мову універсальним інструментом. Кто такой Software Engineer - 10 Вивчити JavaScript та стати повноцінним фронтенд-розробником можна, пройшовши JavaScript курс на JavaRush. Це найкоротший і водночас ефективний шлях до опанування веб-розробки та створення власних проєктів.

Типовий день Software Engineer

Робочий день інженера-програміста зазвичай будується навколо розробки та підтримки програмного забезпечення, але його завдання залежать від компанії, проєкту та ролі у команді. Ранок часто починається з короткої планерки (daily meeting), де команда обговорює прогрес та найближчі цілі. Потім програміст поринає в основну роботу: пише новий код, виправляє помилки, оптимізує наявні модулі. У процесі він взаємодіє з колегами — менеджерами, дизайнерами, тестувальниками, іншими розробниками, — щоб узгодити деталі та спільно вирішити проблеми, що виникають. Крім написання коду, значну частину часу займають рев'ю чужих рішень, робота з документацією та тестування. Інженеру-програмісту важливо не лише створювати нові функції, а й стежити за стабільністю продукту, а також брати участь в обговоренні архітектури та плануванні майбутніх релізів. Такий баланс рутинних завдань та творчих рішень робить роботу Software Engineer різноманітною, а також такою, що потребує постійного навчання та адаптації.
Кто такой Software Engineer. Программная инженерия VS

Скільки заробляють інженери-програмісти?

Рівень зарплати програміста залежить від багатьох чинників: країни та міста, сфери компанії, використовуваних технологій і, звичайно, досвіду фахівця. У середньому інженер-початківець може розраховувати на стартову оплату, порівнянну або вищу від середнього доходу в IT-сфері. Зі зростанням досвіду та переходом на позиції Middle та Senior зарплата збільшується, часом у кілька разів. У США середній дохід фахівців становить $125–150 тис. на рік, а з бонусами та акціями сума може бути ще вищою. Досвідчені інженери в Google, Apple та Microsoft отримують ще більше, особливо у проєктах, пов'язаних зі штучним інтелектом. У Західній Європі середні зарплати інженерів-розробників становлять €70-80 тис. на рік. Отже, попри регіональні відмінності, у всьому світі професія Software Engineer залишається однією з найперспективніших і найбільш фінансово привабливих.
Кто такой Software Engineer. Программная инженерия VS

Кар'єрні можливості Software Engineer

Кар'єра інженера-програміста не обмежується лише кодуванням. Зі зростанням досвіду відкриваються різні шляхи розвитку. Один із них — заглиблення в технічну експертизу та перехід у ролі Senior Engineer, Tech Lead або архітектора, де фахівець відповідає за архітектурні рішення та стратегію розвитку продукту. Інший шлях пов'язаний із менеджментом: інженери можуть ставати тимлідами, менеджерами проєктів чи керівниками підрозділів. Крім того, програміст може вибрати спеціалізацію — наприклад, стати експертом у машинному навчанні, розробці мобільних застосунків, кібербезпеці чи системній інженерії. Багато інженерів згодом переходять у продуктові ролі, поєднуючи технічне знання з бізнес-баченням. Гнучкість професії дозволяє не тільки розвиватися в межах компанії, а й запускати власні проєкти, стартапи чи працювати на фрілансі. Окремий напрямок, який сьогодні стрімко розвивається, — це штучний інтелект та суміжні технології. Тут інженери можуть будувати кар'єру в галузях машинного навчання, обробки природної мови, комп'ютерного зору та генеративних моделей. Фахівці, які працюють зі ШІ, затребувані в різних індустріях — від медицини та фінансів до ігрової індустрії та креативного контенту, а зарплати в цьому сегменті найчастіше вищі за середні по ринку. Кожен день приносить розробникам нові завдання, нові проблеми, тому й потрібна програмна інженерія. Головне завдання цієї професії — створювати ПЗ так, щоб звичайній людині не довелося розбиратися з ним багато років. Щоб для взаємодії з програмами не було потреби у довгому навчанні. І ще — програмні інженери весь час думають над створенням досконаліших інструментів, здатних вирішувати складніші відомі проблеми, і роблять все можливе, щоб нові проблеми з'являлися якомога рідше.