Должен ли я делиться своим ужасным программным обеспечением?

После того, как я опубликовал свою статью, некоторые люди попросили меня поделиться программным обеспечением, которое я разработал. Сначала я был очень рад, что моя статья привлекла внимание, и я был рад поделиться не только бинарным кодом, но и исходным кодом, примерами из практики и т. д. Но, глядя на мое программное обеспечение, я чувствовал себя очень смущенным.

Мое программное обеспечение просто ужасно: исходный код просто беспорядок, содержащий несколько моих неудачных попыток; Я никогда не использовал паттерны проектирования, поэтому дублированный код повсюду; для простоты и быстрой реализации я часто предпочитаю рекурсии циклам и т. д. и т. д.

Я всегда испытываю давление, чтобы получить новые результаты, и очистка этого кода стоила бы мне значительных усилий.

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

Я не уверен, насколько я действительно могу вам помочь, но я видел это видео, которое, основанное на вашей проблеме, может вас немного воодушевить. google.co.uk/… Извините, я больше ничем не могу вам помочь, я просто хотел показать вам это видео, которое, по моему мнению, было уместным.
Похоже на академический софт.
Грязный секрет: большинство академических программ ужасны. Даже то, что выходит из отдела компьютерных наук.
Вы можете выпустить его под лицензией CRAP: matt.might.net/articles/crapl
Исследования обычно включают в себя проверку тысячи вещей, которые не работают. Если вам удается написать код, который работает с первых нескольких попыток, вы, вероятно, не проводите исследования, а просто внедряете.
Эта статья в журнале SIAM представляет собой увлекательное чтение и приводит очень убедительные аргументы.
Еще один момент для рассмотрения: что, если некоторые из ваших выводов основаны на ложных данных, полученных из-за ошибки в вашем программном обеспечении? Читатели должны иметь возможность проверить это.
Публикация кода в общедоступном месте, таком как GitHub, дает вам возможность показать, как вы постепенно улучшали свое программное обеспечение. Значительное улучшение программного обеспечения без изменения результатов, полученных с помощью программного обеспечения, — непростая задача, и поэтому этот навык высоко ценится. Вы можете найти часть кода на сайте обзора кода codereview.stackexchange.com , чтобы помочь здесь.
@qsphan Просто из любопытства, о чем твоя статья?
Чтобы добавить в беседу: phdcomics.com/comics/archive.php?comicid=1692
@mankoff: Пожалуйста, не надо. Эта лицензия ужасна . Гораздо лучшим вариантом было бы выпустить его под 3-Clause BSD с большой наклейкой, предупреждающей о качестве.
много неакадемического программного обеспечения тоже бардак, ср. недавние ошибки bash...
Бла, как программист: «Я всегда вынужден создавать новые результаты, и очистка этого кода будет стоить мне значительных усилий». Вы понимаете, что причина, по которой вы находитесь под таким давлением, заключается в том, что вы тратите так много времени на ОТЛАДКУ кода, который вы никогда не удосужились правильно написать или поддерживать?
Даже если код действительно ужасен - в чем я сомневаюсь - он все еще проверен и отлажен в боевых условиях, что намного, НАМНОГО более ценно, чем использование последних шаблонов проектирования и т. д. Обязательно добавьте подробные инструкции по базовой платформе (Ubuntu 12.04, OS X 10.7 с XCode с libX версии Y и т. д.), так как могут быть тонкие различия, вызывающие проблемы, а также полные инструкции о том, как компилировать и компоновать ваши программы. Вы, вероятно, уже несколько автоматизировали, когда писали это — просто запишите это, чтобы другие могли видеть.
В рекурсии нет ничего плохого, если только язык программирования не поддерживает ее оптимизацию.
@Philipp: Что меня больше беспокоит, так это ситуация, когда статья верна, но в коде есть неприятная ошибка. В этом случае исправление ошибки изменит правильность ответа, но не (скажем) его характеристики производительности... поэтому, если вы выпустите код, вы рискуете поставить себя в неловкое положение, даже если ваши результаты не будут признаны недействительными. (Я уже находил такие ошибки в своем собственном коде.)
Неважно, академический он или нет. blog.codinghorror.com/version-1-sucks-but-ship-it-все равно
@Mark: Большинство программ ужасны, точка. Не только академический, и не секрет на самом деле. ;-)
Просто чтобы добавить к этому, даже научное программное обеспечение, которое используется каждый божий день в основных приложениях, становится грязным и ужасным - код, используемый Метеобюро, все еще находится на Фортране, и в нем повсюду остались биты с нескольких десятилетий назад...
@djechlin Хотя иногда это правда, «Источник вашего давления - ваш плохой код» не всегда поддается обобщению. Если только мои навыки Python не были причиной последней эпидемии лихорадки Эбола?
@Fomite кое-что о ваших навыках Python — вот почему вы еще не закончили свое исследование Эболы, если хотите так выразиться: P
@djechlin Нет, я думаю, это больше связано с тем, что люди все еще умирают ...
@Fomite, зачем вообще писать код, если люди в любом случае умирают?
@Fomite Я хочу сказать, что если вы собираетесь это сделать , вы должны сделать это хорошо и быстро , если это является основным узким местом в вашей работе. Я полагаю, вы могли бы сказать, что основным узким местом в вашей работе является распространенность лихорадки Эбола, но после этого есть пугающе большая вероятность того, насколько хорошо работает ваш код. Но если вы хотите настаивать на том, что проблема в существовании лихорадки Эбола, тогда вам больше власти.
@djechlin Я просто отмечаю, что идея о том, что источник давления на академика сводится к плохому кодированию, одновременно глубоко самонадеянна и определенно не поддается обобщению.
Можно ли работать со студентом бакалавриата или магистратуры, изучающим информатику, и заставлять его «подчищать» часть кода?
Предложение от программиста: не оставляйте свои неудачные попытки в виде закомментированного кода или в неиспользуемых классах. Вместо этого чаще фиксируйте (полу-)рабочие версии в систему управления версиями (GIT). Всегда удаляйте мертвый код, который больше не нужен! Если вам нужно вернуться к более ранней версии, восстановите ее из системы управления версиями. Таким образом гораздо проще следить за своим кодом, потому что кода для чтения гораздо меньше. Что касается того, что ваш код не использует причудливые шаблоны проектирования и т. Д.: это может быть хорошо, сделайте его как можно более простым, добавляйте сложность только там, где это абсолютно необходимо.

