題:
我應該分享我的可怕軟件嗎?
qsp
2015-01-23 03:21:48 UTC
view on stackexchange narkive permalink

發表論文後,有人要求我分享我開發的軟件。起初,我很高興自己的論文引起了人們的關注,並且不僅分享了二進製文件,而且還分享了源代碼,案例研究等。但是看著我的軟件,我感到很尷尬。

我的軟件簡直太恐怖了:源代碼簡直一團糟,其中包含我幾次失敗的嘗試。我從未使用過設計模式,因此到處都有重複的代碼。為了簡化和快速實現,我經常更喜歡遞歸而不是循環等。

我總是承受產生新結果的壓力,清理這些代碼將花費我大量的精力。

我的問題是,共享這個可怕的軟件是否會給人們帶來對我的負面印象?如果我共享的人是在同一領域工作的潛在合作者,雇主,這會對我的職業造成傷害。

聽起來像學術軟件。
相關:[如何共享計算機代碼](http://academia.stackexchange.com/questions/16785/how-to-share-computer-code?lq=1)和[“研究”代碼的最佳實踐模型? ](http://academia.stackexchange.com/q/21276/10643)和經典著作:[為什麼許多才華橫溢的科學家編寫可怕的軟件?](http://academia.stackexchange.com/q/17781/10643)
我不確定我能為您提供多少幫助,但是我看過這個視頻,根據您的問題,這可能會給您帶來一些鼓勵。 https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0CCsQtwIwAg&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv% 3D0SARbwvhupQ&ei = k2rBVKP8J8P1OPbMgagL&usg = AFQjCNEIXszWW5AeYeh5TglmX2_yHFD7WA&bvm = bv.83829542,d.ZWU對不起,我想幫您更多,我只想向您展示此視頻。
骯髒的秘密:*大多數*學術軟件是可怕的。甚至從計算機科學係出來的東西。
您可以根據CRAP許可發布它:http://matt.might.net/articles/crapl/
研究通常涉及嘗試一千種不起作用的事情。如果您設法編寫在前幾次嘗試中都能起作用的代碼,則您可能不是在做研究,而只是在執行。
[這篇論文](http://www.siam.org/news/news.php?id=2064)在SIAM期刊上引人入勝,引人注目。
需要考慮的另一點:如果您的某些結論是基於軟件錯誤引起的虛假數據怎麼辦?讀者應該能夠檢查一下。
將代碼發佈到諸如GitHub之類的公共場所使您有機會展示如何逐步改進軟件。在不更改軟件生成結果的情況下顯著改進軟件並非易事,因此是一項備受重視的技能。您可能會發現將一些代碼發佈到代碼查看站點https://codereview.stackexchange.com/可以在此處獲得幫助。
@qsphan出於好奇,您的論文是關於什麼的?
要添加到對話中:http://www.phdcomics.com/comics/archive.php?comicid=1692
@mankoff:請不要。該許可證是“糟糕的”。在3句BSD下發布它,並貼上一個大大的標籤,警告它質量是一個更好的選擇。
許多非學術軟件也很混亂。最近的bash錯誤...
Blah,作為一名程序員:“我一直承受著產生新結果的壓力,而清理這些代碼將使我付出巨大的努力。”您是否意識到承受如此巨大壓力的原因是因為您花費大量時間對代碼進行調試以至於您從未費心編寫或維護正確的代碼?
即使代碼確實很糟糕(我對此表示懷疑),它仍然經過了艱苦的測試和調試,比使用最新的設計模式等還有價值得多。請確保在基礎平台上添加詳細說明(Ubuntu 12.04,OS X如果使用XCode 10.7和libX版本Y等),可能會產生細微的差異,從而產生問題,以及有關如何編譯和鏈接程序的完整說明。您在編寫它時可能已經實現了某種程度的自動化-只需記下它,以便其他人可以看到。
除非編程語言不支持優化遞歸,否則遞歸沒什麼問題
@Philipp:更讓我擔心的是這種情況是正確的,但是代碼中有一個討厭的錯誤。在那種情況下,修復錯誤將改變答案的正確性,但不會(說出)其性能特徵...因此,如果發布代碼,那麼即使結果可能不會失效,也有使自己尷尬的風險。 (我之前在自己的代碼中發現了這類錯誤。)
是否學術都沒關係。 http://blog.codinghorror.com/version-1-sucks-but-ship-it-anyway/
@Mark:大多數軟件都是可怕的,句號。不僅僅限於學術,也不是真正的秘密。 ;-)
除此之外,即使每天在主要應用程序中使用的科學軟件也變得混亂和可怕-Met Office使用的代碼仍在Fortran中,並且幾十年前遍布各地...
@djechlin儘管偶爾會如此,但“壓力的根源是您的不良編碼”並不總是可以推廣。除非我的Python技能引起了最新的埃博拉疫情?
@Fomite關於您的Python技能的一些原因,就是為什麼您還沒有完成埃博拉病毒的研究,如果您想這樣說:P
@djechlin不,我認為這可能與仍然垂死的人們有關...
@Fomite如果有人死了,為什麼還要花那麼多時間寫代碼呢?
@Fomite我的意思是,如果要“做”它,那麼它應該“做得好”,而“快速”做,如果這是您工作中的“主要”瓶頸。我想您可以說工作中的主要瓶頸是ebola的普及率,但是在那之後,這真是一個極好的機會,這可能是您的代碼工作得很好的方式。但是,如果您要堅持埃博拉病毒的存在是問題所在,那麼您將擁有更大的權力。
@djechlin我只是在指出,對學者施加壓力的根源歸結為不良編碼,這一觀點既極度自以為是,而且絕對不能推廣。
是否可以與本科生或研究生CS學生合作,並讓他們“清理”一些代碼?
程序員的建議:不要將失敗的嘗試作為註釋掉的代碼或未使用的類。而是經常將(半)工作版本提交到源代碼管理(GIT)。__總是__刪除不再需要的無效代碼!如果必須返回到較早的版本,請從源代碼管理中還原它。這樣一來,您可以更輕鬆地掌握代碼,因為要讀取的代碼要少得多。關於您的代碼未使用精美的設計模式等方面,這可能是一件好事,請使其盡可能簡單,僅在絕對需要的地方增加複雜性。
十八 答案:
Ian
2015-01-23 03:31:21 UTC
view on stackexchange narkive permalink

是的,應該。

首先,大多數科學軟件都非常糟糕。如果您的性能差於平均水平,我會感到非常驚訝:僅您知道設計模式以及遞歸和循環之間的差異就表明它更好。

第二,您不太可能擁有激勵或動機除非或直到其他人(或您在6個月內)需要它,否則它才能變得更好。

潛在的好處:可能的新合作者,錯誤修復,擴展,出版物。

潛在的缺點:時間浪費(為他人維護代碼或解決問題),被挖出來。我會很清楚:我不會非常認真地對待這些缺點中的任何一個。

大多數科學軟件並不可怕。 (幾十年來,我一直在與之合作並對其進行優化,因此我認為我有充分的見解。)善良的標準完全不同:工作,在實際時間內獲得正確答案,可擴展而不是遵循最新的準宗教設計範式或語言趨勢。對於OP,如果您對“可怕”的軟件進行清理和評論後,可能比“好的”代碼對其他科學家更易訪問。
我要補充一點的是,我建議通過Github或類似的網站進行共享,該社區擁有生機勃勃的社區,可以使人們更輕鬆地進行協作,創建項目並為之貢獻。
沒有提到房間裡的大象,_可複制性_?
@jamesqf:我誇大了效果,但是我的想法是這樣。大多數科學軟件都是簡短的原則證明,一次性代碼。根據我的經驗,它很少在小組之外發布,並且編寫得很差。大多數科學軟件*能夠以合理的規模運行*並不可怕(我也曾在類似的時間範圍內使用過某些軟件):它不能產生多個出版物。但是我在這裡考慮“科學家編寫的所有代碼”。
@mmalmeida我同意,Github是協作的渠道。問題和里程碑提供了一種跟踪問題和增強請求的方法。在開源此代碼之前,我還建議您花一些時間來清理它,或至少在其中添加描述性註釋。
@jamesqf好吧,最糟糕的是。我還要說我有一個見識的見解。對於程序員來說,代碼的工作方式並不是代碼“好”的標準,至少一個被認為是好的代碼。正確性是“必須”的屬性。發散率,數值穩定性,速度(不包括特定於硬件的優化)等是代碼實現的算法的屬性。您可以執行相同的好代碼和壞代碼。儘管我確實承認“好”太含糊,並且經常導致誤解。我會說“代碼質量”通常很糟糕。即使程序運行良好。
我遇到的大多數@jamesqf:科學軟件都沒有任何源代碼控制,這聽起來像是另一個示例(或者為什麼其他所有失敗的嘗試仍然存在)。
@RemcoGerlich:嗯,有一個示例說明了“好”的不同標準。我尚未找到沒有明顯的主要設計缺陷的源代碼控制系統:從系統中檢出文件會將其時間戳重置為檢出時間,而不是上次修改時間。這些系統的實現者顯然認為這是一個“好”功能-我已經在用戶論壇中討論了幾個問題-但最終結果是除非明確付款,否則我不會使用版本控制。
@jamesqf:並不個人使用,但是在不使用源代碼控制的愚蠢原因列表中排名很高(此外,對於“正常” VCS,它可能需要20行腳本來“修復”這一“主要設計缺陷” )。
@jamesqf我根本沒看過文件時間戳的問題,*根本*。我什至可以認為唯一會影響任何東西的情況就是`make`,並且當您進行乾淨簽出時,沒有二進製文件可以檢查它們是否需要重建。源代碼控制的好處是顯而易見的:跟踪更改(在實踐中*非常*有價值),防止丟失,更易於與同事共享以及使人們可以同時在同一代碼庫上工作。您的問題似乎非常晦澀,我敢打賭,這些收益本身就超過了您特定用例的弊端
Sage項目(http://www.sagemath.org)是一個數學研究軟件的生動示例,儘管不時有設計討論和對編碼實踐的抱怨,但它並非*可怕。
@jpmc26:文件時間如何無關緊要?也許如果您只處理一組代碼,它們並不是那麼重要,但是如果您有許多不同的代碼,每個代碼包含許多文件(以我的經驗,這是典型的科學軟件),那麼能夠看到一目了然(通過執行例如'll *。[chyl]'即可準確地確定您何時處理的文件。現在,我同意正確工作的源代碼控制系統將是一個不錯的工具。問題是!@#構建它們的$ s絕對拒絕實施此非常簡單的修復程序。
@jamesqf提交(大多數源代碼控制系統的核心)具有時間戳。例如,在git中,為數據文件的每次修改創建提交,例如“使用修訂版XXX中的新代碼進行重新仿真”。對於代碼的每次修改,請提交內容為“原因為YYY的XXX中改進的代碼”的提交。然後,您將獲得一個不錯的提交列表,以及提交的時間,確切地添加/修改/刪除了哪些文件以及有用的註釋,而不是使用文件的“最後修改日期”。沒有修復程序可以完成,您根本不知道如何正確使用源代碼控制。
更不用說如果您真的需要此功能,則任何源代碼控制軟件都可以讓您詢問上次修改文件的時間。實際上,大多數方法會超越此範圍,並告訴您哪個提交最後一次影響了文件,除了時間戳之外,還為您提供了更改的上下文,這比“哦,我上次修改此文件是26天前,我最好查看.txt文件,看看我在那裡做了什麼...哦,等等,我忘了記下來,哎呀。”
@jamesqf托馬斯(Thomas)釘牢了它。您查看提交歷史記錄,以了解更改的內容,時間和方式。使用差異工具,您甚至可以逐行比較文件的先前版本和當前版本(甚至是兩個先前版本)。您的源代碼管理成為此信息的權威源。這也使與他人共享歷史變得更加容易,我認為這對學術界來說是有價值的。附帶說明,通常應該將不相關的代碼庫放在不同的存儲庫中。這使您可以分別查看歷史記錄。
-1
-1
重置時間戳的原因是,如果您在昨天結帳的結帳單中得到了一個更改的文件,但是今天早上您進行了構建,則大多數構建系統都不會選擇更改(因為時間戳早於構建工件) 。將時間戳記設置為結帳時間後,構建便可以工作。
-1
@jamesqf“開發人員”不斷告訴您的原因-是因為他們是對的。而且,是的,大多數科學軟件的確確實很糟糕,包括我自己的軟件。在為實際打算維護的生產項目編寫代碼時,與為研究論文運行某些模擬的概念證明編寫代碼時,我的編寫方法大不相同。從我見過的幾乎所有研究代碼中,我都看到了相同的結果。有一些例外,但僅此而已:例外。
@jamesqf“文件時間怎麼都沒關係?也許,如果您僅處理一組代碼,它們就沒那麼重要了,但是如果您有許多不同的代碼,並且每個代碼中都有許多文件(根據我的經驗,這是典型的科學軟件) ,一眼就能清楚地看到您在何時處理了哪些文件,這真的很有用。”呃...不是版本控制要解決的問題嗎?
@jamesqf如果主動使用源代碼管理會引起問題,則可能只需要重新考慮一下工作流程即可。如果您可以縮小所遇到的特定問題,那麼最有可能在Programmers和StackOverflow上歡迎有關如何以不同方式解決這些問題的問題。試一試。您可能會對它極大地改善您的體驗感到驚訝。我也要這樣說:如果您嘗試過git,那麼該系統確實很難學習。您可能會更輕鬆地開始使用SVN,這更加直觀,並且對工作流程的要求也不高。 SVN遠勝於無。
作為從事軟件工作的人,沒有代碼是完美的。但是,不要讓完美成為“足夠好”的敵人。正如其他人所說,有人可能會發現您的軟件有用。如果您可以花點時間清理一下並添加一些註釋或自述文件,那就更好了:)
編寫的不只是科學軟件。我在軟件商店和製造公司中從事開發工作已有十年了,我向您保證代碼不會變得更乾淨。任何地方。編寫漂亮的代碼非常困難。就像寫書一樣。通常,初稿很爛,但實際上可以說出故事。要出售一本書,您必須使其美麗。為了取悅工廠中的利益相關者,他們只需要用它來講述故事即可。
該評論線程已變成有關VCS的話題外對話。 **請與[聊天]進行更多討論。**
我欺騙了GATT(一種使用遺傳算法進行時間安排的程序,這是蘇格蘭一系列博士學位的測試平台)。它起作用了,但是該代碼包含了很多註釋掉的代碼,未使用的功能(來自先前的論文),過於籠統的代碼(以適應不同的嘗試)以及非常狹窄且難以並行使用的代碼。具有復雜數據結構的化合物,有時將這些數據結構混入非設計用途。清理這些混亂將是一項艱鉅的任務。但這很好,因為它是勘探角色的框架。
Blair MacIntyre
2015-01-23 03:31:26 UTC
view on stackexchange narkive permalink

我會整理一下並分享。這些年來,我已經發布了很多代碼,並且出於您給出的原因也沒有發布代碼。

仔細研究並註釋它,並以任何級別進行。保留“失敗的嘗試”,並對其進行評論。說出他們為什麼失敗,以及您嘗試了什麼。這對跟隨您的人來說是非常有用的信息。

製作一個自述文件,要求您將其發布,以希望對您有所幫助。假設您知道代碼很醜陋,但還是希望它有用。

因為它不是完美的,所以有太多人阻止了事情!

我不能支持失敗的嘗試。您應該改用版本控制。包括簡短的註釋,這些註釋可以解釋最初嘗試失敗的原因是可以的,但是包含實際失敗的代碼可能會帶來積極的危害。
-1
@coredump它可能使整個程序幾乎無法理解。我已經看到了這種情況。如果您不使用VC,請_開始使用它_。我支持不刪除失敗嘗試的建議的唯一方法是,如果出於某些我無法想像的原因而禁止將代碼放入VC,請務必閱讀前面的代碼,以了解當前的代碼。代碼確實可以做到(儘管我承認可能存在異常,但這也可能意味著當前代碼也很糟糕)。
-1
@coredump當您尋求幫助時,說您嘗試過包括失敗代碼在內的嘗試是一個很好的建議,而不是編寫程序本身。
除了混淆工作代碼外,我看不到失敗的代碼有什麼幫助(除非錯誤明確,例如“更簡單的代碼,但僅適用於肯定的輸入”)。但是發表評論是件好事(例如,“使用數組會很誘人,但它們不適用於非唯一條目”)。
如果該代碼是研究論文的實現,並且他嘗試以不同的方式實現,那麼我的假設是該解決方案不是顯而易見的。在研究中,其他人可能會看到工作代碼並認為“我可以通過這種方式做得更好”,這可能是作者首先嘗試的方法之一。在共享失敗方面,我們在CS方面做得很差,有時會導致工作丟失。這就是我的意思。在不看到代碼的情況下,無法確定in_this_案例是否是一個不錯的選擇,但我知道很多其他教授都對此觀點表示贊同
共享失敗的嘗試不同於將損壞的代碼混合到工作代碼中,除了混淆和妨礙理解之外,它什麼也做不了。
jamesqf
2015-01-23 04:26:19 UTC
view on stackexchange narkive permalink

是的!特別是如果您的紙張是關於您已經實施的新算法/改進算法,或者進行了重要的非標準數據分析,或者基本上所有復制結果都意味著重新實現軟件的事情。

紙張很少有空間提供更多功能比大綱。我知道我花了很多時間來嘗試從那些遺漏了關鍵(但與論文並不嚴格相關)細節的論文中實施算法。

關於再現性的非常真實的評論,尤其是第二段。
@E.P:是的。對不起,這是我的dystypica再次出現:-)
Davidmh
2015-01-23 15:05:12 UTC
view on stackexchange narkive permalink

?您認為您的代碼混亂嗎?我已經看到(並嘗試使用)令我惡夢的代碼:

  • 嵌套了五層 if True ,通過代碼分散在任意位置。
    • li>
    • 創建一個零數組,將其轉換為度,取餘弦,然後返回弧度。然後,扔掉結果。
    • 在正在大量開發的軟件上,“受支持的體系結構”列表非常古老(而且他們確實說了自己),很難使用這些計算機之一。
    • 功能已在多個版本中被破壞或修改,但仍在文檔中推薦。
    • 代碼從使用標準格式輸入變為自己的某種格式。如何產生呢?沒人真正知道,開發人員會做出回應。
    • 發布甚至無法編譯的版本。 (您甚至測試過嗎?)
    • 必須按特定順序訪問的GUI菜單。否則,您將遇到分段錯誤,並且必須從頭開始。
    • 通過代碼分散的硬編碼路徑。因此,您必須遍歷幾個文件來查找並將所有 / home / someguy / absurd_project / working / 的出現更改為您自己的。

    而且,我個人最喜歡,這是一個包含數千行代碼的特定程序,僅使用註釋消除了隨機的代碼位,除了以下內容:

    在這裡我們打卡。

    仍然,不知道它在做什麼。

    這只是在經典的良好實踐知識之外,例如整個代碼中的一個字母變量,未在任何地方指定的算法...

    如果您擔心代碼的質量,則可能意味著您已經足夠在意它的質量,使其優於平均水平。如果您等到代碼乾淨之前,它可能永遠不會消失,您的科學貢獻將被部分損失。

    我認為,您應該依次關注的重要事項是:

    1. 輸入和輸出格式。使用可用的標準,不使用時簡化。簡化將程序用作黑盒的操作。
    2. 評論。功能的簡要說明,算法的快速概述。
    3. 可信度。使用慣用的代碼,好的變量名...
    4. 結構。當您知道要做什麼時,這會更容易,而在研究代碼中通常不是這種情況。只有在社區中有興趣時,您才可以考慮對其進行重構。
    5. ol>

      因此,只要有1個,就發佈軟件(編寫時應同時包含2個和3個部分) 。

+1,但我還要在要點列表中添加適當的錯誤處理(在急需的研究代碼中經常會丟失)。特別要特別注意任何可能會無聲影響輸出的錯誤-該函數的返回值是實數為零還是默認為錯誤返回值? (不要繪製這些!)此外,應該處理錯誤,但不要過度處理。我見過天真的編寫過的“防彈”代碼,可以從亂碼的輸入數據中默默恢復,並繼續產生輸出而不會受到投訴。崩潰可能令人沮喪,但不正確的結果可能是一場災難。
關於第三點,還有其他人對單字母變量名稱的評論:在科學軟件中,您或多或少會直接將數學方程式轉換為代碼。如果方程式中的變量是單個字母,則在代碼中將它們用作變量名非常有意義。而且,正如我承認的,我應該做的更多,在註釋中加入LaTeX。對於其餘的內容,直到嘗試使用計算和分配的GOTO調試FORTRAN 66之前,您還沒有真正活過:-)
+1以獲取@imsotiredicantsleep的回答。靜默失敗的代碼很難使用。如果要生成不正確的結果,請確保它生成警告或引發錯誤。
Toxaris
2015-01-26 16:07:07 UTC
view on stackexchange narkive permalink

