Чи є науковий код достатньо іншою сферою, щоб ігнорувати загальні стандарти кодування?


21

Останнім часом я намагаюся обдумати наступний факт.

З одного боку, існує безліч вказівок та стандартів кодування того, що вважається "здоровим", "чистим", "добре написаним" тощо. Дивіться "Чистий код", який, як видається, також тут широко обговорюється. Приклад правила: 7 методів довгих рядків та 1 або 2 рівні відступи. Код, який не дотримується, якось очікується, що він загине від поганої ремонтоздатності.

З іншого боку, я добираюся до роботи з OpenCV, OpenCascade, VTK тощо. Це науковий код. У них є 2-сторінкові методи (я сам себе розумію), OpenCascade має метод або клас, розділений на 10 файлів (тут немає жартів), VTK теж часом безлад. Але ці проекти процвітають, підтримуються та широко використовуються!

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

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


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

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

2
@JustinCaveL Або: "Якщо він не зламався, не виправляйте його." Особливо застосовний до коду, призначеного лише для запису . Дивіться також plaza.ufl.edu/johnaris/PDFs/ProblemSolvingFlowChart.pdf
Роберт Харві

Ви, безумовно, знайдете відповідне моє попереднє запитання: programmers.stackexchange.com/q/266388/620
rwong

8
Для співвітчизників: Це питання стосується кодової бази бібліотек з відкритим кодом для обчислювально інтенсивних завдань в одній або декількох наукових областях . Це питання не стосується викидного коду. Зупиніться на мить, щоб переконатися, що ви зрозуміли кожен виділений аспект, перш ніж писати відповідь. Спасибі.
rwong

Відповіді:


28

Чи є науковий код достатньо іншою сферою, щоб ігнорувати загальні стандарти кодування?

Ні це не так.

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

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

Потрібно багато роботи, щоб рефакторировать існуючий код, який не викликає проблем. Особливо, якщо він взагалі специфічний для домену або не має тестів. Ви побачите, що OpenCV має посібник зі стилів, який є дуже вичерпним, навіть якщо не ідеальним. Застосовувати це заднім числом до всього існуючого коду? Тобто .. не для слабкого серця.

Це ще складніше, якщо працює весь цей код. Тому що це не зламано. Навіщо це виправляти?

Але ці проекти процвітають, підтримуються та широко використовуються!

Це відповідь у певному сенсі. Робочий код все ще корисний, тому його швидше зберігати.

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

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

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

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

Я думаю, що у людей часто виникає така ідея, що всі проекти з відкритим кодом починаються так: "Ей, у мене чудова ідея для бібліотеки, яка буде дуже популярною і використана тисячами / мільйонами інших", і тоді кожен проект відбувається так.

Реальність полягає в тому, що багато проектів запускаються і гинуть. Смішно крихітний відсоток проектів "встигає" до рівня OpenCV або VTK тощо.

OpenCV розпочався як дослідницький проект від Intel. Вікіпедія описує це як частину "серії проектів". Перший його не-бета-реліз був у 2006 році, або через сім років після його першого запуску. Я підозрюю, що метою спочатку були значущі бета-версії, а не досконалий код.

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

Я також повинен зазначити, що OpenCV існував протягом декількох років до того, як був опублікований Agile Manifesto, що Clean Code отримує натхнення (а VTK майже 10). VTK було започатковано за 17 років до опублікування Чистого кодексу (OpenCV був "лише" 9 років до цього).


2
Я використовував OpenCV ще в 2004 році, і це було жахливо. Willow Garage (нові власники ) зробили чудову роботу, перетворивши майже все на C ++. Насправді це одна з небагатьох наукових бібліотек, які складаються з хорошого коду.
nimcap

15

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

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

Чи всі практики, які фактичний професійний розробник вивчає під час своєї кар'єри, принесуть користь вченому? Абсолютно. Чи вдалося б кожному вченому витратити п’ять-десять років свого навчання на розробку програмного забезпечення? Напевно, ні. Тому якість коду така, яка є.

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

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


"Їх завдання полягає не в тому, щоб писати код сам по собі. Їх завдання полягає у вирішенні проблем" - зауважте, що технічно завдання розробника не полягає в тому, щоб писати код. Його робота, як і вчена, полягає у вирішенні проблем. Я виключаю фабрики програмного забезпечення та мавпи з кодом, які платять за те, щоб зберігати стільці в теплі, але, за визначенням, вони мало переймаються чистим кодом, тому вони не мають відношення до цього питання :)
Андрес Ф.

8

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

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


4
+1 для коментаря іменної змінної. Коли я навчався в школі, я робив декілька позаштатних кодувань для різних кафедр, і у відділах статистики та математики мене «наполегливо рекомендували» використовувати імена змінних на кшталт Ajі T0тому, що саме так назвали змінні у функціях, які я перекладав на код. Використовуючи щось на кшталт correlationIndexабо startTimeви змусите себе нарікати.
TMN