Ответы (18)

Да, ты должен.

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

Во-вторых, маловероятно, что у вас будет стимул или мотивация сделать это лучше, если или пока это не понадобится кому-то другому (или вам через 6 месяцев). Открытие дает вам этот стимул.

Потенциальные плюсы: возможные новые соавторы, исправления, расширения, публикации.

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

Большинство научных программ НЕ ужасны. (Я зарабатываю на жизнь, работая с ним и оптимизируя его уже пару десятилетий, поэтому я думаю, что у меня есть обоснованное мнение.) Просто у него довольно разные критерии качества: работа, получение правильных ответов в практическое время, расширяемость. к следующей теории и т. д., а не в соответствии с последней квазирелигиозной парадигмой дизайна или языковой тенденцией. А для OP ваше «ужасное» программное обеспечение может, если его немного почистить и прокомментировать, быть более доступным для других ученых, чем «хороший» код.
Я бы просто добавил к этому, что я бы предложил поделиться им через Github или аналогичный, который имеет активное сообщество и облегчает людям совместную работу, разветвление вашего проекта и участие в нем.
Нет упоминания о слоне в комнате, воспроизводимость ?
@jamesqf: я преувеличил для эффекта, но я думаю так. Большая часть научного программного обеспечения представляет собой краткий одноразовый код, подтверждающий принцип работы. Его редко выпускают за пределами небольшой группы, и, по моему опыту, он плохо написан. Большинство научного программного обеспечения , которое работает в разумных масштабах, не страшно (я также работал с некоторыми из них в аналогичном временном масштабе): оно не может производить несколько публикаций. Но я имею в виду «весь код, написанный учеными».
@mmalmeida Я согласен, Github — это канал для совместной работы. Проблемы и вехи предлагают способ отслеживать проблемы и запросы на улучшение. Прежде чем открыть этот код, я бы также рекомендовал потратить некоторое время на его очистку или, как минимум, добавить к нему описательные комментарии.
@jamesqf Ну, самое ужасное. Я бы также сказал, что у меня есть обоснованное мнение. То, как работает код, не является критерием «хорошего» кода для программиста, по крайней мере, того, который считается хорошим. Корректность является обязательным свойством. Скорость расхождения, числовая стабильность, скорость (исключая аппаратную оптимизацию) и т. д. являются свойствами алгоритма, реализуемого кодом. У вас может быть хороший код и плохой код, работающие одинаково. Хотя я признаю, что «хорошо» слишком расплывчато и часто приводит к непониманию. Я бы сказал, что «качество кода» очень часто ужасно. Даже если программа работает отлично.
@jamesqf: в большинстве научных программ, с которыми я сталкивался, не было никакой системы контроля версий, и это звучит как еще один пример (или почему еще все неудачные попытки все еще там).
@RemcoGerlich: Ну, есть пример разных критериев «хорошего качества». Я еще ни разу не встречал системы управления исходным кодом, в которой не было бы очевидного крупного конструктивного недостатка: при извлечении файлов из системы их временная метка сбрасывается до времени извлечения, а не времени последней модификации. Разработчики этих систем, очевидно, считают, что это «хорошая» функция — у меня было несколько споров на форумах пользователей по этому поводу — но конечным результатом является то, что я не использую контроль версий, если мне за это явно не платят.
@jamesqf: не принимайте это на свой счет, но это занимает довольно высокое место в списке тупых причин не использовать систему управления версиями (кроме того, с «обычными» системами контроля версий требуется сценарий примерно из 20 строк, чтобы «исправить» этот «основной дизайн»). недостаток").
@jamesqf Я никогда не видел, чтобы временная метка файла имела значение . Единственный случай, когда я могу даже подумать, что это на что-то влияет, это make, и когда у вас есть чистая проверка, нет двоичных файлов, чтобы проверить, нужно ли им пересобирать. Преимущества системы управления версиями очевидны: отслеживание изменений (что невероятно ценно на практике), защита от потери, более простой обмен данными с коллегами и возможность одновременной работы над одним и тем же кодом. Ваша проблема кажется крайне неясной, и я готов поспорить, что одни только эти преимущества перевешивают недостатки вашего конкретного варианта использования.
Проект Sage ( sagemath.org ) является живым примером программного обеспечения для математических исследований, которое не является ужасным , хотя постоянно ведутся дискуссии о дизайне и жалобы на практику кодирования.
@ jpmc26: Как может время файла не иметь значения? Возможно, если вы работаете только с одним набором кода, они не так важны, но если у вас много разных кодов, каждый из которых содержит множество файлов (по моему опыту, типично для научного программного обеспечения), действительно полезно иметь возможность видеть в взгляд (выполнив, например, 'll *.[chyl]', над какими именно файлами вы работали и когда. Теперь я согласен с тем, что ПРАВИЛЬНО РАБОТАЮЩАЯ система управления исходным кодом была бы отличным инструментом. Проблема в том, что !@# $s, которые их создают, абсолютно отказываются реализовывать это действительно простое исправление.
Коммиты @jamesqf (ядро большинства систем управления версиями) имеют метки времени. Например, в git создайте фиксацию для каждой модификации ваших файлов данных, например, «повторное моделирование с использованием нового кода из версии XXX». Для каждой модификации кода сделайте коммит, в котором говорится: «улучшен код в XXX по причине YYY». Затем, вместо «даты последнего изменения» для ваших файлов, вы получаете хороший список коммитов, а также то, когда они произошли, какие именно файлы были добавлены/изменены/удалены, и полезный комментарий. Ничего не исправить, вы просто не знаете, как правильно использовать систему управления версиями.
Не говоря уже о том, что если вам действительно нужна эта функция, любое программное обеспечение для управления исходным кодом позволяет вам спросить, когда файл был в последний раз изменен. На самом деле, большинство пойдет дальше и расскажет вам, какая фиксация в последний раз затронула файл, предоставив вам контекст изменения в дополнение к отметке времени, что намного полезнее и практичнее, чем «о, я последний раз модифицировал этот файл 26 дней назад». , я лучше загляну в свой .txt файл, посмотрю, что я там делал... ой, подождите, я забыл это записать, упс".
@jamesqf Томас прибил это. Вы просматриваете историю коммитов, чтобы увидеть, что было изменено, когда и как. С помощью инструмента сравнения вы даже можете увидеть построчное сравнение предыдущей и текущей версий файлов (или даже двух предыдущих версий). Ваша система управления версиями становится авторитетным источником этой информации. Это также значительно упрощает обмен историей с другими, что, я думаю, было бы полезно академическому сообществу. Кстати, вам обычно следует помещать несвязанные кодовые базы в разные репозитории. Это позволяет просматривать истории отдельно.
@Thomas: Извините, но это та же самая линия BS, которую я получаю от разработчиков: либо работайте так, как мы хотим, чтобы вы работали, либо заблудитесь. Извините, но я ПЫТАЛСЯ работать по-вашему, ребята. У меня не работает.
@jamesqf В этом случае было бы довольно легко написать хук для большинства систем VCS, чтобы он работал так, как вы хотите. Нет причин не иметь и то, и другое.
Причина, по которой временные метки сбрасываются, заключается в том, что если вы получите измененный файл в своей кассе, который был изменен вчера, но вы выполнили сборку сегодня утром, большинство систем сборки не примет это изменение (поскольку временная метка была старше, чем артефакты сборки). . С отметкой времени, установленной на время проверки, сборки будут работать.
@jamesqf Нравится вам это или нет, использование VCS является прагматическим обязательством. Если вы не используете VCS, многим потенциальным сотрудникам (включая почти всех опытных программистов) будет очень трудно серьезно отнестись к вашему проекту. И стимулом для этих «квазирелигиозных» парадигм дизайна является стремление к невыразимой элегантности, которая делает проект расширяемым для следующей теории и доступным для других.
@jamesqf Есть причина, по которой «разработчики» продолжают говорить вам об этом, потому что они правы. Кроме того, да, большинство научных программ действительно довольно плохие, в том числе и моя собственная. Я пишу код совершенно по-разному, когда пишу его для производственного проекта, который я намерен фактически поддерживать, и когда я пишу его в качестве проверки концепции для запуска некоторых симуляций для исследовательской работы. Я видел то же самое почти в каждом фрагменте исследовательского кода, который когда-либо видел. Есть несколько исключений, но они всего лишь исключения.
@jamesqf «Как может время файла не иметь значения? Возможно, если вы работаете только с одним набором кода, они не так важны, но если у вас много разных кодов, каждый со многими файлами (типично для научного программного обеспечения, по моему опыту ), очень полезно иметь возможность сразу увидеть, над какими именно файлами вы работали и когда». Э... разве это не та проблема, которую призван решить контроль версий?
@jamesqf Если использование системы контроля версий активно вызывает у вас проблемы, вам, вероятно, просто нужно немного переосмыслить свой рабочий процесс. Если вы можете сузить круг конкретных проблем, которые у вас возникают, вопросы о том, как вы можете подойти к ним по-другому, скорее всего, будут приветствоваться на страницах Programmers и StackOverflow. Дать ему шанс. Вы можете быть удивлены тем, насколько это улучшит ваш опыт. Я также скажу следующее: если вы пробовали git, эта система действительно сложна для изучения. Возможно, вам будет проще начать работу с SVN, который гораздо более интуитивно понятен и не так требователен к вашему рабочему процессу. SVN намного лучше, чем ничего.
Для тех, кто работает с программным обеспечением, ни один код не может быть идеальным. Но не позволяйте совершенству быть врагом «достаточно хорошего». Как уже говорили другие, кто-то может найти ваше программное обеспечение полезным. Если вы можете потратить время, чтобы немного почистить его и добавить несколько комментариев или README, тем лучше :)
Ужасно написано не только научное программное обеспечение. Я занимаюсь разработкой как в магазинах программного обеспечения, так и в производственных фирмах уже десять лет, и я обещаю вам, что код не станет чище. В любом месте. Написать красивый код очень сложно. Это как писать книгу. Первый набросок обычно отстой, но он действительно расскажет историю. Чтобы продать книгу, нужно сделать ее красивой. Чтобы порадовать ваших заинтересованных лиц на заводах, им просто нужно рассказать историю.
Эта ветка комментариев превратилась в разговор не по теме VCS. Пожалуйста, продолжайте обсуждение в чате Академии .
Я возился с GATT (программа для составления расписаний с использованием генетических алгоритмов, полигон для ряда докторов наук в Шотландии). Это сработало, но в коде было много закомментированного кода, неиспользуемых функций (из предыдущих тезисов), слишком общего кода (чтобы приспособить разные попытки) и очень узкого, трудно адаптируемого кода рядом. Соединение с запутанными структурами данных, которые иногда используются не по назначению. Очистка этого беспорядка была бы огромной задачей. Но это было хорошо, поскольку это было основой для исследовательской роли.