您要問的是,共享低質量的軟件是否會給您留下不好的印象。我認為共享軟件絕對會給人留下很好的印象。

  1. 作為計算機科學家,我喜歡同事公開源代碼。這使我更有可能更深入地研究他們的作品,也許與他們聯繫,甚至引用他們,因為還有更多的工件可以與之交互(不僅是論文,而且還有代碼)。

  2. 當一篇論文報告的結果得到了源代碼“證明”但源代碼不是公開的時,我常常想知道結果是否真實。查看源代碼(或者只是源代碼的可用性,而不用看它)可以說服我。

  3. ol>

    因此,共享您的源代碼,無論是否可怕,

    現在,如果您想給人留下深刻的印象,它將對您有幫助或幫助...

    ...

    ...,如果您的代碼包含一個自述文件,該文件將您的論文聲明與來源聯繫起來,那麼在github之類的網站上發出請求時,即當我看到其他人試圖與您聯繫並且您做出反應時。碼。這樣,當我閱讀本文並想了解更多信息時,可以使用自述文件跳到代碼中的適當位置。這樣的自述文件中的典型短語可能是:“本文第3.2節中的算法在文件algorithm / newversion / related / secondtry / foo.c中”或“使用第2節中描述的小型數據集重複運行”在紙上運行“ make;第二步; foo_bar_2數據集/christmas.dataset。在我的筆記本電腦上運行大約需要2天。

    您可能還對 http://matt.might.net/articles/crapl/上的Matthew Might的CRAPL(社區研究和學術編程許可證)感興趣。它包含以下術語:“您同意使作者免於程序中發現的任何駭人聽聞,尷尬或信仰飛躍的尷尬,尷尬或嘲笑。”對於我來說,尚不清楚此“許可證”是否具有法律效力,但其意圖很明確:釋放您的醜陋代碼,不要認為別人的醜陋代碼不好。

