Які основні навички повинен мати кожен вчений-обчислювач? [зачинено]


52

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

  • базове програмування (циклі, умовні умови, списки, функції та введення / виведення файлів)
  • сценарій оболонки / основна оболонка
  • контроль версій
  • скільки тестувати програм
  • базовий SQL

У цьому списку багато, що немає : матричне програмування (MATLAB, NumPy тощо), електронні таблиці при правильному використанні, вони настільки ж потужні, як і більшість мов програмування), засоби автоматизації завдань, такі як Make тощо.

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


1
Чудове запитання! Але мені не ясно в одному: що ви маєте на увазі під вченим-обчислювачем? Будь-який учений, який використовує обчислення? Або СТОЛЬКО менша група людей, які вважали б свій професійний титул "вченим-обчислювачем"?
Девід Кетчесон

9
Складіть запитання щодо списку не добре у форматі Stack Exchange. Чи нам справді доводиться проходити це на кожному сайті?
dmckee

4
@Dan Community Wiki не є приводом для дозволу на запитання, які не належать на сайті. Я також хотів би заохотити тих, хто відповідає, взяти приклад з Джеда і хоча б спробувати пояснити, для чого вам потрібні певні навички чи не потрібні інші
Іво Фліпс

5
@IvoFlipse: Це питання, яке належить на сайті в якійсь формі. Можливо, не так, як зазначено в даний час; можливо, це потрібно зламати на більш дрібні питання та переробити, але питання поганої інженерії програмного забезпечення в обчислювальній науці є надзвичайно важливим, тим більше, що обчислювальна наука як дисципліна все ще знаходиться на стадії формування. Ця стаття в "Природі" вказує, чому. Грег робить велику послугу для спільноти обчислювальної техніки через свій веб-сайт.
Джефф Оксберрі

5
Я не згоден з тим, що це питання закрите. Будь ласка, дивіться (і голосуйте) meta.scicomp.stackexchange.com/questions/179/…
Девід Кетчесон

Відповіді:


46

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

Знання домену (наприклад, фізика та технічна освіта)

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

Математика

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

Інженерія програмного забезпечення та бібліотеки

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

Інструменти

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

LaTeX

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


7
Я згоден з Джедом. LaTeX абсолютно необхідний! :)
Пол

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

Дякую @EpiGrad, я змінив його на "знання домену" з такими як приклади.
Джед Браун

Хороший список. Там також має бути базове розуміння питань ефективності. Я зустрів надто багато людей, які не розуміють простої концепції кодування профілю. Примітка: продуктивність слід розуміти не лише із швидкістю, а й з використанням пам'яті.
Faheem Mitha

Друкарські помилки: "пробелів" і "похований". SE не дозволить мені їх виправити - занадто мала редакція.
Faheem Mitha

26

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

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

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

  • Додавання та множення є швидкими, ділення або трансцендентальні функції не є. Я бачив, як дорослі чоловіки замінюють операцію з квадратним коренем чимось, що вимагає трьох поділів, і думаю, що вони зробили щось чудове (поділ і квадратний корінь так само дорогі).
  • Так, кеш рівня 3 з кожним роком стає більшим, але кеш рівня 0, тобто справді швидкий, все ще складає лише кілька кілобайт.
  • Компілятори - це не магія. Вони можуть розгортати невеликі петлі або векторизувати надзвичайно прямолінійні операції, але вони не перетворять ці пухирці на швидку швидкість.
  • Методи виклику на поліморфних об'єктах із багатократним успадковуванням у вашій внутрішній петлі можуть бути концептуально приємними, але це змусить ваш процесор захотіти вбити себе.

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

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


2
Зовсім не нудно. Я б взяв такий курс, якби він пропонував. :-)
Faheem Mitha

18

Я можу до цього додати пізніше, але для початку я б вийняв «сценарій оболонки» і замінив його спеціально на «сценарій Python». Python набагато портативніше, ніж сценарії оболонок, і більш читабельні, ніж порівнянні мови оболонок та сценаріїв. Його велика стандартна бібліотека та популярність у науках (за можливим винятком біології, яка також використовує Perl) робить її чудовою комп'ютерною лінгва-франкою , не кажучи вже про хорошу першу мову для вивчення програмування. Зараз це перша мова, яку викладають спеціалісти EECS на MIT, і вона популярна на ринку праці, особливо в наукових обчисленнях. Його онлайн-документація є великою, а також є ряд текстів програмування на основі Python, доступних в Інтернеті.