Я бы немного подчистил и поделился. Я выпустил много кода за эти годы, а также не выпустил код по причинам, которые вы указали.

Пройдитесь по нему и прокомментируйте его на любом уровне, на каком сможете. Оставьте в «неудачных попытках» и прокомментируйте их как таковые. Скажите, почему они потерпели неудачу, и что вы пытались. Это ОЧЕНЬ полезная информация для тех, кто придет после вас.

Сделайте файл README, в котором говорится, что вы выпускаете его по запросу в надежде, что он кому-то поможет. Скажите, что вы знаете, что код уродлив, но все равно надеетесь, что он будет полезен.

Слишком много людей сдерживают что-то, потому что это не идеально!

Я не могу одобрить уход из-за неудачных попыток. Вместо этого вы должны использовать контроль версий. Включение кратких комментариев, объясняющих, почему первоначальная попытка не удалась, — это нормально, но включение фактического неудачного кода может быть опасным.
@DavidZ Наоборот, покажи. Если вы используете контроль версий, люди могут видеть предыдущие варианты вашей работы, что далеко не бесполезно. Но если, как здесь, вы не используете ВК, то не удаляйте неудачные попытки. Поместите их в другой файл с соответствующими комментариями. Насколько это может быть вредно?
@coredump Это может сделать всю программу практически непонятной. Я видел, как это произошло. Если вы не используете VC, начните использовать его . Единственный способ, которым я мог бы поддержать рекомендацию не удалять неудачные попытки, - это если вам запрещено размещать код в ВК по какой-то причине, которую я не могу себе представить, и важно увидеть предыдущий код, чтобы понять, что сейчас происходит. код делает (что, вероятно, означает, что текущий код тоже плохой, хотя я допускаю, что исключения могут существовать).
@DavidZ Извините, но «Скажите, почему они потерпели неудачу и что вы пытались» - это хороший совет, ИМХО. Если ваш код запутан и/или вы не привыкли к методам разработки программного обеспечения, оставьте его как есть и прокомментируйте как можно больше. Удаление полезной информации может сделать вещи практически непонятными. Я видел, как это происходит ;-). Ладно, возможно, есть золотая середина между показом всех ужасных вещей, которые были предприняты, и оставлением полезных следов. Я думаю, что «я бы немного почистил его» — это тоже хороший совет.
@coredump Сказать, что вы пробовали в том смысле, что включили неудачный код, это хороший совет, когда вы просите о помощи, но не для написания самой программы.
Я не вижу, как неудачный код может помочь, кроме как запутать рабочий код (если только ошибки не ясны и, например, «гораздо более простой код, но работает только для положительных записей»). Но что хорошего делать комментарии (например, "было бы заманчиво использовать массивы, но они не будут работать для неуникальных записей").
Если код является реализацией исследовательской работы, и он пытался реализовать его по-разному, мое предположение состоит в том, что решение неочевидно. В ходе исследования кто-то еще может увидеть работающий код и подумать: «Я мог бы сделать это лучше таким образом», что может быть одним из способов, который автор попробовал первым. В CS мы плохо делимся своими неудачами, что иногда приводит к потере работы. Это моя точка зрения. Невозможно понять, хороший ли это выбор в_этом_ случае, не видя кода, но я знаю много других профессионалов, разделяющих эту точку зрения.
Совместное использование неудачных попыток отличается от смешивания сломанного кода с рабочим кодом, который ничего не дает, кроме как запутывает и мешает пониманию.

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

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