dotancohen
2015-01-25 17:28:40 UTC
view on stackexchange narkive permalink

與您有切身關係,我將針對您的問題如何進行共享(而不是應該共享已經有答案的軟件)。

將失敗的嘗試有效地放入版本控制中意味著沒有人會看到它們。我處理此問題的方法是將每次嘗試都放入一個方法中,而每個失敗的嘗試都放在一個單獨的方法中:

  def main():get_foobar(x,y)def get_foobar():返回x ** ydef get_foobar_legacy_1():“”“此嘗試不適用於值> 100”“” return x + ydef get_foobar_legacy_2():“”“此嘗試在9月的星期三不起作用”“” return x-y  

根據下面的評論,可能是將這些方法放在單獨的FailedAttempts或BadIdeas類中是一個好主意。這具有很好的效果,可以根據實際需要對過程的各個階段進行劃分。我發現計算機程序員對於何時將邏輯分解為方法以及何時不將邏輯分解為方法常有訣竅,但是計算機科學家通常沒有。這種方法可幫助計算機科學家在必要時分解為一種方法。

這不是任何最佳編程實踐的一部分。假設實際上應該註釋掉未使用的代碼,以免某些代碼繼續調用`get_foobar_legacy_43`。如果發現失敗了,那麼應該將其刪除。 ID-可能帶有永久鏈接。
@Blaisorblade:沒錯,如果目標是開發功能良好的應用程序,則應通過註釋或將其移至源代碼控制軟件的深度來刪除未使用的代碼。 **但是,這不是OP規定的目標。** OP需要記錄其失敗情況。這就是這樣做的方式。儘管我確實看到了您的觀點的價值,但也許可以使用`/ * * /`塊註釋語法來註釋掉每種方法。有趣的是,少數不支持塊註釋的語言之一是Python,這是我在上面的偽代碼中使用的語言。
@Blaisorblade:甚至更好的解決方案可能是擁有一個單獨的文件,類或目錄,其中包含失敗的嘗試,並與應用程序的郵件代碼分開。
問題中沒有提到記錄失敗的問題,我認為*在少數情況下*是一個好主意(例如,為了獲得論文的貢獻而進行的有趣但失敗的嘗試)。 “失敗中的失敗”似乎來自另一個答案-人們對此進行了激烈的辯論:http://academia.stackexchange.com/a/37373/8966。
Dima Pasechnik
2015-01-25 01:16:44 UTC
view on stackexchange narkive permalink

