Код в промисловості: зліпок буланого гірського льодовика
Кожного травня я маю задоволення працювати з новою групою стажерів, які переживають реальність програмування вперше. В основному, це радісний досвід - у моїй компанії безкоштовна їжа, настільний теніс, і немає домашніх завдань. Порівняно з труднощами академії, робота в галузі програмування великих технологічних компаній - це комфортно, дружелюбно та неспанічене.
Однак одне, чого тут немає - це швидкість, незважаючи на те, що можуть заявляти в рекламних вакансіях. Стажери часто здивовані, можливо навіть засмучені, на вигляд невеликого обсягу роботи, яка їм призначена. "Я тут цілих 3 місяці, і ви хочете, щоб я створив лише одну жалетную інформаційну панель?" Вони починають планувати, як вони засвідчать команді свою відданість, - як вони, можливо, завершать весь проєкт за пару тижнів і які бічні проекти вони впритул реалізують у вільний час. Але через 3 місяці вони поспішають, щоб вибити мінімальний життєздатний продукт.
Це не їх вина. Курси комп'ютерних наук просять студентів реалізувати структури даних, вирішувачі головоломок і навіть цілі веб-додатки за кілька днів. Найкращі студенти беруть участь у хакатонах і відходять, почуваючись як програмні боги, одаровані здатністю створювати прототипи готові для інвестування за одну ніч, наповнену кофеїном. Якби вони могли застосувати такий же темп програмування на повну зайнятість, вони повинні були б переміщати гори вже навіть в один момент.
То чому вони цього не можуть? Легко винести на корпоративну бюрократію та накладні витрати, властиві великим командам: планування спринтів, загальні наради тощо. Це, безумовно, грає свою роль, але це не вся історія. Більша перешкода полягає в тому, що молоді студенти комп'ютерних наук, що мають зоряні очі, часто мислять про код таким чином:
На щастя, як ми всі знаємо, під поверхнею айсберга дійсно немає багато
Це не зовсім справедливо - стажери розумні. Вони знають, що програмування в промисловості трохи відрізняється від програмування в академії.
Вони готові витратити трохи більше часу на коментування свого коду, його тестування та перевірку. Проте вони не усвідомлюють, наскільки глибокий цей айсберг.
Важливо зазначити, що все, що знаходиться під поверхнею, все ще має відношення до коду. Це не розрізнення між інженерією та управлінням, а скоріше перегляд проекту з точки зору кодової бази. Тільки невелика частина коду професійної команди фактично становить кінцевий продукт. Більшість прихована для кінцевих користувачів. Проте, як і в айсбергу, прихована частина не є безглуздою. Вона забезпечує плавучість. Вона підтримує видиму частину вгорі.
Без тестів функціонал може поступово розпадатися. Без надійних інструментів для розробників команда може втратити плійку. Без процесів діагностики та вирішення проблем з клієнтами, клієнти можуть звернутися за іншими послугами. Т. д..
Не кожен новий продукт або функція торкається кожної частини айсбергу, але більшість проектів торкаються більшості його частин.
Навіть прості речі можуть почати кристалізуватися у великі проекти. Наприклад, ви плануєте зберігати дані користувачів на сервері? Чудово! Але перед запуском вам потрібно зробити кілька речей:
- 🗄 Переконатися, що дані резервно копіюються, щоб не втратити довіру користувачів
- 🗑 Дозволити користувачам видаляти свої дані в будь-який момент, включаючи з резервних копій
- 📲 Дозволити користувачам завантажувати свої власні дані та метадані відповідно до GDPR
- 📚 Проектувати вашу систему зберігання, що відповідає законам, таким як HIPAA, FISA та політиці локалізації даних ЄС
- 🚂 Мігрувати існуючі дані користувачів при зміні вашої схеми або систем зберігання
- 📊 Моніторити бекенди на відмови, використання квот і порушення безпеки
- 👮Керувати та аудитувати доступ до даних користувачів співробітниками служби підтримки
З цим прикладом на увазі насправді дивно і вражаюче, що будь-який стажер коли-небудь може завершити повний проект всього за одне літо.
Як тут взагалі щось вдається зробити?
Ну, все почалося близько 2.
Як розробники використовують інструменти
6 мільйонів років тому, коли ранні люди відкрили, що можуть використовувати гострі камені, щоб сконцентрувати всю свою силу на невеликій площі. Це не зробило їх сильнішими або розумнішими (принаймні не прямо), але ефект був такий самий: вони раптово змогли виконувати надзвичайні речі. До цього дня ви і я не такі розумні, як ми думаємо - просто ми маємо неймовірні інструменти, що дозволяють нам перетворювати нашу незначну винахідливість на великі речі.
Ваші інструменти розробника можуть не виглядати схоже на гострі камені, але мета та сама. Замість того, щоб застосовувати свою силу до всієї проблеми створення комп'ютерної програми (починаючи з 'вмовляння каменя мислити'), ви можете спрямувати її лише на ті частини, необхідні для вирішення конкретної проблеми.
Насправді, наші великі кодові айсберги можливі лише завдяки неймовірним інструментам, доступним сучасним розробникам. Інструменти, такі як компілятори, операційні системи, бази даних, бібліотеки та API... та системи контролю версій, відстежування помилок, відлагоджувальники та інтегровані середовища розробки... та генератори документації, лінтери, додатки для малювання блок-схем та StackOverflow... та сканери безпеки, статичні аналізатори, скрипти автоматизації та шаблони... та дошки, відеодзвінки, електронні листи та Slack... та клавіатури, миші, монітори та кава.
Так от, виявляється, під поверхнею нашого айсберга існує цілий інший айсберг! У нас є чотиривимірний мета-айсберг!
Візуальні докази того, наскільки виривається цей метафор
Цей новий мета-айсберг все ще складається з коду, просто не коду, специфічного для вашого проекту. Ви можете запустити готовий сервер баз даних або реалізувати вашу інфраструктуру в хмарі. Ви можете писати ваше користувацьке інтерфейс у React, Angular чи Svelte. Ці рішення в основному не впливатимуть на те, як працює ваш додаток, але впливатимуть на швидкість розробки вашої команди та їх можливість реагувати на проблеми.
Bad tools, або неправильні інструменти для завдання, можуть коштувати дорого.
У кінцевому підсумку, якість програмного забезпечення залежить від коду, який бачать користувачі, коду, який користувачі не бачать, і коду, який допомагає вести роботу з усім іншим кодом. Високоякісні додатки та сервіси можливі лише тоді, коли всі ці частини співпрацюють разом.
Чому це важливо
Що спільного у компаній Uber, AirBnb, Tesla, WeWork, Netflix, Betterment, Flexport та Amazon?
Відповідь: Усі вони позиціонують себе як компанії з високотехнологічним програмним забезпеченням, незважаючи на те, що заробляють гроші в традиційних галузях, таких як транспорт, нерухомість, контент та роздрібна торгівля.
Частково це стратегія для привертання венчурного капіталу, але це глибше, ніж тільки це. Усі ці компанії випускають програмне забезпечення та використовують його для відмінності від традиційних конкурентів. Коли ці традиційні конкуренти намагаються випустити власне програмне забезпечення, вони часто розгубляються. Для компанії, орієнтованої на програмне забезпечення, легше перейти в традиційні галузи, ніж традиційній компанії перейти в сферу програмного забезпечення.
Велике програмне забезпечення вимагає так багато міркувань, так багато часу, так багато інвестицій та так багато таланту, що будь-яка компанія, яка не побудована для цього, просто не може підтримати його вагу. Навіть ідея того, що високооплачувані стажувальники проводять літо, навчаючись у ще вищеоплачених інженерів, зробила б більшість традиційних компаній нерішучими.
Замість того, щоб перебудовувати свої основні бізнеси навколо програмного забезпечення, більшість традиційних компаній намагаються залишатися концентрованими на своїх основних компетенціях, одночасно створюючи невеликі програмні організації на боці. Нам просто потрібна програма, нічого складного! Киньте кількох крафтів у підвал і приступимо до цього. Це працює нормально, але результати зазвичай виявляються неохайними, а прогрес повільним.
Тим часом же, компанії, орієнтовані на програмне забезпечення, інвестують у те, щоб привести більше складових код-льодовику до себе вдома. AirBnB підтримує популярну бібліотеку анімації; Netflix побудувала власну CDN з індивідуальним обладнанням
Розуміння програмно-орієнтованого світу
Netflix, Uber та Amazon - це лише декілька з компаній, які активно розвиваються в цифровому просторі. Недавно Uber відкрив вихідний код для "Шестикутної ієрархічної Геопросторової Індексної Системи" (Hexagonal Hierarchical Geospatial Indexing System), серед інших проектів. Амазон, який вже давно перетворився на інтернет-гіганта, продає свою інфраструктуру конкурентам через AWS. Навіть з цією потужною підтримкою, конкурентам буде важко змагатися в світі, де ключовим чинником є програмне забезпечення. Amazon це розуміє, інакше вони б були обережніші у виборі клієнтів для своїх послуг.
Розробка програмного забезпечення вже складна сама по собі, але стає ще складнішою, коли лідери не розуміють, який великий "таємний лід" їм потрібно будувати, щоб підтримати цей процес. Вони будуть вчитися по ходу роботи, але цей процес буде повільним, і можливо, в них не буде достатньо часу успішно навчитися керувати своїми величезними кораблями до того, як настане руйнування. Адже не секрет, що станеться, якщо Титанік зіткнеться з айсбергом.
Перекладено з: Why does Software Engineering take so long?