Як боротися зі страхом приймати залежності


54

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

Я погоджуюсь, що ми повинні бути надзвичайно обережними при впровадженні (сторонніх) залежностей. Наразі у нас немає сторонніх залежностей, і ми мусимо залишатися на найнижчому рівні API рамки.

Деякі приклади:

  • Ми змушені залишатися на найнижчому рівні API рамки (.NET Standard). Причина цього полягає в тому, що одного дня може з'явитися нова платформа, яка підтримує лише дуже низький рівень API.
  • Ми реалізували власні компоненти для (де) серіалізації JSON і зараз робимо те ж саме для JWT. Це доступно на більш високому рівні API API.
  • Ми реалізували обгортку навколо рамки HTTP стандартної бібліотеки, тому що не хочемо брати залежність від HTTP реалізації стандартної бібліотеки.
  • Весь код для відображення в / з XML пишеться "від руки", знову ж таки з тієї ж причини.

Я відчуваю, що ми забираємо це занадто далеко. Мені цікаво, як з цим боротися, оскільки я думаю, що це сильно впливає на нашу швидкість.


20
Чи є обґрунтування цього (наприклад, зовнішня вимога) чи це робиться з незнання?
Blrfl

6
Проведіть експеримент з деякою невеликою частиною кодової бази, створіть шар ізоляції, який не намагається бути загальною бібліотекою, але визначає абстрактний інтерфейс, який моделює ваші потреби; потім поставте за собою як власну реалізацію, так і сторонні залежності, і порівняйте, як працюють / виконують дві версії. Зважте плюси та мінуси, оцініть, наскільки легко (або наскільки важко) було б обмінятися реалізаціями, а потім прийміть рішення. Коротше кажучи, протестуйте речі відносно низьким рівнем ризику, подивіться, що відбувається, а потім вирішіть.
Філіп Мілованович

73
"В даний час у нас немає сторонніх залежностей" Це завжди змушує мене сміятися, коли люди це стверджують. Звичайно, ви. Ви не написали власний компілятор, IDE, реалізацію будь-яких стандартних бібліотек. Ви не писали жодного з шаблонів об'єктів осколок, якими ви користуєтесь опосередковано (або безпосередньо). Коли ви усвідомлюєте, скільки стороннього програмного забезпечення та бібліотек, від яких ви залежите, ви можете кинути ідею "залежності - це погано", і просто насолоджуватися не винаходити колесо. Я б просто позначити залежність, яку ви маєте, а потім запитати, чому вони прийнятні, але json розбір не є.
UKMonkey

8
Але це означає, що є альтернатива, як ніколи не закінчуються проекти. Але це все ж сприяє програмному забезпеченню та працевлаштуванню :)
маршальське ремесло

5
Ви праві, що витрачаєте зусилля, переосмислюючи товарне програмне забезпечення. Ви помиляєтесь, що це ніде навіть не є близьким до "уникнення всіх залежностей". Команда Excel в Microsoft колись написала власний компілятор C, щоб уникнути залежності від команди C на Microsoft . Ви приймаєте величезні залежності від операційних систем, високоякісних рамок тощо.
Ерік Ліпперт

Відповіді:


94

... Ми змушені залишатися на найнижчому рівні API рамки (.NET Standard) ...

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

.NET Standard не є і ніколи не буде " найнижчим рівнем API рамки ". Самий обмежувальний набір API для .NET досягається створенням портативної бібліотеки класів, націленої на Windows Phone та Silverlight.

Залежно від того, на яку версію .NET Standard ви орієнтовані, ви можете створити дуже багатий набір API, сумісних з .NET Framework, .NET Core , Mono та Xamarin . І є багато сторонніх бібліотек, сумісних з .NET Standard, які працюватимуть на всіх цих платформах.

Тоді є .NET Standard 2.1, який, швидше за все, вийде восени 2019. Він буде підтримуватися .NET Core, Mono та Xamarin. Він не буде підтримуватися жодною версією .NET Framework , принаймні, в осяжному майбутньому, і цілком ймовірно, завжди. Тож у найближчому майбутньому .NET Standard , далеко не " найнижчий рівень API рамки ", витіснить фреймворк та матиме API, які не підтримуються останніми.

Тож будьте дуже обережні, " Причини цього полягають у тому, що в один прекрасний день може з'явитися нова платформа, яка підтримує лише той дуже низький рівень API ", оскільки цілком ймовірно, що нові платформи насправді підтримуватимуть API більш високого рівня, ніж старі рамки.

