Pull to refresh

Comments 40

Мораль: научный софт ужасного качества. Под ужасным качеством я подразумеваю, что его не так уж часто удается даже просто собрать/запустить без плясок с бубном, про надежность и вовсе молчу. Во всяком случае, об этом говорит беглый экскурс в биоинформатику.
О, подскажите какой-нибудь ужасный научный софт на Java. Мне для тестирования FindBugs постоянно нужен низкокачественный глючный софт. Бывает, найдёшь что-нибудь новенькое, думаешь, о, научный софт, ща потестируем. А там, как назло, качество хорошее, юнит-тесты, код-ревью, ещё и в мавен выкладывают сами, как настоящие программисты.

Upd: JMol не предлагать, про него я уже знаю. Действительно изумительная коллекция багов.
В предыдущей мажорной версии scilab был прилично забагован
Потестировал scilab, действительно прикольные баги нашлись. Спасибо.
Один знакомый программист в дискуссии по OpenSSL заметил: «Да чего ты от неё хочешь? Её не программисты, а математики писали». Что, в общем-то, объясняет почти всё.
Судя по коду, что я видел в научных либах и прогах. Я б сказал так: 90% не думают о качестве кода и не думают о том, как они его будут тестировать, 9% задумались, но у них плохо получилось и они забросили, 1% пишут хоть как-то вменяемый код.

Причем сплошь и рядом ошибки переполнения, ошибки дискретизации, не учет ошибок вычислений с плавающей точкой. И т.д и т.п.
Зачастую, выходит гораздо проще состряпать программку обработки данных самому, чем объяснить программисту, что программа должна выполнять. Дело, как минимум, в том, что на данном этапе человек еще не знает всех нюансов, которые стоит ожидать от эксперимента — возможно, потребуется сильная фильтрация полученных данных, или наоборот, излишне агрессивный фильтр смажет вожделенный пик на кривой. И все это выясняется только в процессе обработки измерений. Когда вся обработка написана самостоятельно, имеется полный контроль над ситуацией и всегда есть возможность оперативно подправить код с учетом открывшихся обстоятельств. Вряд ли профессиональный программист сможет быстро освоить проблематику, над которой ученый бьется всю сознательную жизнь, и предложить лучшее решение. А критиковать уже созданное весьма просто…
Знаете, я не чистый программист, более того в универе у меня было два языка — Си и Matlab. я астроном по образованию. А сейчас пишу баллистику для спутников, а до этого сидел и обрабатывал данные с телескопов. И знаете что я вижу, когда заглядываю в код старых аксакалов: 20 вариантов одной и той же проги, которые то там, то здесь исправлены чуть-чуть и где что именно никто вот так сразу не скажет. О повторном использовании кода и речи быть не может.

А насчет контроля я скажу так, если это же самое не может контролировать другой человек, значит его не контролируете его и вы. И не идеализируйте свою память.
Маленькие научные группы обычно заинтересованы в приоритете публикаций, нежели в стабильности/надежности софта. Не говоря о том, что время жизни многих программ — это время работы конкретного человека (мнс, аспиранта) над данным проектом.
Ага, код которого потом будет использован методом копипастом через цать лет, спасибо — видел. Приоритет это хорошо, но вот как вы гарантируете, что вы верно считаете?
Ваш вопрос похож на «а как вы гарантируете что графики в вашей статье не взяты с потолка?»

Вообще для этого есть рецензирование статей. А еще такая вещь как повторяемость результата в разных группах.

В конце концов, если вы нашли сверхсветовые нейтрино — публикуйтесь на здоровье, всем пойдет на пользу. Особенно если вы потом найдете отошедший кабель в своем эксперименте.
Ну да, знаем мы как рецензируются статьи. Особенно чисто расчетные. Никто ничего не понимает, формулы проверят, ну м.б. графики и то не всегда, и все.
Потом придут другие товарищи, которые также не в курсе ( а таких подавляющее большинство), что 0.01*100.0 != 0.01 + 0.01 +0.01… и так 100 раз. и у них результаты совпадут.
Я не отрицаю наличие проблем в самописном научном ПО, описанные вами случаи встречаются повсеместно. Мой посыл был в частой невозможности сформулировать четкое ТЗ для стороннего программиста на данном этапе исследований (умолчим про необходимое финансирование).
На счет старых наработок, я бы тоже не был столь категоричным, к примеру, библиотеки ФОРТРАНа до сих пор используются учеными во всем мире. Или специализированное ПО для физического (химического, биологического и т.д.) моделирования, где наработки ученых систематизируются в библиотеки и приобретают удобоваримую форму.
Так же, несколько улучшает ситуацию развитие языков высокого уровня (тот же Матлаб), вероятность описанных вами ошибок на которых в разы меньше, а скорость написания кода и его читаемость выше.