當然您應該共享源代碼。

從學術上講,使用不易獲得的代碼的基於軟件的結果不是很有價值,因為如果需要,其他人將如何驗證您的主張?您是否希望它們為此目的而自己編程?僅共享二進製文件的價值要低得多,並且經常會給試圖運行它們的人們帶來噩夢。

David1199
2015-01-23 13:23:20 UTC
view on stackexchange narkive permalink

我認為您應該分享它。首先,您應該進行一些基本清理。 (例如:不再使用不再使用的早期代碼;註釋中沒有代碼;註釋的有效方式等)此外,如果您在代碼中添加了“要做的事情”,其他人會發現您已經沒時間了,他們可以看到你的意圖(例如:todo:應更改為枚舉)我也認為您應該共享算法中最重要的部分。當我共享代碼時,我從未共享過不重要的部分。每個人都可以處理文件的讀/寫,線程之間的通信,GUI等。但是不要共享不可讀的代碼。這是沒有道理的。因此,我認為中間方法是最好的方法。 :-)

清理原則上是好的。但是,如果等待一個好的時間來清理,那麼這個時間可能永遠不會發生。我建議立即將其放在Github或Bibucket或類似版本上的版本控制存儲庫中,並在使用時對其進行清理。無論如何,任何下載它的人都將主要關注HEAD。
J.R.
2015-01-26 04:47:31 UTC
view on stackexchange narkive permalink