Використовуючи Python, ви можете навчити основні конструкції програмування, а також сценарії. Крім того, Python має чудову підтримку тестування одиниць, тому Python може використовуватися і для навчання тестування одиниць. У Python також є розширений API бази даних (який міг би замінити або розширити необхідність вивчити SQL), а також кілька побудувати утиліти, які пропонують функцію Make-like. Я особисто віддаю перевагу SCons над Make, тому що мені здається, що Python легше документувати та перевіряти, ніж сценарії оболонки.

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

Python ще не зовсім MATLAB; У SciPy та NumPy все ще є шляхи щодо функціональності, але з точки зору загальної корисності я використовую Python для більш широкого спектру завдань, ніж MATLAB.


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

7
@BillBarth: Я думаю, що кожен вчений-обчислювач повинен навчитися базовому bash або csh для дуже, дуже основних сценаріїв. Причина, за якою я виступаю за використання Python для сценаріїв оболонок за межами цих основних завдань, полягає в тому, що я успадкував сценарій bash-лінії в тисячу іш, який по суті запускає програму . Він передає файли туди-сюди у вигляді семафорів, багаторазово викликає PBS, і взагалі немає можливості перевірити це. Сценарії оболонки чудово підходять для невеликих завдань, але не для великих завдань, і цей кошмар з виведенням стрічки і пузир коштував мені на пару років моєї тези, тому я наполягаю.
Джефф Оксберрі

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

3
@BillBarth: Ніде я не пропоную Python замінити оболонку. Я лише пропоную Python замінити bash на сценарій; Я вважаю, що якщо ви вивчаєте базовий баш, ви знаєте достатньо, щоб писати сценарії без контрольних структур, тому не потрібно поглиблюватися в "баш сценаріїв". Як тільки ви хочете включити керуючу структуру, ви повинні перейти на іншу мову, оскільки програмування в bash - це головний біль для програмного забезпечення та бібліотечних обслуговувачів.
Джефф Оксберрі

1
+1. Python вже деякий час є моєю основною мовою програмування. Це не ідеально, але це буде робити, поки хтось не вигадає ідеальну мову програмування.
Faheem Mitha

14

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

Улюбленою посиланням на цю тему, здається, є "Що повинен знати кожен комп'ютерний вчений про арифметику з плаваючою комою (1991)" Девіда Голдберга http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768


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

12

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

Математика:

  1. Числовий аналіз
  2. Лінійна алгебра
  3. Звичайні, часткові та / або стохастичні диференціальні рівняння
  4. Оптимізація
  5. Статистика та / або ймовірність
  6. Зворотна теорія

Комп'ютерна наука:

  1. Алгоритми
  2. Структури даних
  3. Паралельне програмування (MPI, OpenMP, CUDA тощо)
  4. Наукова візуалізація
  5. Комп'ютерна архітектура
  6. Використання середовища Linux

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


Чи можете ви детальніше зупинитися на "оберненій теорії"?
Faheem Mitha

1
@FaheemMitha: Традиційно ми спочатку встановлюємо параметри моделі (наприклад, часткове диференціальне рівняння), а потім спостерігаємо за поведінкою системи. "Зворотна проблема" робить зворотне. Почнемо з спостережень за результатами системи та спробуємо визначити параметри моделі, яка виробляє ці спостереження. Зворотна теорія описує способи виконання цього завдання.
Павло

Дякую за пояснення. Чи є у вас хороша посилання / посилання на цю тему?
Faheem Mitha

2
en.wikipedia.org/wiki/Inverse_problem - це гарне місце для початку. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf також має хороший огляд. Але для більш глибокого розуміння я рекомендував би книгу на зразок amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Пол

4

Чудове запитання, за яким випливають захоплюючі відповіді! Я хотів би вкластись лише одним невеликим доповненням. Наскільки я пережив (сам і непередбачувано), інструмент «Все в одному», як правило, добре знати. Таким інструментом може бути MATLAB, Octave або навіть Python (з бібліотеками). Кожен раз, коли у вас є проблеми у вашій «зоні комфорту», ​​гарною ідеєю (наскільки я знаю і думаю) було б спробувати свої сили на інструменті «все в одному». Ви можете спробувати написати власні коди пізніше. Краса таких пакетів полягає в тому, що програмування не заважає зрозуміти, що ви робите.

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

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


-1

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


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