Виправлення програмного забезпечення з відкритим кодом під час оновлення - це не варіант?


13

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

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

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

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

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

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


1
Будь ласка, повідомте мене, якщо ви вважаєте, що питання не є конструктивним чи його можна вдосконалити.
maple_shaft

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

Відповіді:


12

Якщо ви не можете скористатися більш пізньою версією, яка не має проблеми, з якою ви стикаєтесь, єдиними варіантами є один із них

  • жити з проблемою і знайти вирішення
  • роздрібніть бібліотеку та виправте її у вашій приватній версії (що б ви ефективно робили)
  • киньте в рушник і скажіть своїм менеджерам, що проблема непереборна (що було б неправдою, оскільки у вас відкриті два інші варіанти).


Я був у вашому становищі, варіант 2 (зробіть власну виделку) часто є найприємнішим рішенням. Це життя при роботі з бібліотеками з відкритим кодом, особливо з тими, що швидко розвиваються і мають шкідливу звичку порушувати зворотну сумісність між випусками (що, на мій досвід, є найпоширенішою причиною того, щоб робити такі речі).
Більш ніж кілька бібліотек OSS привели мене та команди, до яких я брав участь, щоб розпоряджатись обгортками навколо будь-яких та всіх них та отримувати доступ до функцій сторонніх бібліотек виключно через ці обгортки. Таким чином, якщо нам потрібно замінити сторонню бібліотеку на таку іншу версію, вона порушила б наш код, зміни принаймні значною мірою обмежуються саме цією обгорткою. Це не найприємніше (додає код, може додати складності та економічної ефективності), але іноді це єдиний спосіб зберегти розумність.


Цікаво! Я ніколи не розглядав можливість загортання бібліотеки, щоб допомогти роз’єднати. Дякуємо за ваш внесок!
maple_shaft

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

1
@Blrfl так, тому це не крок, який слід робити легковажно. Але принаймні в одному випадку ми мали бібліотеку третьої сторони (OSS), яка змінювала всі свої пакунки та назви класів між двома незначними випусками, і не вимагала жодного застосування, але прийняти їх, тому рефакторинг довелося все-таки зробити. Таким чином ми закінчили майбутні докази, а також вирішили проблему, яка спричинила вимогу використовувати нову версію.
jwenting

@jwenting: Абсолютно згоден. Я роблю те ж саме з Boost, оскільки, хоча деякі їхні реалізації хороші, інтерфейси можуть бути тупими. Це, і вони, як правило, часто змінюють речі.
Blrfl

2
Зауважте, що деякі дистрибутиви Linux ефективно підтримують власні „вилки” програмного забезпечення, підтримуючи патчі безпеки до попередніх версій.
liori

6

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

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


3

З цим насправді немає нічого поганого, доки кожен може сплачувати витрати, вигоди та ризики.

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

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

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

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

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

... зміна коду була здійснена нами ... вона повинна бути частиною нашої кодової бази ... ми повинні представити її як новий проект і включити його автоматизовану збірку в наш процес збирання.

Якщо ви робите патч, патч є частиною вашого власного коду, а це означає, що ви повинні зробити його частиною вашого процесу. Це не інакше, ніж додавання чогось на 100% вашого коду до вашої системи. Ставтеся до сторонніх дистрибутивів як до священних і вкладайте їх у модуль так, як це був вихідний код. Будь-які виправлені патчі зберігаються разом з ним в окремих файлах і застосовуються як частина процесу збирання. Таким чином, ви завжди переходите від чистого джерела до виправленого джерела до вбудованого продукту і зможете точно показати, що відбувається. (Деякі люди розпаковують, вручну виправляють, повторно упаковують та зберігають це у контролі версій. Це погано.)

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

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

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

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


2

Те, що ви хочете зробити, здається достатньо розумним, але це здається, що існують причини (звучання?), Щоб протиставити це. Я не буду порівнювати запропоновані рішення, але, можливо, є спосіб, як ти міг би торт і з'їсти його також:

Якщо проект із відкритим кодом, про який йде мова, дозволяє це, внесіть ваш пошкоджений виправлений файл у їх сховище. Тобто, якщо ви використовуєте версію 1.5.2, а поточна стабільна версія 1.6.1, внесіть виправлення до 1.5.2. Якщо він буде прийнятий, ви можете отримати фіксований джерело безпосередньо з сховища (можливо, версія 1.5.3) і зробити всіх щасливими.

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

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