Но я двумя руками за то, что бы выделенных на науку денег хватало и на штат программистов.
Да. Вот насчет ТЗ согласен полностью. Лучше уж самому хоть как-нибудь…
Нельзя сделать за дорого — сделай за дешево, но также. На самом деле у ученых естественных наук и программистов один оочень мощный фундамент — математика. Она синхронизирует способ и направление мысли.
В чем отличие программиста от ученого? — Программист перелопатил тонны кода, как своего, так и чужого. Поэтому для него ЯП — это еще один язык общения. Он качался в этой сфере очень долго, у него за спиной целый стек технологий. Он знает как связать один узел с другим и заставить это работать. Он знает гораздо больше нюансов работы всех этих технологий.

По сравнению с ним, вы школьник 11-го класса, а он литератор. Но это не значит, что школьник не сумеет связано и грамотно изложить на бумаге свои мысли.

Рецепт построения вменяемой программы, да и вообще любого продукта прост — при реализации вы должны смотреть на него со стороны.
Сначала напишите в коде некую структуру программы.не обязательно чтоб она что-то считала, более того сейчас она не должна работать.
Напишите тесты и оцените удобство использования кода.
Напишите хоть пару строк комментариев ЧТО делает каждая функция. Оцените насколько проста каждая задача, насколько она покрывается тестами. А в качестве бонуса, пока вы думаете над комментарием, всплывет какой-то нюанс.
Устраните недочеты в структуре и теперь можно написать код.
Гарантирую, хороший программист, если вы ему понесете такой код очень быстро въедет в задачу. Ну а если нет, то проделанная процедура — это ваша база для спокойного сна. явные косяки вы должны были устранить.
А нельзя состряпать программку самому, а потом отдать программисту на вычитку и вычистку?
Часто все упирается в то, что программисту нужно заплатить, да и задачи, поначалу, выглядят просто. Не стоит так же отбрасывать ЧСВ — не каждый признается шефу, что не способен накидать несколько строчек программы самостоятельно. Выше я уже говорил, что в идеале, на ряду с инженерами и техниками, действительно было бы неплохо иметь в научной команде и программистов. Возможно, со временем и к этому придем.
Ответ простой: дайте денег на нормальные зарплаты программистам в науке и они напишут хороший код.
Реальность: этого не будет никогда. Следовательно, в науке ситуация всегда будет такой.
Если изначально есть понимание, что нужна большая софтина — зачастую нормального програмиста найти таки можно. Но очень много самописного софта развивается чисто эволюционным путем из поделки на две сотни строк — сначала нужно автоматизировать какую-то простую операцию, потом дописать еще полсотни строк фильтра, потом еще, а потом внезапно оказывается, что есть уже приличый такой комбайн, и ну не выбрасывать же его.
Не такой уж и простой. Программист должен разбираться в теме не хуже того, кто дает задание. Где-то это проблему решит, а где-то — не поможет.
Сейчас процентов 70-80 программистов даже банальный матан не знают. А зачем он, говорят? Кстати, припоминаю статьи об этом на Хабре. Ну действительно, зачем, если в реальной жизни он будет кодить какой-нибудь онлайн-магазин, цмс или игрушку? Фреймворки с паттернами ему полезнее. И большая доля истины в этом есть — мало кому матан пригождается на практике. Мне вот пригодился, но весьма частично.

А если говорить о чем-то глубоком, действительно сложном, специфичном? Там пару лет только нужно погружаться в тему, чтобы достичь уровня, чтобы понимать уже написанное (об участии в исследованиях речи пока нет и близко). То есть нужно посвятить этому значительный период жизни.

Выходит, что з/п должна быть не просто высокой, а высокой на протяжении минимум нескольких лет. Никакому «обычному» программисту это не нужно. И наоборот, он такой не нужен науке. Остается только надеяться на редких людей «на стыке», которые интересуются и умеют то и другое.
Я думаю, это не поможет. Софт в исследовательских проектах очень быстро меняется, потому что это исследовательские проекты. Вы очень примерно представляете, какие данные вы получите в результате проекта. Или даже сегодня к обеду. Именно поэтому это называется исследованиями. Затраты на коммуникацию между, к примеру, физиком и программистом будут настолько огромными и неудобными, что в большинстве случаев все равно физик будет писать свой код. Поэтому ребята в статье и предлагают как-то повышать уровень культуры программирования непосредственно среди ученых.
На различных стыках с железом часто с таким сталкивался. Ленивые люди делают синхронные методы доступа в которых жёстко задают задержку (с запасом!) между передачей и приёмом. Если обмен длительный — мелкие задержки накапливаются и вырастают в описываемое вами. Лечится заменой на асинхронный обмен. Но без исходников это затруднительно.
когда-то компьютеров не было, то есть вообще не было…
потом комьютеры появились и любопытные ученые сразу начали тыкать в них пальцами…
у кого-то получалось плохо, а у кого-то и хорошо…
те, у кого получалось плохо, до сих пор тыкают, но над ними за это смеются и бьют по рукам…
а у тех, у кого получалось хорошо, получалось все лучше и они тоже до сих пор тыкают, только учеными их больше не называют…
много нас таких, здесь кстати тоже
обязать к публикациям прикладывать либо исходники либо алгоритм расчетов. Имхо, это прямо вытекает из требования воспроизводимости результата.
Много лет работал программистом в научном коллективе и подтверждаю все сказанное в статье.