4

Усі існуючі відповіді висвітлювали це питання всебічно. Однак я хотів би зазначити, що є справжнім антиподом між подібностями OpenCV тощо. Напроти, скажімо, кодом, який розробляється відповідно до передової ділової практики (Code Complete, Clean Code, SOLID тощо)

Взагалі, для ділового коду KISS існує велика користь для бізнесу - "нехай це буде просто, дурно". Є також пов'язаний YAGNI - "Вам це не потрібно".

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


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

У перші дні певні частини OpenCV спочатку були розроблені в C. Пізніше OpenCV прийняв API C ++, про який ми сьогодні знайомі. Деякі алгоритми переписані, щоб скористатися інтерфейсами C ++ (абстрактні базові класи) та шаблонами C ++. Інші алгоритми були просто обгортками для оригінального коду С. Залишки цього коду можна знайти розкиданими по модулю "imgproc".

OpenCV містить безліч SIMD-програмувань (векторизації). На сьогоднішній день для програмування SIMD в C ++ все ще потрібно використовувати внутрішню техніку (intel.com) , (arm.com) .

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

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


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

Основними сприяючими факторами є:

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

Деякі з перерахованих вище факторів, що сприяють розвитку, є антиподами для розробки програмного забезпечення для бізнесу:

  • Зазвичай для бізнес-програмного забезпечення не потрібно мати справу з такими ж високими потоками даних, які спостерігаються в обчислювальному програмному забезпеченні.
  • Програмне забезпечення для бізнесу може бути пов'язане з єдиною операційною системою та архітектурою комп'ютера.
  • Програмне забезпечення для бізнесу може бути обережним у вирішенні, які функції включати. Насправді, розробка програмного забезпечення для бізнесу заохочує менеджерів говорити "ні" про нові функції, якщо немає хорошого ділового випадку.
    • Користувачів внутрішнього бізнес-програмного забезпечення можна навчити робити речі по-різному, уникаючи необхідності внесення змін до коду.
    • Якщо програмне забезпечення для комерційного бізнесу втрачає одного клієнта через одну відсутність функції, але завоювало двох нових клієнтів через покращену простоту та простоту використання (див. «Парадокс вибору» ), загалом це чистий прибуток - це добре річ, що ця одна особливість відсутня.
  • Програмне забезпечення для бізнесу підтримується безперервним потоком доходів, так що він може дозволити собі витратити частину його на постійну модернізацію кодової бази.

1
Ви приносите до таблиці багато балів, які всі здаються зовсім несуттєвими.
Мартін Мейт

@MartinMaat Якщо у вас є позитивні питання, які потрібно додати до цього питання, будь ласка, напишіть у власній відповіді.
rwong

3

Чи є науковий код достатньо іншою сферою, щоб ігнорувати загальні стандарти кодування?

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

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


2
"Agile" не має нічого спільного зі стандартами кодування.
Gort the Robot

@StevenBurnap - Звичайно, це так. Подивіться на "Чистий код". У ньому є стандартні стандарти кодування.
Девід Хаммен

1
Чистий код, що має багато стандартів кодування - поганий аргумент. Маніфест Agile може не мати нічого спільного зі стандартами кодування, але Agile сприяє гнучкості та реагуванню на зміни та дотримання стандартів кодування або найкращих практик. Отже - дуже опосередковано і обережно, спритний може не мати нічого спільного зі стандартами кодування, але стандарт кодування має багато спільного з гнучким.
Мар'ян Венема

1

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

Давайте подивимось на зразок коду, який я вважаю "чистим кодом" з точки зору комп'ютерного зору та розуміння зображення:

https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c042c6/modules/photo/src/seamless_cloning_impl.cpp

Для тих, хто знайомий з MATLAB та науковими обчисленнями, код у C ++ майже такий же стислий, як і найчистіший можливий код MATLAB.


Тепер ми повинні запитати, чому вся база коду бібліотеки (OpenCV у цьому прикладі) не пишеться за тим самим стандартом, як цей зразок коду?


Ми повинні розшаровувати кодову базу великої наукової бібліотеки на рівні абстракції .

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

https://github.com/opencv/opencv/blob/master/modules/core/src/hal_replacement.hpp

На середньому рівні ми знаходимо "найбрудніший" код, в межах якого, можливо, витрачається 80% - 90% часу на виконання процесора. (Так само, можливо, 80% - 90% зусиль з розробки були витрачені на середній рівень, якщо рахувати окремо зусилля з розробки програмного забезпечення від наукових досліджень.)

На високому рівні маємо найчистіший код, написаний дослідниками.


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

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

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