與您的計算機科學系的一些教授交談。看看他們中是否有人正在尋找一個項目,學生可以清理混亂的代碼以使其更具表現力。

對於修改代碼的學生來說,這是一次很好的學習經歷。當程序員以結果為先的心態或僅以結果為心態進行編程時,會發生什麼?他們看到了第一手資料。他們還可以應用他們一直在學習的一些最佳實踐。知道其他專業人員已經對查看代碼感興趣,他們可能會被激勵做特別出色的工作。

一位教授甚至可能會參加競賽,屆時所有的學生團隊都會努力修改軟件,並與世界其他地區分享最好的結果。

如果他們的重構工作失敗了,那麼您將比從前落後。如果是這樣的話,免責聲明是一件很了不起的事情。只需共享代碼,但要添加一個警告:“這並不漂亮。當我寫這篇文章時,我試圖完成我的研究–我不認為它會超出我的計算機實驗室。但是,不客氣看看您是否真的願意。”

我喜歡這個,當我在Uni的時候,我本來希望有這個機會。閱讀和理解他人的代碼是一項技能,必須學習。
O. R. Mapper
2015-04-02 16:49:06 UTC
view on stackexchange narkive permalink

在其他答案中也提到了很多支持發布代碼的要點,我完全同意。因此,由於已經討論了發布代碼的基本要求,因此我想補充一個需要考慮的其他要點清單。這些問題中的許多實際上可能出現在所有學術軟件中,因此即使您無法回答“這不適用於 my 項目”。對於所有這些人,在發布您的代碼之前,您至少應該能夠回答“這是一個問題,但是我們可以通過...處理此問題”:

  • 您可以發布代碼嗎?
    • 您可以保證只使用允許重新分發的代碼片段嗎?還是您可能使用了來自非開放源代碼的代碼您可以將其用於自己的內部軟件,但不允許發布?您能保證所有使用的代碼都可以在一個完整的程序包中發布嗎?許可證兼容性是一個不小的問題。
    • 您甚至可以可靠地找到答案嗎?您是否將編碼工作的任何部分外包了,還是從其他地方集成了未發布的代碼?例如,您是否在畢業論文期間對任何學生進行了監督或僱用了任何學生研究助手,他們的工作都是基於您的研究,因此他們的代碼已添加到您的代碼庫中?是否有任何同事向您的代碼庫貢獻代碼?他們從學生那裡得到了一些密碼嗎?所有這些參與人員是否都適當注意了許可問題(如果他們完全有知識對這些許可問題做出有根據的判斷)?甚至還可以確定代碼的哪些部分起源嗎?貢獻每個部分的人還知道嗎?他們甚至還在您的“聯繫範圍內”嗎?
    • 該代碼是否在工作時間內基於第三方資金開發?如果是這樣,資助合同條款是否允許發布代碼,或者它們是否包含必須與項目合作夥伴專有共享在資助項目內創建的軟件的任何要求?
  • 您是否有足夠的資源(時間和其他資源)來花一些時間清理代碼及其註釋,但仍然有意義,但不會提供任何信息不能公開嗎?
    • 您對發表代碼的人有何評論?根據自己的資助,提供代碼的人員是否被正式允許從事各自的研究? ? (軟件開發人員非常清楚,團隊合作和組件的複用是軟件開發的核心方面。不幸的是,供資機構通常對此並不了解,並假設如果開發人員A由項目X資助,而開發人員B由項目Y資助, A專為X工作,B專為Y工作,並且在博客中透露,A僅花費了半個小時來完成某項最終在Y項目中的工作,這可能會導致嚴重的後果,例如收回部分資金。)
    • 發布的數據中的任何內容都不會洩露有關工作方式的特殊性的信息嗎?如果要在VCS中使用整個提交歷史記錄,這尤其重要公開(或者,實際上意味著永遠不要發布提交歷史),但在其他情況下也可能起作用。例如:是否在正式指定的工作時間之外(例如在周末)完成了對代碼的任何工作?工作時間是否表明您每天的工作時間超出了您所在國家/地區的法定上限?工作時間是否表明您沒有遵守法律規定的休息時間?工作時間是否浪費了分配給其他項目的人員做出的貢獻?工作時間是否提供任何理由使您不信任您對工作時間所做的其他陳述(例如,在項目成功報告中,需要將工作時間詳細分配給具有一定最大分配量的預定義工作包)?在您本不應該工作的情況下(例如在項目會議期間),有什麼東西能透露您的工作?
    • 有什麼能說明您在不應該工作的地方工作的信息(例如,在家中,當您的合同不允許您進行家庭辦公時,例如由於保險相關的並發症)嗎?代碼中是否有任何秘密信息,例如密碼,用戶帳戶名或不得公開的URL(因為服務器的佈局不適合少數用戶選擇,而不能處理大量用戶)誰獲得了個人用於測試設置的URL)?
  • 該代碼是否可被其他任何人使用?
    • 代碼將運行,還是需要大量的配置工作?您可以花費精力解釋必要的配置嗎?
    • 代碼可以編譯嗎?您是否使用了任何非公開訪問的非官方修改或定制編譯器?如果是這樣,那麼代碼是否會增加您論文中作為偽代碼算法可能提供的內容?
    • 代碼是否需要任何外部資源?如果它可以訪問由於某種原因而無法與代碼一起發布的服務器,庫或數據集,它是否有用?至少可以提供這些資源的描述,或者它們的接口受某種NDA約束嗎?
    • 代碼是否對運行的系統進行了不可逆轉的更改?例如,它是否會自動更改任何系統配置(例如覆蓋系統搜索路徑)?它是否執行對硬件組件的任何低級別訪問,而這些訪問可能會導致某些星座(您在測試設置中內部避免使用)某些星座,從而永久損壞任何組件?您能可靠地警告用戶這種有害副作用的代碼嗎?