Ученые и (особенно) аспиранты вынуждены писать код сами (я не успевал это всегда за них делать). Поскольку они не имеют должной подготовки в области программирования — то их программы трудны для понимания и зачастую полны ошибок, тормозные, трудно поддаются расширению, повторному использованию кода.

В научных учреждениях (даже небедных на Западе) никогда не хватает денег на наем профессиональных программистов. Даже если программистов нанимают, объем работы для программистов обычно существенно больше, чем они могут потянуть.

Подтвержаю сказанное Nik_sav:
на данном этапе человек еще не знает всех нюансов, которые стоит ожидать от эксперимента — возможно, потребуется сильная фильтрация полученных данных, или наоборот, излишне агрессивный фильтр смажет вожделенный пик на кривой. И все это выясняется только в процессе обработки измерений

Совершенно верно. Бывало, мне давали задание, я много времени тратил на тщательную проработку программы, приданию ей красивого вида, тестирование, оптимизацию, закладывание возможностей на расширение. А потом выяснялось, что эксперимент не удался, и программа не понадобится, или ее надо существенно переделывать. Выкрасить и выбросить. За это же время аспирант сам на коленке бы состряпал для себя некрасивую и неэффективную программу, которая позволила бы получить тот же результат (что она не нужна, и тратить усилия на дальнейшее совершенствования программы бессмысленно).

Также от «программиста для науки» требуется квалификация в предметной области, сравнимая с квалификацией аспиранта, а где-то даже и доктора. Знание математики, статистики, цифровой обработки сигналов и того, как все это эффективно реализуется на компьютере. Иногда — знание электроники (для понимания, как настраивать и использовать научную аппаратуру и приборы). Но люди с такой квалификацией обычно сами становятся аспирантами, а затем и докторами. Это единственный путь сделать карьеру в науке. Просто программист в научном коллективе лишен возможности карьерного роста. Он никогда не станет руководителем группы (это удел докторов и профессоров). Платят им меньше, чем в коммерческих предприятиях.

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

Как я уже писал выше, сильно помогают специализированные инструменты: Matlab — отличная числодробилка, пускай код (в неумелых руках) будет медленным, но свою задачу выполнит, LabView — для автоматизации эксперимента, прост до невозможности, при этом имеет огромный потенциал — доводилось и просто данные собирать и драйвера для устаревшего оборудования писать. Важно так же, что порог вхождения здесь крайне низок — любой студент освоит.

В свою очередь, уже эти программные пакеты разрабатывают команды профессионалов, и на их плечи ложится понятный интерфейс, «защита от дурака», написание мануала, тех. поддержка и т.д.

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

Я в жизни видел успешный пример. Человек поработал несколько лет программистом в антивирусной компании, а после этого — пошел в аспирантуру. Профессиональные знания и навыки в области программирования позволили ему стать поистине «монстром» по сравнению с «обычными» аспирантами (физиками и т.д.). Он быстро и легко создавал для себя и других членов коллектива мощные и красивые программы. Когда пишешь программу для себя — то это всегда более эффективно, чем если по поручению других. Сам всегда знаешь, где можно сэкономить время и силы на вылизывание программы, а где — постараться и сделать качественно. Какие функции в программе реально нужны и до какой степени они должны быть развиты. В коллективе, где есть такой аспирант, нанимать отдельных программистов не нужно.
Вы только что подтвердили утверждение выше, а не опровергли его.
Опроверг. Данный человек занимался исключительно программированием до поступления в аспирантуру. Это можно считать подготовкой, учебой (и учебно-производительной практикой). После поступления в аспирантуру он занимался уже не исключительно программированием, а наукой.
>Человек поработал несколько лет программистом в антивирусной компании
>Опроверг. Данный человек занимался исключительно программированием до поступления в аспирантуру.