Очень верное замечание о воспроизводимости, особенно второй абзац.
@EP: Да. Прошу прощения, опять моя дистипика всплывает :-)

¿Вы думаете, что ваш код грязный? Я видел (и пытался работать) код, который вызывал у меня кошмары:

  • Пять уровней if Trueвложенности, разбросанных в случайных местах по коду.
  • Создайте массив нулей, преобразуйте его в градусы, возьмите косинус и вернитесь в радианы. Затем выбросьте результат.
  • В программном обеспечении, находящемся в стадии интенсивной разработки, список «поддерживаемых архитектур» настолько древний (и они сами говорят), что в наши дни было бы трудно достать один из этих компьютеров.
  • Функции, сломанные или измененные несколько версий назад, по-прежнему рекомендуются в документации.
  • Код, который переходит от использования стандартного формата ввода к некоторому собственному формату. Как его сгенерировать? На самом деле никто не знает, и разработчики машут рукой в ​​ответ.
  • Релизы, которые даже не компилируются. (Вы его даже тестировали?)
  • Меню графического интерфейса, к которым вы должны получить доступ в определенном порядке. В противном случае вы получите ошибку сегментации и вам придется начинать сначала.
  • Жестко запрограммированные пути разбросаны по коду./home/someguy/absurd_project/working/

