Пріоритети вивчення обчислювальних методів, коли я повинен написати власний код порівняно з використанням бібліотек як початківця аспіранта?


10

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


2
У мене була довга відповідь, але після деякої дискусії з іншим модом я вирішив її видалити і попросити роз'яснити ваше запитання. Який головний пункт вашого питання? Це "де я наголошу на своєму навчанні?", "Як би ви рекомендували надавати пріоритет навчанню перед моделюванням прогресу?", "Чи вибір бібліотек над кодами, що реалізуються самостійно, залежать від вирішуваних проблем?" Або "які переваги / недоліки кодування моїх власних алгоритмів на набагато більш ранньому етапі моєї кар’єри? ". Моя відповідь була надто широкою, і краще було б дати вам цілеспрямовану відповідь на більш цілеспрямоване питання.
Джефф Оксберрі

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

Дякую. Я зроблю кілька змін, щоб сфокусувати питання, а потім опублікую відповідь.
Джефф Оксберрі

Відповіді:


10

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

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

Єдині інші сценарії, про які я можу придумати (тобто можуть бути інші), це:

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

10

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

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

З дослідницького дослідження 2011 року, проведеного в Прінстоні, "Огляд практики обчислювальної науки" :

Вчені витрачають значну кількість часу на програмування. В середньому вчені підрахують, що 35% часу на дослідження витрачається на програмування / розробку програмного забезпечення. Хоча спочатку деякий час витрачається на написання коду заново, значна частина часу приділяється багатьом виснажливим заходам. Наприклад, дослідники з політики та соціології, які використовували R / Stata, повинні були зробити значне програмування для переоснащення даних перепису у формати, які розуміли окремі пакети в R / Stata. Деяким дослідникам хімічної інженерії довелося змінити незадокументований спадковий код інженера, який виконував моделювання полум'я, довго після закінчення оригіналів авторів, щоб адаптувати код до нових видів палива ... Незважаючи на це, переважна більшість цих дослідників вважають, що "вони витрачати більше часу на програмування, ніж слід ",

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

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

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

  • Хоча багато дослідницьких лабораторій та промислових посад високо цінують досвід програмування, наукове програмування може стати потенційною шкодою для вашої академічної кар’єри, навіть якщо ваше програмне забезпечення приносить користь науці більше, ніж ваші роботи. Весь цей час ви витрачаєте на те, як добре програмувати, програмувати, документувати свій код і робити його надійним, перетворюючи на документи, які не пишуться. Тут консультанти не завжди матимуть на увазі найкращі інтереси свого студента, оскільки це один із тих випадків, коли студент може забезпечити роботу, яка приносить користь групі консультанта, не скориставшись кількістю посилань студента. Знайдіть одного або декількох довірених наставників у галузі, яка вас цікавить, і переконайтесь, що ви чітко розумієте, які внески вважаються цінними. academia.stackexchange.com - прекрасне місце для подальших запитань з цього приводу.


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


Я вже хвилювався за свій рахунок паперу. Оскільки я буду студентом обчислень для великої кількості експериментальних студентів, швидше за все, у мене буде багато 2-го та 3-го авторства. Можливо також, що на початку я лише поєднуватимуть різні програми (0D-код з моєї лабораторії, 2D-код з іншого університету, програмне забезпечення Meshing з іншої лабораторії мого університету). Безумовно, багато про що подумати над цим.
Годрик Провидник

6

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

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

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

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

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