Тоді випуск сторонніх бібліотек. Наприклад, JSON.NET сумісний із .NET Standard. Будь-яка бібліотека, сумісна з .NET Standard, гарантована - для API - для роботи з усіма .NET-реалізаціями, сумісними з цією версією .NET Standard. Таким чином, ви не досягаєте додаткової сумісності, не використовуючи її та створюючи свою бібліотеку JSON. Ви просто створюєте більше роботи для себе і несете непотрібні витрати на свою компанію.

Так що так, ви, безумовно, забираєте це занадто далеко, на мій погляд.


16
"Ви просто створюєте більше роботи для себе і несете непотрібні витрати на свою компанію". - та зобов'язання з безпеки. Чи перетворюється ваш кодер JSON з переповненням стека, якщо ви надаєте йому рекурсивний об'єкт? Чи правильно обробляє ваш парсер втікачі символів? Чи він відкидає нерозглянуті символи, які слід? Як щодо парних сурогатних персонажів? Чи воно переповнюється, коли JSON кодує число, більше 2 ^ 64? Або це просто крихітна evalобгортка з деякими перевірками на здоровий стан, які легко обійти стороною?
Джон Дворак

4
"Найбільш обмежуючий набір API для .NET досягається створенням портативної бібліотеки класів, націленої на Windows Phone та Silverlight." Я вийду на кінцівку і стверджую, що в цьому підмножині є принаймні деякі API, які не підтримуються всіма можливими реалізаціями, які коли-небудь існували (і вже ніхто не піклується про WinPhone або Silvernight, навіть не про Microsoft). Використання .NetStandard 2.0 в якості цілі для сучасних рамок виглядає дуже розсудливим і не особливо обмежуючим. Оновлення до 2.1 - це вже інша історія, але немає ознак того, що вони будуть робити це.
Voo

Окрім майбутніх платформ, які, ймовірно, підтримують більше, ніж менше, розробка для всіх речей, що можуть статися, є надзвичайно дорогими (і ви все одно щось пропустите). Замість розробки не винаходячи колесо буде заощадити більше часу , ніж адаптація до деякої нової ситуації , коли це необхідно буде коштувати.
Джаспер

51

Ми змушені залишатися на найнижчому рівні API рамки (.net стандарт). Причина цього полягає в тому, що одного дня може з'явитися нова платформа, яка підтримує лише дуже низький рівень API.

Міркування тут досить зворотні. Старіші, нижчі рівні API швидше застаріють і не підтримуються, ніж нові. Хоча я погоджуюся, що залишатись комфортним шляхом за «передовою межею» доцільно забезпечити розумний рівень сумісності у згадуваному вами сценарії, ніколи не рухаючись вперед, не виходить за межі крайніх.

Ми реалізували власні компоненти для (де) серіалізації JSON і зараз робимо те ж саме для JWT. Це доступно у більш високому рівні API API. Ми реалізували обгортку навколо рамки HTTP стандартної бібліотеки, оскільки не хочемо брати залежність від імпементації HTTP стандартної бібліотеки. Весь код для відображення в / з XML пишеться "від руки", знову ж таки з тієї ж причини.

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

Якщо трапляється найгірше, і проект проходить, або він перестає підтримуватися, то ви все одно отримаєте код для створення бібліотеки, і ви призначите когось для його обслуговування. І ви, ймовірно, все ще в набагато кращому становищі, ніж якщо б ви провалили свій власний, адже насправді у вас буде більш перевірений, чистіший, більш доцільний код, про який слід доглядати.

За набагато більш імовірним сценарієм, що проект підтримується, і помилки чи подробиці знайдені в цих бібліотеках, ви будете знати про них, щоб зробити щось із цим - наприклад, безкоштовною модернізацією до нової версії або виправленням своєї версії з виправленням, якщо ви взяли копію.


3
І навіть якщо ви не можете, перехід на іншу бібліотеку все-таки простіше і краще, ніж прокат власної.
Гонки легкості з Монікою

5
Відмінний момент, що речі нижчого рівня вмирають швидше. У цьому вся суть встановлення абстракцій.
Гонки легкості з Монікою