И, мой личный фаворит, определенная программа из тысяч строк кода, использовала комментарии только для исключения случайных фрагментов кода, за исключением одного:

Здесь мы пробиваем карты.

Тем не менее, понятия не имел, что он делал.

И это только выход за рамки классических хороших практик, таких как однобуквенные переменные по всему коду, алгоритмы, нигде не указанные...

Если вас беспокоит качество вашего кода, это, вероятно, означает, что вы достаточно заботитесь о том, чтобы сделать его лучше среднего. Если вы подождете, пока код станет чистым, он может никогда не выйти наружу, и ваш научный вклад будет частично потерян.

На мой взгляд, важные вещи, о которых вы должны заботиться, по порядку:

  1. Форматы ввода и вывода. Упростите использование вашей программы в качестве черного ящика.
  2. Прокомментировано.
  3. Разборчивость. Использование идиоматического кода, хорошие имена переменных...
  4. Состав.

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

+1, но я бы также добавил соответствующую обработку ошибок в список важных моментов (слишком часто отсутствующих в коде поспешного исследования). В частности, будьте особенно осторожны с любой ошибкой, которая может незаметно повлиять на вывод - является ли возвращаемое значение этой функцией реальным числом ноль или нулем по умолчанию, возвращаемым при ошибке? (Не рисуйте их на графике!) Кроме того, ошибки следует обрабатывать, но не переусердствовать. Я видел наивно написанный «пуленепробиваемый» код, который мог молча восстанавливать искаженные входные данные и без жалоб продолжать выдавать результат. Авария может разочаровать, но неточные результаты могут стать катастрофой.
Что касается вашего пункта № 3 и чьего-то комментария об однобуквенных именах переменных: в научном программном обеспечении вы часто более или менее напрямую переводите математические уравнения в код. Если переменные в уравнениях представляют собой отдельные буквы, имеет смысл использовать их в качестве имен переменных в коде. И, как я признаю, мне следует чаще включать LaTeX для уравнений в комментарии. В остальном вы действительно не жили, пока не попытались отладить FORTRAN 66 с вычисляемыми и назначенными переходами GOTO :-)
+1 за ответ от @imsotiredicantsleep. Код, который молча дает сбой, с ним трудно работать. Если он будет генерировать неточные результаты, убедитесь, что вместо этого он генерирует предупреждение или выдает ошибку.

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

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

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

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

Теперь, если вы хотите произвести впечатление еще больше, это поможет ...

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

... если ваш код содержит файл readme, который связывает утверждения из вашей статьи с исходным кодом. Таким образом, когда я прочитаю статью и захочу узнать больше, я могу использовать файл readme, чтобы перейти к соответствующему месту в коде. Типичными фразами из такого ридми могут быть: «Алгоритм из раздела 3.2 статьи находится в файле algorithm/newversion/related/secondtry/foo.c» или «Повторить прогон с небольшим набором данных, описанным в разделе 2 статьи». бумага, запустить "сделать; сделать второй_шаг; наборы данных foo_bar_2/christmas.dataset. Этот запуск занимает около 2 дней на моем ноутбуке».

Вас также может заинтересовать CRAPL Мэтью Майта (лицензия на общественные исследования и академическое программирование), доступная по адресу http://matt.might.net/articles/crapl/ . Он содержит этот термин: «Вы соглашаетесь освободить Автора от стыда, смущения или насмешек за любые взломы, кладжи или прыжки веры, обнаруженные в Программе». Мне не ясно, имеет ли эта «лицензия» какую-либо юридическую силу, но цель ясна: выпустите свой уродливый код и не думайте плохо о уродливом коде других.

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

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

def main():
    get_foobar(x, y)


def get_foobar():
    return x**y