Это уже не совсем подготовка. Он именно что состоявшийся программист (его же не уволили за несоответствие служебному положению). Он же амнезию не заработал с переходом на другую работу. Это если я пойду работать в добывающую промышленность, я стану лучшим по вопросам энергоснабжения.

Это не опровержение, а подтверждение.
Ваша фраза:
тягаться с человеком, занимающимся исключительно программированием все равно не получится

Причастие «занимающмся» употреблено вами в настоящем времени. Значит, вы имели в виду человека, который не в прошлом, а в настоящем занимается «исключительно программированием». Я привел пример, когда человек занимался исключительно программированием не в настоящем, а в прошлом времени. В этом и состоит разница. В настоящее время он не знанимается исключительно программированием, а главным образом занимается наукой.

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

Но прошлый опыт — это по сути не что иное, как подготовка. Следовательно, если ученые имеют надлежащую подготовку в области программирования — то в таком коллективе «чистые» программисты не нужны. И это просто становится одним из требований к ученым, к расширению области необходимых им знаний и навыков, каким до этого стало знание матана и статистики.

У студентов естественнонаучных специальностей, таких как физика, химия, биология, в настоящее время есть и часы на программирование. Возможно, их недостаточно в нынешнем мире, где возросла роль компьютеров. Но учебные программы эволюционируют, догоняя требования времени.
Переход же все-таки не мгновенный. Т.е. сказать, что человек, ушедший с программистской работы больше «не занимается исключительно программированием» можно будет через полгода-год (если в больших масштабах, то 5 лет программирования из 6 стажа — в общем-то тянет на «исключительно»). И то, знания не уйдут, это как водить машину. Ведь тот же опыт, полученный, допустим, за время работы водителем такси, не уйдет.
Это не полноценное опровержение, вот если бы такой аспирант никогда профессионально этим не занимался… Таков был посыл начального поста (не моего, кстати).
И то, знания не уйдут, это как водить машину

Вот и я об этом говорю. Если вы начальник, но не умеете водить машину — вас может отвезти куда надо и профессиональный водитель. И он сделает это лучше вас, даже если вы умеете водить. Но все же зависимость от водителя вносит в работу некоторые неудобства и ограничения. Например, водитель может заболеть, уйти в отпуск. Пока он не вернется, вы ездить не сможете. Водитель сам не знает, куда ехать, ему надо объяснять, на это уходит драгоценное время, если вы спешите. Очень хорошая аналогия.

А программиста, в отличие от водителя, заменить непросто. Новый программист должен потратить длительное время, чтобы вникнуть в детали проектов, которыми занимаются ученые в конкретном коллективе.
Раз уж мой пост породил такую дискуссию, то вставлю и свои 5 копеек.

Во первых, ваш знакомый состоялся как программист и в какой-то момент поменял род деятельности (умолчим, что учить в вузе Турбо Паскаль и писать реальное ПО на коммерческой основе, мягко говоря, не одно и то же). Но скажите, на сколько он отстал от сверстников, сразу после вуза пошедших в аспирантуру? Я имею в виду научные публикации, цитирования, патенты (в общем все, чем может похвастать ученый). А эти формальные показатели крайне важны при подаче на очередной грант.

Во вторых, если он будет заниматься дальше, в первую очередь, наукой, на сколько актуальными будут его знания как программиста через 10, 20 лет? Эта сфера очень быстро развивается, и нужно постоянно осваивать новые технологии, иначе, не будет большой разницы между вашим знакомым и его коллегами. Думаю составить алгоритм там может большинство, вопрос в реализации деталей на конкретном ЯП.

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

П.С.
Я воспринимаю описанную вами ситуацию чисто гипотетически, и никоим образом не хочу коснуться лично вашего знакомого или научный коллектив, в котором он работает.
Я как человек относительно близкий к IT сейчас и занят в нашей лаборатории тканевой инженерии разработкой всякой мелочи на базе Arduino, настройкой оборудования, анализом данных. Тот же Arduino прост, но позволяет решать кучу насущных проблем. Банальная регуляция перистальтических насосов в зависимости от показателей датчиков. Вроде мелочи, но обычный врач-исследователь этого сделать не сможет. Подозреваю, что мой код и методы тот ещё костыль, но стараюсь все документировать, использовать git и прочее. Мне как врачу непросто, но надеюсь, что это поможет кому-то в будущем разобраться в том, что я собираю из палок и изоленты сейчас.
Кстати, если интересно, могу попробовать найти время и написать небольшую статью про систему распознавания клеток и других структур — CellProfiler
Если напишете доступным языком, то с удовольствием почитаю — в свое время физ-био-мед-электронику заканчивал, что-то еще в памяти осталось.
Попробую. Осталось выкроить время)
Sign up to leave a comment.

Articles