"Старіші, нижчі рівні API швидше застаріють і не підтримуються, ніж нові". Так? Наскільки я знаю, NetSTandards побудовані один на одного (маючи на увазі 2.0 - 1.3 + X). Також Стандарти - це просто те, що .. стандарти, а не імплементація. Немає сенсу говорити про те, що стандарт стає непідтримуваним, в більшості випадків конкретні реалізації цього стандарту можуть бути в майбутньому (але дивіться попередній пункт, чому це теж не викликає занепокоєння). Якщо вашій бібліотеці нічого не потрібно за межами NetStandard 1.3, немає абсолютно ніяких причин змінювати її на 2.0
Voo

11

В цілому ці речі корисні для ваших клієнтів. Навіть популярна бібліотека з відкритим кодом з певних причин може бути неможливою для їх використання.

Наприклад, вони, можливо, підписали контракт зі своїми клієнтами, обіцяючи не використовувати продукти з відкритим кодом.

Однак, як ви зазначаєте, ці особливості не обійдуться.

  • Час на ринок
  • Розмір упаковки
  • Продуктивність

Я б підняв ці недоліки і поговорив з клієнтами, щоб дізнатися, чи справді вони потребують рівнів сумісності, які ви пропонуєте.

Якщо, наприклад, усі клієнти вже використовують Json.NET, то використання його у вашому продукті, а не власний код десеріалізації, зменшує його розмір та покращує його.

Якщо ви представите другу версію свого продукту, таку, яка використовує сторонні бібліотеки, а також сумісну, ви можете судити про використання обох. Чи будуть клієнти використовувати треті сторони, щоб отримати останні функції трохи раніше, або дотримуватися "сумісної" версії?


11
Так, я, очевидно, згоден, і я додав би "безпеку" до вашого списку. Існує певний потенціал, що ви можете ввести вразливість у свій код, особливо з такими речами, як JSON / JWT, порівняно з добре перевіреними рамками та, безумовно, стандартною бібліотекою.
Бертус

Так, складно скласти список, оскільки, очевидно, такі речі, як безпека та ефективність, можуть йти обома шляхами. Але існує очевидний конфлікт інтересів між елементами оздоблення та страхуванням внутрішніх компонентів, які є повністю представленими / зрозумілими
Ewan

12
"вони, можливо, підписали контракт зі своїми клієнтами, обіцяючи не використовувати продукти з відкритим кодом", - вони використовують .NET Standard, який є відкритим кодом. Дуже погано підписувати цей контракт, коли ви базуєте весь свій продукт на основі відкритого коду.
Стівен

І досі люди це роблять
Еван

7

Коротка відповідь - слід почати вводити сторонні залежності. Під час чергової зустрічі з розмовою скажіть всім, що наступний тиждень на роботі буде найвеселішим, що їм було за роки - вони замінять компоненти JSON та XML на відкриті джерела, стандартні рішення бібліотек. Скажіть усім, що у них є три дні для заміни компонента JSON. Святкуйте після того, як це буде зроблено. Влаштувати вечірку. Це варто відзначити.


2
Це може бути язик у щоках, але це нереально. Я приєднався до компанії, де «старший» розробник (старший за освітою) доручив молодшому розробнику написати бібліотеку державних машин. У ньому було п’ять місяців розробника, і він все ще був баггі, тому я його видобув і замінив рішенням під ключ за кілька днів.
Ні U

0

В основному все зводиться до зусиль проти ризику.

Додавши додаткову залежність або оновивши рамки або використовуючи API більш високого рівня, ви знижуєте зусилля, але ви ризикуєте. Тому я б запропонував зробити аналіз SWOT .

  • Сильні сторони: Менше зусиль, тому що вам не доведеться кодувати це самостійно.
  • Слабкі сторони: Це не так, як створено на замовлення для ваших особливих потреб, як рішення, виготовлене вручну.
  • Можливості: Час на ринок менше. Ви можете отримати прибуток від зовнішніх розробок.
  • Загрози: Ви можете засмутити клієнтів додатковими залежностями.

Як ви бачите, додаткові зусилля, спрямовані на розробку рішення, виготовленого вручну, - це інвестиція у зменшення загроз. Тепер ви можете прийняти стратегічне рішення.


-2

Розділіть бібліотеки компонентів на набір "Основні", які не мають залежностей (по суті, що ви робите зараз) та "Загальний" набір, які залежать від вашої "Основної" та сторонніх бібліотек.

Таким чином, якщо хтось хоче лише функціонал "Core", він може його мати.

Якщо хтось хоче функціонал "Спільний", він може його мати.

І ви можете керувати тим, що є "Core" та "Common". Ви можете швидше додати функціональність до "Загального" та перемістити його у власну "Основну" реалізацію, якщо / коли має сенс надати власну реалізацію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.