def get_foobar_legacy_1():
    """
    This attempt did not work for values > 100
    """
    return x + y


def get_foobar_legacy_2():
    """
    This attempt did not work on Wednesdays in September
    """
    return x - y

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

Это не является частью какой-либо передовой практики программирования. Предположительно неиспользуемый код должен быть закомментирован, чтобы какой-то код не продолжал вызывать get_foobar_legacy_43. И когда становится ясно, что он сломан, его следует удалить, если это возможно. Если понимание того, что какая-то неудачная попытка имеет смысл для читателей текущей версии (что случается), вы должны поместить ее в систему управления версиями и добавить комментарий, указывающий на соответствующий идентификатор коммита — возможно, с постоянной ссылкой.
@Blaisorblade: Вы правы, если цель состоит в том, чтобы разработать хорошо функционирующее приложение, то неиспользуемый код должен быть удален либо путем комментирования, либо путем передачи его в недра программного обеспечения системы контроля версий. Однако это не является целью, заявленной ОП. ОП должен задокументировать свои неудачи. Это способ сделать это. Хотя я вижу ценность в вашей точке зрения, и, возможно, каждый метод можно было бы закомментировать с помощью /* */синтаксиса блочного комментария. Интересно, что одним из немногих языков, не поддерживающих блочные комментарии, является Python, язык, который я использовал выше для псевдокода.
@Blaisorblade: еще лучшим решением может быть наличие отдельного файла, класса или каталога, который содержит неудачные попытки, отдельно от почтового кода приложения.
Документирование неудач не указано в вопросе, и я думаю, что это хорошая идея в некоторых случаях (скажем, для интересных, но неудачных попыток добиться вклада в статью). «Уход в неудачах», кажется, исходит из другого ответа, где у людей были сильные дебаты: academia.stackexchange.com/a/37373/8966 .

Конечно, вы должны поделиться исходным кодом.

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

Я думаю, вы должны поделиться этим. Прежде всего, вы должны сделать некоторые основные очистки. (например: нет более раннего кода, который больше не используется; нет кода в комментарии; допустимый способ комментирования и т. д.). ваши намерения. (например: todo: это должно быть изменено на перечисление) Я также думаю, что вы должны поделиться наиболее важной частью ваших алгоритмов. Когда я делюсь кодом, я никогда не делюсь неважными частями. Каждый может справиться с чтением/записью файлов, взаимодействием между потоками, графическим интерфейсом и так далее. Но не делитесь нечитаемым кодом. Это не имело бы смысла. Так что я думаю, что срединный путь является лучшим во многих случаях. :-)

Уборка в принципе хорошая. Однако, если ждать подходящего момента для очистки, это время может никогда не наступить. Я бы посоветовал сразу же поместить его в репозиторий контроля версий на Github или Bibucket или аналогичный и очищать его по мере необходимости. В любом случае, любой, кто его загружает, в основном будет смотреть на HEAD.

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

Для студентов, которые пересматривают код, это может быть хорошим опытом обучения. Что происходит, когда программисты программируют с мышлением, ориентированным на результат — или только на результат ? Они увидят это воочию. Они также могут применять некоторые из тех лучших практик, о которых они узнали. И они могут быть мотивированы сделать особенно хорошую работу, зная, что другие профессионалы уже заинтересованы в просмотре кода.

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

Если их усилия по рефакторингу провалятся, вы отстанете не дальше, чем были. Если это так, отказ от ответственности — замечательная вещь. Просто поделитесь кодом, но добавьте оговорку: «Это некрасиво. Когда я писал это, я пытался провести свое исследование — я не думал, что оно когда-либо выйдет за пределы моей компьютерной лаборатории. посмотреть, если вы действительно хотите».