您考慮資助機構或雇主在提交日誌中進行篩選以確定法律後果。這是一個明顯的理論問題。因此,您有沒有發生過的任何證據?我在資金機構(尤其是ERC基金會)的有限經驗實際上是相反的,即使這並不重要。
@Blaisorblade:“那麼,您有沒有發生過的任何證據?” -出資者發現降低成本的可能性的動機似乎很明顯,並且可能執行的可能後果(償還一些贈款)足夠嚴重(失去以前的贈款可能是為數不多的幾件事之一)導致uni員工在uni管理中陷入嚴重麻煩),這似乎是合理的,首先不要公開這種可能的攻擊點。
King
2015-01-24 23:32:51 UTC
view on stackexchange narkive permalink

當然。您要在編寫優秀軟件方面變得更好的唯一方法是獲得反饋(所有類型)。如果您害怕反饋,那您將不會走得很遠。編寫優秀軟件的三個基本知識是實踐,實踐和實踐。相反,我認為沒有人會尊重您的學術素養。並期待與您合作。

lovelyzlf
2015-01-24 23:11:47 UTC
view on stackexchange narkive permalink

您可以將其推送到 GitHub並嘗試維護一個項目,以防其他對您的項目感興趣的人輕鬆訪問您的代碼,也許他們可以幫助您改進代碼。