Мне это нравится, я бы хотел иметь такой шанс, когда учился в универе. Чтение и понимание чужого кода — это навык, и ему нужно учиться.

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

  • Вам разрешено публиковать код?
    • Можете ли вы гарантировать, что использовали только те фрагменты кода, которые вам разрешено распространять? Или вы, возможно, использовали код из закрытых источников, который вы можете использовать для своего собственного внутреннего программного обеспечения, но который вам не разрешено публиковать? Можете ли вы гарантировать, что весь код, который вы использовали, может быть опубликован в одном полном пакете? Совместимость лицензий — нетривиальный вопрос.
    • Можете ли вы хотя бы достоверно узнать? Вы отдавали на аутсорсинг какие-либо части своей работы по кодированию или интегрировали неопубликованный код из других источников? Например, курировали ли вы каких-либо студентов во время их выпускных работ или нанимали ли каких-либо студенческих помощников-исследователей, чья работа была основана на ваших исследованиях, и поэтому их код был добавлен в вашу кодовую базу? Вносили ли какие-либо коллеги код в вашу кодовую базу? Они получили часть своего кода от студентов? Все ли эти вовлеченные люди должным образом обращали внимание на вопросы лицензирования (если у них вообще были знания, чтобы вынести обоснованное суждение по этим вопросам лицензирования)? Можно ли еще определить, откуда взялись те или иные части кода? Люди, которые внесли свой вклад в каждую часть, все еще знают? Являются ли они для вас все еще «в пределах досягаемости»?
    • Был ли код разработан в рабочее время на средства третьих лиц? Если да, разрешают ли условия контракта о финансировании публиковать код или включают ли они какие-либо требования о том, что программное обеспечение, созданное в рамках финансируемого проекта, должно предоставляться исключительно партнерам по проекту?
  • Достаточно ли у вас ресурсов (времени и прочего), чтобы потратить усилия на очистку кода и его комментариев таким образом, чтобы он по-прежнему имел смысл, но не предоставлял никакой информации, которая не должна стать общедоступной?
    • Есть ли у вас какие-либо комментарии, раскрывающие, кто работал над кодом? Было ли людям, которые предоставили код, официально разрешено работать над соответствующим исследованием в соответствии с их финансированием? (Разработчики программного обеспечения хорошо осведомлены о том, что командная работа и повторное использование компонентов являются ключевыми аспектами разработки программного обеспечения. К сожалению, финансирующие агентства обычно очень не осведомлены об этом и предполагают, что если разработчик A финансируется из проекта X, а разработчик B финансируется из проекта Y, A работает исключительно над X, а B работает исключительно над Y, и раскрытие информации о том, что A потратил всего полчаса на то, что закончилось проектом Y, может привести к серьезным последствиям, таким как возврат части финансирования.)
    • Выдает ли что-либо в опубликованных данных какую-либо информацию об особенностях выполнения работы, которая не должна стать достоянием гласности?Это особенно важно, если вся история коммитов в системе контроля версий станет общедоступной (или, практически, означает, что история коммитов никогда не должна публиковаться), но может также сыграть роль в других ситуациях. Например: выполнялась ли какая-либо работа над кодом вне официально установленного рабочего времени (например, в выходные дни)? Выдает ли рабочее время, что вы работали больше установленного в вашей стране рабочего времени в день? Выдает ли рабочее время, что вы не соблюдали установленные законом перерывы? Выдает ли рабочее время, что люди, назначенные на другие проекты, внесли свой вклад? Предоставляет ли рабочее время какую-либо причину, чтобы не доверять каким-либо заявлениям, которые вы сделали в отношении своего рабочего времени (например, в отчетах об успешном выполнении проекта, требующих подробного распределения рабочего времени по заранее определенным рабочим пакетам с определенными максимальными отводами)? Выдает ли что-нибудь, что вы работали в ситуациях, когда вам не следовало работать (например, во время совещания по проекту)? Выдает ли что-нибудь, что вы работали в местах, где вам не следовало работать (например, из дома, когда ваш контракт не позволяет вам работать на дому, например, из-за осложнений, связанных со страховкой)?
    • Есть ли в коде какая-либо секретная информация , такая как пароли, имена учетных записей пользователей или URL-адреса, которые не должны быть общеизвестны (поскольку серверы не предназначены для обслуживания большего количества пользователей, помимо небольшого числа избранных людей, которым была предоставлена URL для тестовой настройки лично)?
  • Может ли код использоваться кем-либо еще?
    • Будет ли работать код или он потребует значительных усилий по настройке? Можете ли вы потратить усилия, необходимые для объяснения того, какая конфигурация необходима?
    • Можно ли компилировать код? Использовали ли вы какие-либо неофициальные модифицированные или специально созданные компиляторы, которые не являются общедоступными? Если да, добавляет ли этот код что-либо сверх того, что уже может быть представлено в ваших статьях в качестве алгоритма псевдокода?
    • Требует ли код каких-либо внешних ресурсов? Будет ли код полезен только в том случае, если он может получить доступ к серверам, библиотекам или наборам данных, которые вы не можете опубликовать вместе с кодом по той или иной причине? Можно ли предоставить хотя бы описание этих ресурсов, или на их интерфейсы распространяется какое-то соглашение о неразглашении?
    • Вносит ли код какие-либо необратимые изменения в системы, на которых он работает? Например, изменяет ли он автоматически какую-либо конфигурацию системы (например, перезаписывает путь системного поиска)? Осуществляет ли он какой-либо низкоуровневый доступ к аппаратным компонентам, который в определенных сочетаниях (которых вы избегаете в своих тестовых установках) может привести к необратимому повреждению каких-либо компонентов? Можете ли вы надежно предупредить пользователей кода о таких возможных нежелательных побочных эффектах?
Вы считаете, что финансирующие агентства или работодатели просеивают журналы коммитов, чтобы определить юридические последствия. Это явное теоретическое беспокойство. Итак, у вас есть какие-либо доказательства того, что это когда-либо происходило? Мой ограниченный опыт работы с финансирующими агентствами, в частности с грантами ERC, на самом деле говорит об обратном, хотя это и не считается.
@Blaisorblade: «Итак, у вас есть доказательства того, что это когда-либо происходило?» - Мотивация спонсора в поиске возможностей для сокращения своих затрат кажется очевидной, а возможные последствия, которые могут быть применены (возврат части денег гранта), достаточно суровы (потеря ранее предоставленных денег, вероятно, является одной из немногих вещей, которые могут вызвать серьезные проблемы у сотрудников универа с администрацией универа), что представляется разумным вообще не открывать эту возможную точку атаки.

Конечно. Единственный способ стать лучше в написании хорошего программного обеспечения — это получать отзывы (всех видов). Если вы боитесь обратной связи, то далеко не продвинетесь. Три основы написания отличного программного обеспечения — это практика, практика и еще раз практика.

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

Вы можете просто отправить его на GitHub и попытаться поддерживать проект на случай, если другие люди, заинтересованные в вашем проекте, смогут легко получить доступ к вашему коду и, возможно, они смогут помочь улучшить ваш код.

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

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

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

Многие люди находят такую ​​работу очень приятной, и если ваш код действительно полезен для них, они могут быть счастливы этим заняться. В любом случае вы можете обнаружить, что получение отзывов от людей, которые пытались его использовать, но нуждаются в какой-либо помощи, является хорошей мотивацией для вас, чтобы сделать его более удобным в обслуживании/более простым в использовании и понимании.

Делитесь, если хотите, не делитесь, если не хотите. Я знаю, что это звучит язвительно, но я думаю, что в наши дни слишком много давления, чтобы «делится всем», и люди попытаются сделать вас виновным в том, что вы не делитесь, но на самом деле вы не обязаны чем-либо делиться.

Воспроизводимые результаты являются одним из краеугольных камней научного метода. А для этого нужно делиться. Ваш комментарий сродни высказыванию "...но на самом деле, Ученые не обязаны придерживаться научного метода".
Конечно, совместное использование может быть факультативным за пределами научного сообщества, но точно не является факультативным внутри научного сообщества.
@Contango Да, это справедливо, если выпуск программного обеспечения помогает воспроизвести результаты.
@JeffE Я ничем не делился, о чем ты говоришь? Я нахожу ваше сообщение загадочным. Если вы хотите, чтобы вас поняли, пожалуйста, будьте немного яснее.
Вы поделились своим мнением, конечно.

Вы обязательно должны поделиться своим кодом.

Для сортировки создайте области из одних и тех же частей кода, например, сделайте область неудачной попытки, и объясните, почему она не удалась. Кроме того, если вы разрабатываете в Visual Studio, установите расширение «CodeMaid» из Extension Manager и полностью очистите свое решение. Он удалит пробелы, а также удалит неиспользуемые ссылки, благодаря чему большинство вещей будет выглядеть лучше.

Если вы разрабатываете на C#, поделитесь со мной своим кодом. Я также могу помочь вам с сортировкой :)

@Zuberi005 — единственный человек, который предлагает автоматизированное решение для очистки кода, и единственный человек, который лично предлагает помощь в очистке кода. А кто-то минусовал? Позор им!

Поместите заявление об отказе от ответственности, что код предоставляется «как есть», без обещаний поддержки и т. д. А затем поделитесь кодом.

Практический пример: Превращение облака изолированных точек в водонепроницаемую поверхность — чрезвычайно важная практическая задача, используемая везде, от робототехники до компьютерного зрения и обработки данных с 3D-сенсоров, таких как Microsoft Kinect.

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

Да. Вы должны выпустить свой код, вероятно, под лицензией CRAPL. Цель состоит в том, чтобы построить лучшее будущее, и ваш паршивый код поможет людям в этом. Предостережение заключается в том, что вы должны задокументировать, как успешно работать с кодом, достаточно хорошо, чтобы кто-то имел приличный шанс воспроизвести любые опубликованные результаты.

И не беспокойтесь — один фрагмент исследовательского кода, над которым я работал, был разработан пятью постдоками с нейтральными способностями к программированию для серии проектов в течение примерно 8 лет.

Список глобальных переменных (только имена) занял примерно 4 страницы.

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

Было примерно 50 недокументированных версий, хранившихся в случайных частях сервера группы, каждая из которых служила по крайней мере одной конкретной цели, и только один администратор держал эти конкретные цели в своей голове. Чаще всего люди использовали «неправильную» версию для определенной цели.

Использование невероятно сложных рекурсивных процедур, например, для записи файла, было стандартным. Серьезно - несколько тысяч строк для сохранения результатов изображения.

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

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

Было где-то между 0 и 1 способами работы с программным обеспечением и получения правильных результатов в любой момент...

И да, были гото.

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

Приблизительно 90% любой заданной функции совершенно достоверно не имели отношения к результату или к отладке результата — скорее, они состояли из краткосрочных проектов, вставленных, а затем никогда не удалявшихся. Серьезно - я написал полнофункциональную версию, которая действительно работала и была размером 1/10 от размера ... Значительные доли были скопированы вставленными функциями, многие из которых отличались друг от друга.

И нет Вирджинии, нет документации. Или описательные имена переменных.

О, и недокументированные, глючные, dll и связанные с ними библиотеки, созданные с использованием кода, которого больше не существует.

Все написано в матлабе. С точки зрения методов кодирования Matlab предположим, что обильное использование eval будет основным моментом вашего дня.

Серьезно, ваш код не так уж и плох.

Тем не менее, если вы сделали что-то действительно полезное, выпуск исправленной версии может помочь вам в карьере, чтобы другие люди могли использовать и цитировать вашу библиотеку. Если вы только что что-то сделали, то воспроизведение — это, пожалуй, все, на что вам стоит пойти.