>
+1-這是我想到的第一件事。與將代碼潛伏在會死掉或丟失的硬盤或USB記憶棒上相比,這是一個存儲代碼的安全場所。此外,該代碼易於維護,並且可以跟踪任何代碼更改,而且正如您所說,其他人可以協作並做出貢獻(只要選擇了正確的訪問設置)。
user28382
2015-01-25 11:03:30 UTC
view on stackexchange narkive permalink

是的,你應該。畢竟,Linux內核源代碼是一團糟,並且並未阻止許多專業開發人員對其進行研究並為其提供補丁和添加。還請記住,Linux內核是運行世界上最快,功能最強大的超級計算機和大多數設備的操作系統的基礎。 Linux內核源代碼雜亂無章,從而受到了任何負面影響或損害。

jwg
2015-01-26 16:51:34 UTC
view on stackexchange narkive permalink

沒人提到為什麼要共享代碼的原因是,您可能會發現有興趣與您合作的人,但願意花更多時間清理代碼並使之在不同的系統上工作,

很多人認為這種工作非常令人滿意,如果您的代碼對他們確實有用,他們可能會很樂意這樣做。無論如何,您可能會發現,從嘗試使用它但需要某種幫助的人那裡獲得反饋,是使您變得更易於維護/使用和理解的良好動力。

Zuberi
2015-01-24 14:50:29 UTC
view on stackexchange narkive permalink

您絕對應該共享您的代碼。

要對內容進行排序,請對代碼的相同部分進行區域劃分,例如對嘗試失敗的區域進行劃分,並說明失敗的原因。另外,如果您使用Visual Studio開發,請從Extension Manager安裝“ CodeMaid”擴展並清理完整的解決方案。它將刪除空格並刪除未使用的引用,從而使大多數內容看起來更好。

如果您使用C#開發,請與我共享您的代碼。我也可以幫助您解決問題:)

@PeterMortensen: [如果有合理的機會有人要單擊鏈接,請僅添加鏈接。](http://meta.academia.stackexchange.com/q/1252/7734)
@Zuberi005是唯一提供自動化*解決方案*來幫助清理代碼的人,也是唯一親自提供幫助來清理代碼的人。有人拒絕了嗎?他們真丟人!
CaptainCodeman
2015-01-25 20:15:12 UTC
view on stackexchange narkive permalink

如果要共享,則不要共享。我知道這聽起來很棘手,但我認為如今“分享所有內容”的壓力太大了,人們會試圖讓您為不分享而感到內,,但實際上您沒有義務分享任何內容。

可重現的結果是科學方法的基石之一。這需要共享。您的評論類似於說“……但實際上,科學家沒有義務遵守科學方法”。
當然,在科學界之外*共享可能是可選的,但在科學界*內部*肯定不是可選的。
@Contango是的,如果發布該軟件有助於重現結果,那是很公平的。
@JeffE我什麼也沒分享,您在說什麼?我發現您的郵件內容含糊。如果您希望被理解,請更加清楚。
您當然同意了。
user168715
2015-02-12 08:54:28 UTC
view on stackexchange narkive permalink

提出免責聲明,該代碼按“原樣”提供,沒有任何支持承諾,等等。然後共享該代碼。

案例研究:將孤立的點雲變成水密表面這是一個極為重要的實際問題,從機器人技術到計算機視覺,再到處理來自Microsoft Kinect等3D傳感器的數據,都得到了廣泛應用。解決這個問題。但是直到今天,每個人都還在使用它。為什麼?因為作者發布了代碼,並且此後將其合併到了許多流行的幾何處理庫中。現在該論文已被引用超過一千篇。

erwin
2015-04-01 19:22:14 UTC
view on stackexchange narkive permalink

是的。您應該在CRAPL許可下發布代碼。目標是建立更美好的未來-糟糕的代碼將幫助人們做到這一點。需要注意的是,您應該記錄如何成功地很好地操作代碼,以使某人有足夠的機會重現任何已發布的結果。

並且不要擔心-我研究過的一點研究代碼由大約5年的一系列項目的編程能力的5位博士後開發。

全局變量列表(僅名稱)大約有4頁。

其中大約三分之一用於設置默認行為,以更改在給定時刻起作用的功能。另外20%是並行數據結構-意味著它們存儲的數據大致相同-因此,函數或多或少隨機地從數據結構中提取代碼。是。他們有時不同步。有時需要不同步。

大約有50個未記錄的版本,存儲在小組服務器的隨機部分中-每個版本至少滿足一個特定的目的-只有一名管理員保留了這些特定的目的。在他的頭上。人們為了給定的目的使用“錯誤的”版本比不使用它更為普遍。

使用難以置信的複雜遞歸過程(例如,編寫文件)是標準做法。認真地講-幾千行保存圖像結果。

哦,這是通過從未創建新變量來解決內存洩漏(實際上是一個看不見的數字)的殘酷嘗試。

哦,還有那個可愛的數據庫。由於(a)數據庫設計錯誤(b)數據輸入錯誤(在自動程序中),約有一半的數據不可用。從數據庫檢索文件的代碼長了幾百行邏輯...數據庫本身也很友好,可以包含許多相同數據的副本,而且表之間的鏈接斷開了。約束?否。我看到統計學家在被委託使用數據庫後的一個月內,就從沮喪,恐懼到哭泣,再到退出……

有大約0到1種方法可以操作軟件並檢索正確的結果。在任何給定的瞬間……

是的,有很多東西。

哦,為了確保不透明和不確定的操作,通過調用GUI進行了一系列計算具有相關回調的按鈕。

任何給定功能的大約90%確實可靠,與結果或結果調試無關,而是由插入的短期項目組成,然後再也沒有刪除。認真的說-我寫了一個功能完整的版本,實際上是它的大小的1/10。重要的部分是複制粘貼的插入函數,其中許多彼此不同。

而且,弗吉尼亞州沒有,沒有文檔。還是描述性的變量名。

哦,還有未記錄的,錯誤的,dll和相關的庫-使用不再存在的代碼生成。

全部用Matlab編寫。根據Matlab編碼慣例,假設大量使用eval將是您今天的重頭戲。

嚴重的是,您的代碼還不錯。

這就是說,如果您做了一些實際有用的事情,發布一個清理後的版本以供其他人使用和引用您的庫可能會促進職業發展。如果您剛剛做過某事,那麼複製就可能是您明智的選擇。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...