Domanda:
Devo condividere il mio orribile software?
qsp
2015-01-23 03:21:48 UTC
view on stackexchange narkive permalink

Dopo aver pubblicato il mio articolo, alcune persone mi hanno chiesto di condividere il software che ho sviluppato. All'inizio, ero molto felice che il mio articolo avesse attirato una certa attenzione, ed ero felice di condividere non solo il codice binario, ma anche il codice sorgente, i casi di studio, ecc. Ma guardando il mio software, mi sento molto imbarazzato.

Il mio software è semplicemente orribile: il codice sorgente è solo un disastro, contenente molti dei miei tentativi falliti; Non ho mai usato design pattern, quindi il codice duplicato è ovunque; per semplicità e rapidità di implementazione, spesso preferisco le ricorsioni ai cicli, ecc. ecc.

Sono sempre sotto pressione per produrre nuovi risultati e pulire quel codice mi costerebbe uno sforzo significativo.

La mia domanda è se condividere questo orribile software darà alle persone un'impressione molto negativa di me? Sarebbe dannoso per la mia carriera se le persone che condivido fossero potenziali collaboratori, datori di lavoro, poiché lavorano nello stesso campo.

Sembra un software accademico.
Correlati: [Come condividere il codice del computer] (http://academia.stackexchange.com/questions/16785/how-to-share-computer-code?lq=1) e [Modelli di best practice per il codice di "ricerca"? ] (http://academia.stackexchange.com/q/21276/10643) e il classico: [Perché molti scienziati di talento scrivono software orribile?] (http://academia.stackexchange.com/q/17781/10643)
Non sono sicuro di quanto posso davvero aiutarti, ma ho visto questo video che in base al tuo problema potrebbe incoraggiarti un po '. 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 Spiacente, non ho potuto aiutarti di più, volevo solo mostrarti questo video.
Segreto sporco: * la maggior parte * del software accademico è orribile. Anche le cose che escono dal dipartimento di informatica.
Potresti rilasciarlo con la licenza CRAP: http://matt.might.net/articles/crapl/
La ricerca generalmente implica provare mille cose che non funzionano. Se riesci a scrivere codice che funziona nei primi tentativi, probabilmente non stai facendo ricerche ma solo implementando.
[Questo articolo] (http://www.siam.org/news/news.php?id=2064) sulla rivista SIAM è una lettura affascinante e costituisce un argomento molto convincente.
Un altro punto da considerare: cosa succede se alcune delle tue conclusioni si basano su dati falsi originati da un bug nel tuo software? I lettori dovrebbero essere in grado di verificarlo.
Pubblicare il codice in un luogo pubblico come GitHub ti dà la possibilità di mostrare come hai migliorato in modo incrementale il tuo software. Migliorare in modo significativo il software senza modificare i risultati generati dal software non è un compito facile e quindi è un'abilità molto apprezzata. Potresti trovare la pubblicazione di parte del codice sul sito di revisione del codice https://codereview.stackexchange.com/ per essere di aiuto qui.
@qsphan Solo per curiosità, di cosa parla il tuo articolo?
Per aggiungere alla conversazione: http://www.phdcomics.com/comics/archive.php?comicid=1692
@mankoff: Per favore, non farlo. Quella licenza è * abissale *. Rilasciarlo con BSD a 3 clausole con un grande adesivo che avverte della qualità sarebbe un'opzione molto migliore.
anche un sacco di software non accademico è un disastro, cfr. bug bash recenti ...
Blah, come programmatore: "Sono sempre sotto pressione per produrre nuovi risultati, e pulire il codice mi costerà uno sforzo significativo". Ti rendi conto che il motivo per cui sei così sotto pressione è perché passi così tanto tempo a DEBUGGARE il codice che non ti sei mai preso la briga di scrivere o mantenere correttamente?
Anche se il codice è veramente orribile - cosa di cui dubito - è ancora testato in battaglia e debuggato, il che è molto, MOLTO più prezioso rispetto all'utilizzo degli ultimi modelli di progettazione ecc. Assicurati di aggiungere istruzioni dettagliate sulla piattaforma sottostante (Ubuntu 12.04, OS X 10.7 con XCode con libX versione Y ecc.) Poiché potrebbero esserci sottili differenze che creano problemi, così come istruzioni complete su come compilare e collegare i tuoi programmi. Probabilmente hai già automatizzato un po 'quando lo scrivi: basta annotarlo in modo che gli altri possano vederlo.
Niente di sbagliato nella ricorsione a meno che il linguaggio di programmazione non supporti l'ottimizzazione
@Philipp: Quello che mi preoccupa di più è una situazione in cui la carta è corretta, ma il codice contiene un brutto bug. In quel caso, correggere il bug cambierebbe la correttezza della risposta ma non (diciamo) le sue caratteristiche di prestazione ... quindi se rilasci il codice, rischi di metterti in imbarazzo anche quando i tuoi risultati potrebbero non essere invalidati. (Ho già trovato questo tipo di bug nel mio codice in precedenza.)
Non importa se è accademico o no. http://blog.codinghorror.com/version-1-sucks-but-ship-it-anyway/
@Mark: La maggior parte del software è orribile, punto. Non solo accademico, e non è davvero un segreto. ;-)
Solo per aggiungere a questo, anche il software scientifico che viene utilizzato ogni giorno nelle principali applicazioni diventa disordinato e orribile: il codice utilizzato dal Met Office è ancora in Fortran e ha bit lasciati ovunque da diversi decenni fa ...
@djechlin Sebbene occasionalmente sia vero, "La fonte della tua pressione è la tua cattiva codifica" non è sempre generalizzabile. A meno che non ci fosse qualcosa nelle mie capacità di Python che stava guidando l'ultima epidemia di Ebola?
@Fomite qualcosa sulle tue abilità con Python è il motivo per cui non hai ancora finito la tua ricerca sull'Ebola, se vuoi metterla in questo modo: P
@djechlin Nah, penso che probabilmente abbia più a che fare con le persone che stanno ancora morendo ...
@Fomite perché preoccuparsi di scrivere codice, allora se ci sono persone che muoiono in entrambi i casi?
@Fomite il punto è che se hai intenzione di * farlo * dovresti farlo * bene * e * veloce * se è il * principale * collo di bottiglia del tuo lavoro. Suppongo che tu possa dire che il principale collo di bottiglia nel tuo lavoro è la prevalenza di ebola, ma dopo di ciò, c'è una probabilità spaventosamente buona che sia quanto bene il tuo codice funzioni. Ma se vuoi insistere sull'esistenza di ebola è il problema, allora più potere per te.
@djechlin Sto solo osservando che l'idea che la fonte di pressione su un accademico si riduca a una cattiva codifica è sia profondamente presuntuosa, sia decisamente non generalizzabile.
È possibile lavorare con uno studente di informatica universitaria o laureato e fargli "ripulire" parte del codice?
Suggerimento da un programmatore: non conservare i tuoi tentativi falliti come codice commentato o in classi non utilizzate.Invece, invia spesso versioni (semi) funzionanti al controllo del codice sorgente (GIT).__Always__ rimuove il codice morto che non è più necessario!Se devi tornare a una versione precedente, ripristinala dal controllo del codice sorgente.È molto più facile mantenere il codice in questo modo, perché c'è molto meno codice da leggere.Riguardo al fatto che il tuo codice non utilizza fantasiosi modelli di progettazione, ecc: potrebbe essere una buona cosa, mantienilo il più semplice possibile, aggiungi complessità solo dove assolutamente necessario.
Diciotto risposte:
Ian
2015-01-23 03:31:21 UTC
view on stackexchange narkive permalink

Sì, dovresti.

Primo, la maggior parte del software scientifico è terribile. Sarei molto sorpreso se il tuo fosse peggiore della media: il solo fatto che conosci i modelli di progettazione e la differenza tra ricorsione e cicli suggerisce che è meglio.

In secondo luogo, è improbabile che tu abbia l'incentivo o la motivazione per renderlo migliore a meno che, o fino a quando, non sia necessario a qualcun altro (o a te in 6 mesi). Renderlo aperto ti dà quell'incentivo.

Potenziali vantaggi: possibili nuovi collaboratori, correzioni di bug, estensioni, pubblicazioni.

Potenziali svantaggi: riduzione del tempo (mantenimento del codice o risoluzione di problemi per altre persone), ottenere scavato. Sarò chiaro: non prendo molto sul serio nessuno di questi aspetti negativi.

La maggior parte dei software scientifici NON è terribile. (Mi guadagno da vivere lavorando e ottimizzandolo da un paio di decenni ormai, quindi penso di avere un'opinione informata.) Ha solo criteri di bontà piuttosto diversi: lavorare, ottenere risposte corrette in tempo pratico, essere estensibile alla teoria successiva, ecc., piuttosto che conformarsi all'ultimo paradigma di design quasi religioso o tendenza linguistica. E per l'OP, il tuo software "orribile" potrebbe, se ripulito e commentato un po ', essere più accessibile ad altri scienziati del codice "buono".
Aggiungo solo che suggerirei di condividerlo tramite Github o simili, che ha una comunità vivace e rende più facile per le persone collaborare, biforcare il tuo progetto e contribuire ad esso.
Nessuna menzione dell'elefante nella stanza, _reproducibility_?
@jamesqf: Ho esagerato per effetto, ma il mio pensiero è questo. La maggior parte del software scientifico è un codice a prova di principio, usa e getta. Raramente viene rilasciato al di fuori di un piccolo gruppo ed è, secondo la mia esperienza, scritto male. La maggior parte del software scientifico * che dura su una scala ragionevole * non è terribile (ho anche lavorato con alcuni su una scala temporale simile): non può essere quello di produrre più pubblicazioni. Ma sto pensando a "tutto il codice scritto dagli scienziati" qui.
@mmalmeida Sono d'accordo, Github è un canale per la collaborazione. I problemi e le pietre miliari offrono un modo per tenere traccia dei problemi e delle richieste di miglioramento. Prima di rendere open source questo codice, consiglierei anche di prenderti un po 'di tempo per pulirlo o almeno aggiungere commenti descrittivi.
@jamesqf Beh, la maggior parte è terribile. Direi anche di avere un'opinione informata. Come funziona il codice non è un criterio di "bontà" del codice per un programmatore, almeno quello considerato buono. La correttezza è una proprietà "indispensabile". Tasso di divergenza, stabilità numerica, velocità (escluse le ottimizzazioni specifiche dell'hardware) ecc. Sono proprietà dell'algoritmo * * implementato dal codice. Puoi avere un buon codice e un cattivo codice che eseguono lo stesso. Anche se ammetto che "buono" è troppo vago e spesso si traduce in incomprensioni. Direi che la "qualità del codice" è molto spesso terribile. Anche se il programma * funziona * alla grande.
@jamesqf: la maggior parte del software scientifico che ho incontrato non era in alcun tipo di controllo del codice sorgente, e questo suona come un altro esempio (o perché altrimenti ci sono ancora tutti i tentativi falliti).
@RemcoGerlich: Bene, c'è un esempio di criteri diversi per la "bontà". Non ho mai trovato un sistema di controllo del codice sorgente che non abbia un evidente difetto di progettazione principale: il check-out dei file dal sistema reimposta il loro timestamp all'ora di checkout, non all'ora dell'ultima modifica. Gli implementatori di questi sistemi ovviamente pensano che sia una caratteristica "buona" - ho avuto diversi argomenti nel forum degli utenti - ma il risultato finale è che non uso il controllo della versione a meno che non sia esplicitamente pagato per farlo.
@jamesqf: non la prende sul personale, ma questo è piuttosto in cima alla lista delle stupide ragioni per non usare il controllo del codice sorgente (inoltre, con i VCS "normali" ci vuole uno script di forse 20 righe per "correggere" questo "difetto di progettazione principale" ).
@jamesqf Non ho mai visto la questione del timestamp del file, * affatto *. L'unico caso in cui posso persino pensare che influisca su qualsiasi cosa è "make", e quando hai un checkout pulito, non ci sono binari per controllare se hanno bisogno di essere ricostruiti. I vantaggi del controllo del codice sorgente sono evidenti: monitoraggio delle modifiche (che è * incredibilmente * prezioso nella pratica), protezione contro la perdita, condivisione più semplice con i colleghi e possibilità di lavorare simultaneamente sulla stessa base di codice. Il tuo problema sembra estremamente oscuro e scommetterei che quei benefici da soli superano gli svantaggi del tuo particolare caso d'uso
Il progetto Sage (http://www.sagemath.org) è un esempio vivente di software di ricerca matematica che * non è orribile *, sebbene ci siano costantemente discussioni sul design e lamentele sulla pratica della codifica.
@jpmc26: Come possono i tempi dei file non avere importanza? Forse se lavori solo su un set di codice, non sono così importanti, ma se hai molti codici diversi, ognuno con molti file (tipico del software scientifico, secondo la mia esperienza), è davvero utile poterlo vedere a uno sguardo (eseguendo ad es. 'll *. [chyl]' esattamente su quali file hai lavorato e quando. Ora sono d'accordo che un sistema di controllo del codice sorgente CORRETTAMENTE FUNZIONANTE sarebbe un ottimo strumento da avere. Il problema è che il! @ # $ s che li costruiscono rifiutano assolutamente di implementare questa soluzione molto semplice.
I commit @jamesqf (il nucleo della maggior parte dei sistemi di controllo del codice sorgente) hanno timestamp. In git, ad esempio, crea un commit per ogni modifica dei tuoi file di dati, ad esempio "riesegui la simulazione utilizzando il nuovo codice dalla revisione XXX". Per ogni modifica del codice, crea un commit che dice "codice migliorato in XXX per motivo YYY". Quindi, invece di avere una "data dell'ultima modifica" per i tuoi file, ottieni un bel elenco di commit, insieme a quando si sono verificati, esattamente quali file sono stati aggiunti / modificati / eliminati e un commento utile. Non c'è nessuna correzione da fare, semplicemente non sai come usare correttamente il controllo del codice sorgente.
Per non parlare del fatto che se ** davvero ** hai bisogno di questa funzione, qualsiasi software di controllo del codice sorgente ti consente di chiedergli quando un file è stato modificato l'ultima volta. In effetti, la maggior parte andrà oltre e ti dirà quale commit ha interessato per ultimo un file, dandoti il ​​contesto della modifica oltre al timestamp, che è molto più utile e pratico di "oh, ho modificato l'ultima volta questo file 26 giorni fa , È meglio che guardi nel mio file .txt per vedere cosa ho fatto lì ... oh, aspetta, mi sono dimenticato di scriverlo, oops ".
@jamesqf Thomas l'ha inchiodato. Guardi la cronologia dei commit per vedere cosa è stato cambiato, quando e come. Con uno strumento diverso, puoi persino vedere un confronto riga per riga delle versioni precedenti e correnti dei file (o anche due versioni precedenti). Il controllo del codice sorgente diventa la fonte autorevole per queste informazioni. Questo rende anche molto più facile condividere la storia con gli altri, qualcosa che penso sarebbe prezioso per la comunità accademica. In una nota a margine, di solito dovresti mettere basi di codice non correlate in diversi repository. Ciò consente di visualizzare le cronologie separatamente.
@Thomas: Siamo spiacenti, ma questa è la stessa linea di BS che ricevo dagli sviluppatori: o lavora nel modo in cui vogliamo che tu lavori, o ti perdi. Mi dispiace, ma ho PROVATO a fare a modo tuo, gente. Per me non funziona.
@jamesqf In tal caso, sarebbe abbastanza facile scrivere un hook per la maggior parte dei sistemi VCS per farlo funzionare nel modo desiderato. Nessun motivo per non averlo in entrambi i modi.
Il motivo per cui i timestamp vengono reimpostati è perché se ricevi un file modificato nel checkout che è stato modificato ieri, ma hai fatto una build questa mattina, la maggior parte dei sistemi di build non accetterebbe la modifica (perché il timestamp era più vecchio degli artefatti di build) . Con il timestamp impostato sull'ora del checkout, le build funzioneranno.
@jamesqf Piaccia o no, l'utilizzo di VCS è un obbligo pragmatico. Se non utilizzi VCS, molti potenziali collaboratori (inclusi quasi tutti i programmatori esperti) troveranno molto difficile prendere sul serio il tuo progetto. E l'impulso a questi paradigmi progettuali "quasi religiosi" è la ricerca di un'ineffabile eleganza che renda il progetto estensibile alla teoria successiva e accessibile ad altri.
@jamesqf C'è una ragione per cui "gli sviluppatori" continuano a dirtelo: è perché hanno ragione. Inoltre, sì, la maggior parte del software scientifico è davvero pessimo, compreso il mio. Scrivo codice in modo molto diverso quando lo scrivo per un progetto di produzione che intendo effettivamente mantenere rispetto a quando lo scrivo come prova di concetto per eseguire alcune simulazioni per un documento di ricerca. Ho visto lo stesso da quasi ogni pezzo di codice di ricerca che abbia mai visto. Ci sono alcune eccezioni, ma sono proprio queste: eccezioni.
@jamesqf "Come possono i tempi dei file non avere importanza? Forse se lavori solo su un set di codice, non sono così importanti, ma se hai molti codici diversi, ognuno con molti file (tipico del software scientifico, nella mia esperienza) , è davvero utile essere in grado di vedere a colpo d'occhio esattamente su quali file hai lavorato e quando. " Uh ... non è questo _esattamente_ il problema che il controllo di versione dovrebbe risolvere?
@jamesqf Se l'utilizzo del controllo del codice sorgente causa attivamente problemi, probabilmente è sufficiente ripensare un po 'al flusso di lavoro. Se riesci a restringere i problemi specifici che stai riscontrando, molto probabilmente le domande su come affrontarli in modo diverso sarebbero benvenute su Programmers e StackOverflow. Dagli Un colpo. Potresti essere sorpreso di quanto migliora la tua esperienza. Dirò anche questo: se hai provato git, quel sistema è davvero difficile da imparare. Potresti avere un momento più semplice per iniziare con SVN, che è molto più intuitivo e non è così impegnativo per il tuo flusso di lavoro. SVN è molto meglio di niente.
Come qualcuno che lavora nel software, nessun codice è _ mai_ perfetto. Ma non lasciare che la perfezione sia nemica del "abbastanza buono". Come altri hanno già detto, qualcuno potrebbe trovare utile il tuo software. Se puoi prenderti il ​​tempo per ripulirlo un po 'e aggiungere alcuni commenti o un README tanto meglio :)
Non è solo software scientifico che è scritto in modo terribile. Sto sviluppando in negozi di software e aziende manifatturiere allo stesso modo da dieci anni e ti prometto che il codice non sta diventando più pulito. In qualunque posto. Scrivere un bel codice è molto difficile. È come scrivere un libro. La prima bozza di solito fa schifo, ma in realtà racconterà la storia. Per vendere un libro devi renderlo bello. Per compiacere i tuoi stakeholder negli stabilimenti, hanno solo bisogno che ne raccontino la storia.
Questo thread di commenti si è trasformato in una conversazione fuori tema su VCS. ** Porta la discussione estesa a [chat]. **
Ho scherzato con il GATT (un programma per programmare utilizzando algoritmi genetici, il banco di prova per una serie di dottorati in Scozia). Ha funzionato, ma il codice conteneva un sacco di codice commentato, funzioni inutilizzate (dalle tesi precedenti), codice generale (per accogliere diversi tentativi) e codice molto stretto e difficile da adattare fianco a fianco. Composto con strutture di dati contorte, che a volte sono confuse in usi non progettati. Pulire quel pasticcio sarebbe stato un compito enorme. Ma andava bene così com'era per il suo ruolo di esplorazione.
Blair MacIntyre
2015-01-23 03:31:26 UTC
view on stackexchange narkive permalink

Vorrei ripulirlo un po 'e condividerlo. Ho rilasciato molto codice nel corso degli anni e non ho rilasciato codice anche per i motivi che fornisci.

Analizzalo e commentalo, a qualsiasi livello tu possa. Lascia in "tentativi falliti" e commentali come tali. Spiega perché hanno fallito e cosa hai provato. Questa è un'informazione MOLTO utile per le persone che vengono dopo di te.

Crea un file README che dice che lo rilasci su richiesta nella speranza che aiuti qualcuno. Dì che sai che il codice è brutto, ma speri comunque che sia utile.

Troppe persone trattengono le cose perché non è perfetto!

Non posso approvare la partenza per tentativi falliti. Dovresti invece usare il controllo della versione. Includere brevi commenti che spiegano perché il tentativo iniziale non è riuscito va bene, ma includere il codice effettivo non riuscito può essere attivamente dannoso.
@DavidZ Al contrario, mostralo. Se utilizzi il controllo della versione, le persone possono vedere le variazioni precedenti del tuo lavoro, il che è tutt'altro che inutile. Ma se come qui non usi VC, non rimuovere i tentativi falliti. Inseriscili in un altro file con commenti appropriati. Quanto potrebbe essere dannoso?
@coredump Può rendere l'intero programma praticamente incomprensibile. L'ho visto accadere. Se non utilizzi VC, _inizia a utilizzarlo_. L'unico modo in cui posso supportare una raccomandazione per non rimuovere i tentativi falliti è se ti è vietato mettere il codice in VC per qualche motivo che non riesco a immaginare, _ ed_ è essenziale vedere il codice precedente per capire quale sia l'attuale il codice lo fa (il che probabilmente significa che anche il codice corrente è cattivo, anche se ammetto che possono esistere delle eccezioni).
@DavidZ Scusa, ma "Dì perché hanno fallito e cosa hai provato" è un buon consiglio, IMHO. Se il tuo codice è disordinato e / o se non sei abituato alle pratiche di ingegneria del software, lascialo così com'è e commenta il più possibile. La rimozione di informazioni utili potrebbe rendere le cose praticamente incomprensibili. L'ho visto accadere ;-). Ok, quindi forse c'è una via di mezzo tra il mostrare tutte le cose orribili che sono state tentate e lasciare tracce utili. Penso che "lo pulirei un po '" è anche un buon consiglio.
@coredump Dire ciò che hai provato nel senso di includere il codice fallito è un buon consiglio quando chiedi aiuto, ma non per scrivere il programma stesso.
Non vedo come un codice fallito possa aiutare se non per offuscare il codice funzionante (a meno che gli errori non siano chiari e ad es. "Codice molto più semplice, ma funziona solo per voci positive"). Ma ciò che è buono per fare commenti (ad esempio "sarebbe allettante usare array, ma non funzioneranno per voci non univoche").
Se il codice è un'implementazione di un documento di ricerca e ha cercato di implementarlo in modi diversi, la mia ipotesi è che la soluzione non sia ovvia. Nella ricerca, qualcun altro potrebbe vedere il codice funzionante e pensare "Potrei farlo meglio in questo modo", che potrebbe essere uno dei modi in cui l'autore ha provato per primo. Facciamo male in CS nel condividere i nostri fallimenti, il che a volte porta a perdere il lavoro. Questo è il mio punto. Non si può sapere se sia una buona scelta in questo caso senza vedere il codice, ma conosco molti altri professionisti che condividono questa visione
La condivisione di tentativi falliti è diversa dal mescolare codice rotto nel codice funzionante, che non realizza nulla se non confondere e impedire la comprensione.
jamesqf
2015-01-23 04:26:19 UTC
view on stackexchange narkive permalink

Sì! Soprattutto se la tua carta è ad es. su un algoritmo nuovo / migliorato che hai implementato, o fai un'analisi significativa dei dati non standard, o praticamente qualsiasi cosa in cui riprodurre i tuoi risultati significhi reimplementare il tuo software.

Gli articoli raramente hanno spazio per dare di più di un contorno. So di aver speso (= sprecato) troppo tempo cercando di implementare algoritmi da documenti che tralasciavano dettagli critici (ma non strettamente rilevanti per l'articolo).

Commento molto vero sulla riproducibilità, in particolare, il secondo par.
@E.P: Sì. Mi dispiace, è la mia distipica che si ripresenta :-)
Davidmh
2015-01-23 15:05:12 UTC
view on stackexchange narkive permalink

¿Pensi che il tuo codice sia disordinato? Ho visto (e ho tentato di lavorare con) codice che mi ha fatto venire gli incubi:

  • Cinque livelli di if True annidati, sparsi in punti casuali nel codice.
  • Crea un array di zeri, convertilo in gradi, prendi il coseno e torna in radianti. Quindi, butta via il risultato.
  • Su un software in forte sviluppo, l'elenco delle "architetture supportate" è così antico (e lo dicono loro stessi) sarebbe difficile mettere le mani su uno di questi computer al giorno d'oggi.
  • Funzionalità non funzionanti o modificate diverse versioni fa, ancora consigliate nei documenti.
  • Codice che va dall'utilizzo di un formato standard di input a un formato proprio. Come generarlo? Nessuno lo sa veramente e gli sviluppatori danno una risposta.
  • Versioni che non si compilano nemmeno. (L'hai anche testato?)
  • Menu della GUI a cui devi accedere in un ordine specifico. Altrimenti, si ottiene un errore di segmentazione e si deve ricominciare dall'inizio.
  • Percorsi hard-coded sparsi nel codice. Quindi devi passare da un file all'altro per trovare e modificare tutte le occorrenze di / home / someguy / absurd_project / working / al tuo.

E, il mio preferito personale , un certo programma di migliaia di righe di codice, utilizzava solo commenti per eliminare bit casuali di codice, tranne uno:

Qui perforiamo le carte.

Tuttavia, non ho idea di cosa stesse facendo.

E questo sta solo lasciando al di fuori delle classiche cose di buona pratica, come le variabili di una lettera in tutto il codice, algoritmi non specificati da nessuna parte ...

Se sei preoccupato per la qualità del tuo codice, probabilmente significa che ti interessa abbastanza da averlo reso migliore della media. Se aspetti che il codice sia pulito, potrebbe non uscire mai e i tuoi contributi scientifici andranno parzialmente persi.

A mio parere, le cose importanti di cui dovresti preoccuparti, in ordine, sono:

  1. Formati di input e output. Usa gli standard quando disponibili, rendilo semplice quando non lo sei. Semplifica l'utilizzo del programma come una scatola nera.
  2. Commentato. Brevi descrizioni delle funzioni, rapida panoramica dell'algoritmo.
  3. Leggibilità. Utilizzo di codice idiomatico, buoni nomi di variabili ...
  4. Struttura. Questo è più facile quando sai cosa vuoi fare, che di solito non è il caso del codice di ricerca. Solo se c'è interesse nella comunità, puoi prendere in considerazione il refactoring.

Quindi, rilascia il tuo software ogni volta che hai 1 (2 e parte di 3 dovrebbero entrare mentre lo stai scrivendo) .

+1 ma aggiungerei anche un'adeguata gestione degli errori all'elenco dei punti importanti (troppo spesso mancanti dal codice di ricerca affrettata). In particolare, prestare particolare attenzione a qualsiasi errore che potrebbe influire silenziosamente sull'output: il valore di ritorno della funzione è il numero reale zero o uno zero di ritorno in caso di errore predefinito? (Non tracciarli!) Inoltre, gli errori dovrebbero essere gestiti, ma non eccessivamente gestiti. Ho visto codice "antiproiettile" scritto in modo ingenuo che potrebbe recuperare silenziosamente da dati di input confusi e continuare a produrre output senza lamentarsi. Un arresto anomalo può essere frustrante, ma risultati imprecisi possono essere un disastro.
Riguarda il tuo punto n. 3 e il commento di qualcun altro sui nomi di variabili di una sola lettera: nel software scientifico, spesso traduci più o meno direttamente equazioni matematiche in codice. Se le variabili nelle equazioni sono lettere singole, è perfettamente logico utilizzarle come nomi di variabili nel codice. E, come ammetto, dovrei fare più spesso, includere LaTeX per le equazioni in un commento. Per il resto, non hai davvero vissuto fino a quando non hai provato a eseguire il debug di FORTRAN 66 con GOTO calcolati e assegnati :-)
+1 per la risposta di @imsotiredicantsleep. Il codice che fallisce silenziosamente è difficile da lavorare. Se genererà risultati imprecisi, assicurati che generi un avviso o generi un errore.
Toxaris
2015-01-26 16:07:07 UTC
view on stackexchange narkive permalink

Stai chiedendo se condividere software di bassa qualità darebbe una cattiva impressione di te. Penso che la condivisione di software dia una buona impressione.

  1. In quanto scienziato informatico, mi piace quando i colleghi rendono disponibile il loro codice sorgente. Mi rende più propenso ad approfondire il loro lavoro, magari contattarli, magari citarli, perché c'è un altro artefatto con cui interagire (non solo la carta, ma anche il codice).

  2. Quando un articolo riporta un risultato "provato" dal codice sorgente, ma il codice sorgente non è pubblico, spesso mi chiedo se il risultato sia reale. Guardare il codice sorgente (o solo la disponibilità del codice sorgente, senza mai guardarlo) può convincermi.

Quindi condividere il tuo codice sorgente, orribile o no, mi darebbe sempre una buona impressione di te.

Ora, se vuoi impressionare ancora di più, sarebbe utile ...

... se reagisci ai problemi o tira richieste su un sito come github, cioè quando vedo che altri cercano di contattarti e tu reagisci.

... se il tuo codice contiene un file readme che collega le affermazioni del tuo articolo alla fonte codice. In questo modo, quando leggo il documento e voglio saperne di più, posso usare il file readme per passare alla posizione appropriata nel codice. Frasi tipiche di un tale file readme potrebbero essere: "L'algoritmo della sezione 3.2 del documento è in file algoritmo / newversion / related / secondtry / foo.c" o "Per ripetere la corsa con il piccolo set di dati descritto nella sezione 2 il giornale, corri "make; make second_step; foo_bar_2 dataset / christmas.dataset. Questa esecuzione richiede circa 2 giorni sul mio laptop ".

Potresti anche essere interessato a CRAPL (Community Research and Academic Programming License) di Matthew Might, disponibile su http://matt.might.net/articles/crapl/. Contiene questo termine: "Accetti di tenere l'autore libero da vergogna, imbarazzo o derisione per qualsiasi hack, kludge o atto di fede trovato all'interno del Programma". Non mi è chiaro se questa "licenza" abbia qualche effetto legale, ma l'intento è chiaro: rilascia il tuo brutto codice e non pensare male al brutto codice degli altri.

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

Relativamente tangenzialmente, affronterò come condividere il software date le tue preoccupazioni (non dovresti condividere il software per il quale hai già una risposta).

Mettere i tentativi falliti nel controllo della versione in modo efficace significa che nessuno li vedrà mai. Il modo in cui gestisco questo è inserire ogni tentativo in un metodo e ogni tentativo fallito in un metodo separato:

  def main (): get_foobar (x, y) def get_foobar (): return x ** ydef get_foobar_legacy_1 (): "" "Questo tentativo non ha funzionato per i valori > 100" "" return x + ydef get_foobar_legacy_2 (): "" "Questo tentativo non ha funzionato i mercoledì di settembre" "" return x - y  

Secondo i commenti seguenti, potrebbe essere una buona idea mettere questi metodi in una classe separata FailedAttempts o BadIdeas. Questo ha il bell'effetto di compartimentare le varie fasi del processo secondo le effettive necessità. Trovo che i programmatori di computer spesso sappiano quando spezzare la logica in un metodo e quando no, ma gli scienziati informatici spesso no. Questo approccio aiuta gli scienziati informatici a interrompere un metodo quando necessario.

Non fa parte delle migliori pratiche di programmazione. Il codice apparentemente inutilizzato dovrebbe effettivamente essere commentato, per timore che qualche codice continui a chiamare `get_foobar_legacy_43`. E quando diventa chiaro che è rotto, dovrebbe essere rimosso se possibile.Se la comprensione di un tentativo fallito è utile per i lettori della versione corrente (cosa che accade), dovresti metterla nel controllo della versione e aggiungere un commento che punta al commit pertinente ID - possibilmente con un permalink.
@Blaisorblade: Hai ragione, se l'obiettivo è sviluppare un'applicazione ben funzionante, il codice inutilizzato dovrebbe essere rimosso, tramite commenti o relegandolo nelle profondità del software di controllo del codice sorgente. ** Tuttavia, questo non è l'obiettivo dichiarato dall'OP. ** L'OP deve documentare i suoi fallimenti. Questo è il modo per farlo. Anche se vedo valore nel tuo punto, e forse ogni metodo potrebbe essere commentato con `/ * * /` block comment syntax. È interessante notare che uno dei pochi linguaggi che non supportano i commenti di blocco è Python, il linguaggio che ho usato per lo pseudo codice sopra.
@Blaisorblade: Una soluzione ancora migliore potrebbe essere quella di avere un file, una classe o una directory separati che includano i tentativi falliti, separati dal codice di posta dell'applicazione.
Documentare gli errori non è indicato nella domanda, e penso che sia una buona idea * in pochi casi * (ad esempio, per tentativi interessanti ma falliti di ottenere i contributi dell'articolo). "L'abbandono fallito" sembra provenire da un'altra risposta, in cui le persone hanno avuto un forte dibattito: http://academia.stackexchange.com/a/37373/8966.
Dima Pasechnik
2015-01-25 01:16:44 UTC
view on stackexchange narkive permalink

Ovviamente dovresti condividere il codice sorgente.

Dal punto di vista accademico, un risultato basato su software che utilizza codice non immediatamente disponibile non è molto prezioso, poiché come potrebbero altre persone verificare le tue affermazioni, se necessario? Ti aspetti che programmino da soli per questo scopo? La condivisione dei soli file binari è molto meno preziosa e spesso porta ad incubi per le persone che cercano di eseguirli.

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

Penso che dovresti condividerlo. Prima di tutto dovresti fare un po 'di pulizia di base. (es: nessun codice precedente che non viene più utilizzato; nessun codice nei commenti; modo valido per commentare e così via) Inoltre se metti un po 'di "da fare" nel codice gli altri possono vedere che eri fuori tempo e possono vedere le tue intenzioni. (es .: todo: questo dovrebbe essere cambiato in enum) Penso anche che dovresti condividere la parte più importante dei tuoi algoritmi. Quando condivido un codice non ho mai condiviso parti non importanti. Tutti possono gestire la lettura / scrittura di file, la comunicazione tra thread, gui e così via. Ma non condividere codice illeggibile. Non avrebbe senso. Quindi penso che la via di mezzo sia la migliore tante volte. :-)

La pulizia è buona in linea di principio. Tuttavia, se si aspetta un buon momento per pulire, quel momento potrebbe non accadere mai. Suggerirei di metterlo subito in un repository di controllo della versione su Github o Bibucket o simili e pulirlo come e quando ci si arriva. In ogni caso, chiunque lo scarichi guarderà principalmente HEAD.
J.R.
2015-01-26 04:47:31 UTC
view on stackexchange narkive permalink

Parla con alcuni dei professori del tuo dipartimento di informatica. Vedi se qualcuno di loro sta cercando un progetto in cui gli studenti possano ripulire il codice disordinato per renderlo più presentabile.

Per gli studenti che revisionano il codice, questa può essere una buona esperienza di apprendimento. Cosa succede quando i programmatori programmano con una mentalità basata sui risultati - o sui risultati solo ? Lo vedranno in prima persona. Possono anche applicare alcune di quelle migliori pratiche che hanno imparato. E potrebbero essere motivati ​​a fare un lavoro particolarmente buono sapendo che altri professionisti sono già interessati a vedere il codice.

Un professore potrebbe persino trasformare questo in un concorso, in cui team di studenti provano tutti a rivedere il software e il miglior risultato viene condiviso con il resto del mondo.

Se i loro sforzi di refactoring falliscono, non sei più indietro di quanto eri. In tal caso, le dichiarazioni di non responsabilità sono una cosa meravigliosa. Condividi semplicemente il codice, ma aggiungi un avvertimento: "Non è carino. Quando ho scritto questo, stavo cercando di portare a termine la mia ricerca - non pensavo che sarebbe mai uscito dal mio laboratorio informatico. Ma sei il benvenuto per dare un'occhiata se lo desideri davvero. "

Mi piace, mi sarebbe piaciuto avere questa possibilità quando ero in Uni. Leggere e comprendere il codice di altre persone è un'abilità e deve essere appresa.
O. R. Mapper
2015-04-02 16:49:06 UTC
view on stackexchange narkive permalink

Nelle altre risposte sono stati menzionati molti punti a favore della pubblicazione del codice, e sono completamente d'accordo con loro. Pertanto, poiché è stata discussa la necessità di base della pubblicazione del codice, vorrei integrarla con una lista di controllo di ulteriori punti che devono essere considerati. Molti di questi problemi probabilmente compaiono praticamente in tutti i software accademici, quindi anche se non puoi rispondere "Questo non si applica al mio progetto". a tutti loro, dovresti almeno essere in grado di rispondere "Questo è un problema, ma possiamo risolvere questo problema entro ..." prima di pubblicare il tuo codice:

  • Are hai autorizzato la pubblicazione del codice?
    • Puoi garantire di aver utilizzato solo frammenti di codice che sei autorizzato a ridistribuire? O forse hai utilizzato codice da sorgenti non aperte che potresti usare per il tuo software interno, ma che non sei autorizzato a pubblicare? Potete garantire che tutto il codice che avete utilizzato possa essere pubblicato in un unico pacchetto completo? La compatibilità delle licenze non è un problema banale.
    • Puoi scoprirlo in modo affidabile? Hai affidato all'esterno qualche parte del tuo lavoro di codifica o hai integrato codice non pubblicato altrove? Ad esempio, hai supervisionato studenti durante le loro tesi di laurea o hai assunto assistenti di ricerca studenti, il cui lavoro era basato sulla tua ricerca e quindi il loro codice è stato aggiunto alla tua base di codice? Qualche collega ha contribuito con il codice alla tua base di codice? Hanno ricevuto parte del loro codice dagli studenti? Tutte queste persone coinvolte hanno prestato debitamente attenzione ai problemi di licenza (se del tutto avevano le conoscenze per esprimere un giudizio istruito su queste domande sulle licenze)? È ancora possibile determinare l'origine di quali parti del codice? Le persone che hanno contribuito a ciascuna parte lo sanno ancora? Sono ancora "nel raggio di contatto" per te?
    • Il codice è stato sviluppato durante l'orario di lavoro sulla base di fondi di terze parti? In tal caso, i termini del contratto di finanziamento consentono di pubblicare il codice o includono i requisiti per cui il software creato all'interno del progetto finanziato deve essere condiviso esclusivamente con i partner del progetto?
  • Disponi di risorse (tempo e altro) sufficienti per spendere gli sforzi per ripulire il codice e i suoi commenti in modo che sia ancora significativo, ma non fornisce alcuna informazione che non deve diventare pubblico?
    • Hai commenti che rivelano chi ha lavorato al codice? Le persone che hanno contribuito al codice sono state ufficialmente autorizzate a lavorare alla rispettiva ricerca, come da finanziamento ? (Gli sviluppatori di software sono ben consapevoli che il lavoro di squadra e il riutilizzo dei componenti sono aspetti fondamentali dello sviluppo del software. Le agenzie di finanziamento, sfortunatamente, sono in genere molto ignare di questo e presumono che se lo sviluppatore A è finanziato dal progetto X e lo sviluppatore B è finanziato dal progetto Y, A lavora esclusivamente su X e B lavora esclusivamente su Y e, rivelando che, wlog, A ha trascorso solo mezz'ora a fare qualcosa che è finito nel progetto Y potrebbe portare a gravi conseguenze, come reclamare parti del finanziamento.)
    • Qualcosa nei dati pubblicati fornisce informazioni sulle particolarità di come è stato svolto il lavoro che non devono diventare pubbliche? Questo è particolarmente importante se l'intera cronologia del commit in un VCS sta per diventare pubblico (o, praticamente, significa che la cronologia del commit non dovrebbe mai essere pubblicata), ma può anche svolgere un ruolo in altre situazioni. Ad esempio: è stato eseguito alcun lavoro sul codice al di fuori degli orari di lavoro ufficialmente assegnati (ad esempio durante i fine settimana)? L'orario di lavoro dimostra che hai lavorato più del limite legale del tuo paese per l'orario di lavoro giornaliero? Gli orari di lavoro rivelano che non hai rispettato le pause previste dalla legge? Gli orari di lavoro rivelano che le persone assegnate ad altri progetti hanno dato dei contributi? Gli orari di lavoro forniscono qualche motivo per diffidare delle affermazioni che hai fatto altrimenti sui tuoi orari di lavoro (ad esempio nei rapporti di successo del progetto che richiedevano un'assegnazione dettagliata degli orari di lavoro a pacchetti di lavoro predefiniti con determinate assegnazioni massime)? Qualcosa rivela che hai lavorato in situazioni in cui non avresti dovuto lavorare (ad esempio durante una riunione di progetto)? Qualcosa dimostra che hai lavorato in luoghi in cui non avresti dovuto lavorare (ad esempio da casa, quando il tuo contratto non ti consente di svolgere l'ufficio a casa, ad esempio per complicazioni relative all'assicurazione)?
    • Sono presenti informazioni segrete nel codice , come password, nomi di account utente o URL che non devono essere conosciuti pubblicamente (perché i server non sono disposti per gestire quantità maggiori di utenti oltre a un numero limitato di persone selezionate a chi è stato fornito personalmente l'URL per la configurazione del test)?
  • Il codice è utilizzabile da qualcun altro?
    • Il codice verrà eseguito o richiede grandi sforzi di configurazione? Puoi dedicare lo sforzo richiesto per spiegare quale configurazione è necessaria?
    • Il codice può essere compilato? Hai utilizzato compilatori modificati o personalizzati non ufficiali che non sono accessibili pubblicamente? In tal caso, il codice aggiunge qualcosa oltre a quanto potrebbe essere già fornito come algoritmo di pseudo-codice nei tuoi documenti?
    • Il codice richiede risorse esterne? Il codice essere utile se può accedere a server, librerie o set di dati che non puoi pubblicare insieme al codice per un motivo o per l'altro? È possibile fornire almeno una descrizione di queste risorse o le loro interfacce sono soggette a una sorta di NDA?
    • Il codice apporta modifiche irreversibili ai sistemi su cui viene eseguito? Ad esempio, cambia automaticamente qualsiasi configurazione di sistema (come la sovrascrittura del percorso di ricerca del sistema)? Esegue un accesso di basso livello ai componenti hardware che potrebbero, in determinate costellazioni (che si evitano internamente nelle configurazioni di prova) causare danni permanenti a qualsiasi componente? Potete avvertire in modo affidabile gli utenti del codice di tali possibili effetti collaterali indesiderati?
Consideri le agenzie di finanziamento o i datori di lavoro che setacciano i registri dei commit per determinare le conseguenze legali. Questa è una chiara preoccupazione teorica. Quindi, hai qualche prova che sia mai accaduto? La mia limitata esperienza con le agenzie di finanziamento, in particolare le sovvenzioni ERC, è in realtà l'opposto, anche se questo non conta.
@Blaisorblade: "Allora, hai qualche prova che sia mai accaduto?" - la motivazione per il finanziatore a scoprire le possibilità di ridurre i propri costi sembra chiara e le possibili ripercussioni che potrebbero essere imposte (restituire parte del denaro della sovvenzione) sono sufficientemente gravi (perdere denaro precedentemente concesso è probabilmente una delle poche cose che possono mettere i dipendenti uni in gravi difficoltà con l'amministrazione uni) che sembra ragionevole non aprire questo possibile punto di attacco in primo luogo.
King
2015-01-24 23:32:51 UTC
view on stackexchange narkive permalink

Certamente. L'unico modo per migliorare la scrittura di un buon software è ottenere feedback (tutti i tipi). Se hai paura del feedback, non andrai molto lontano. Le tre basi per scrivere un ottimo software sono pratica, pratica e pratica.

Ora passiamo alla questione se danneggerebbe la tua carriera se le persone scoprissero che le tue capacità di scrittura di software non sono di prim'ordine. Penso che no, al contrario, ti rispetterebbero per la tua integrità accademica. E non vedo l'ora di collaborare con te.

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

Puoi semplicemente inviarlo a GitHub e provare a mantenere un progetto nel caso in cui altre persone interessate al tuo progetto possano accedere facilmente al tuo codice e forse possono aiutarti a migliorare il tuo codice.

+1 - Questa è la prima cosa che mi è venuta in mente.È un posto sicuro in cui memorizzare il proprio codice, meglio che averlo in agguato su un disco rigido o una chiavetta USB che morirà o si perderà.Inoltre, il codice è facilmente gestibile e tutte le modifiche al codice vengono tracciate e, come dici tu, altri possono collaborare e contribuire (a condizione che vengano scelte le giuste impostazioni di accesso).
user28382
2015-01-25 11:03:30 UTC
view on stackexchange narkive permalink

Sì, dovresti. Dopotutto, il codice sorgente del kernel Linux è un bel pasticcio e questo non ha impedito a molti sviluppatori professionisti di studiarlo e di contribuire con patch e aggiunte. Ricorda anche che il kernel Linux è la base del sistema operativo che esegue i supercomputer più veloci e potenti e la maggior parte dei dispositivi nel mondo.PD: Linus Torvalds, il ragazzo che ha inventato il kernel Linux ha una carriera molto redditizia e di successo che non ha è stato influenzato negativamente o danneggiato in alcun modo dal fatto che il codice sorgente del kernel Linux è disordinato.

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

Un motivo per cui nessuno ha menzionato il motivo per cui dovresti condividere il tuo codice è che potresti trovare qualcuno che è interessato a collaborare con te, ma che è disposto a dedicare più tempo a ripulire il codice e farlo funzionare su sistemi diversi, ecc. che sul fare lo sviluppo innovativo che hai fatto.

Molte persone trovano questo tipo di lavoro molto soddisfacente e se il tuo codice è veramente utile per loro potrebbero essere felici di farlo. In ogni caso, potresti scoprire che ricevere feedback da persone che hanno provato a usarlo, ma hanno bisogno di qualche tipo di aiuto, è una buona motivazione per renderlo più gestibile / più facile da usare e da capire.

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

Dovresti assolutamente condividere il tuo codice.

Per ordinare le cose, crea regioni delle stesse parti di codice come fare una regione di un tentativo fallito e spiega perché non è riuscito. Inoltre, se sviluppi in Visual Studio, installa l'estensione "CodeMaid" da Extension Manager e pulisci la tua soluzione completa. Rimuoverà gli spazi e rimuoverà anche i riferimenti inutilizzati migliorando la maggior parte delle cose.

Se sviluppi in C #, condividi il tuo codice con me. Posso anche aiutarti a sistemare le cose :)

@PeterMortensen: [Aggiungere i collegamenti solo se esiste una ragionevole possibilità che qualcuno voglia fare clic su di essi.] (Http://meta.academia.stackexchange.com/q/1252/7734)
@Zuberi005 è l'unica persona che offre una * soluzione * automatizzata per aiutare a ripulire il codice e l'unica persona che si offre personalmente per aiutare a ripulire il codice. E qualcuno ha svalutato? Che si vergognino!
CaptainCodeman
2015-01-25 20:15:12 UTC
view on stackexchange narkive permalink

Condividilo se vuoi, non condividerlo se non vuoi. So che questo suona irriverente, ma penso che al giorno d'oggi ci sia troppa pressione per "condividere tutto" e le persone cercheranno di renderti colpevole per non aver condiviso, ma in realtà non hai alcun obbligo di condividere nulla.

I risultati riproducibili sono uno dei capisaldi del metodo scientifico. E questo richiede condivisione. Il tuo commento è come dire "... ma in realtà, gli scienziati non hanno alcun obbligo di aderire al metodo scientifico".
Certo, la condivisione può essere facoltativa * al di fuori * della comunità scientifica, ma di sicuro non è facoltativa * all'interno * della comunità scientifica.
@Contango Sì, questo è un punto giusto se il rilascio del software aiuta a riprodurre i risultati.
@JeffE Non ho condiviso nulla, di cosa stai parlando? Trovo il tuo messaggio criptico. Se desideri essere capito, sii un po 'più chiaro.
Hai condiviso la tua opinione, ovviamente.
user168715
2015-02-12 08:54:28 UTC
view on stackexchange narkive permalink

Metti una dichiarazione di non responsabilità che il codice viene fornito "così com'è" senza promesse di supporto, ecc. Quindi condividi il codice.

Case study: trasformare una nuvola di punti isolati in una superficie a tenuta stagna è un problema pratico estremamente importante, utilizzato ovunque dalla robotica alla visione artificiale all'elaborazione dei dati da sensori 3D come Microsoft Kinect.

La ricostruzione della superficie di Poisson ha 7 anni e da tempo ha smesso di essere lo stato dell'arte per risolvere questo problema. Ma tutti lo usano ancora oggi. Perché? Perché l'autore ha rilasciato il codice e da allora è stato incorporato in un mucchio di popolari librerie di elaborazione della geometria. Il documento ha ora più di mille citazioni.

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

Sì. Dovresti rilasciare il tuo codice, probabilmente sotto la licenza CRAPL. L'obiettivo è costruire un futuro migliore e il tuo pessimo codice aiuterà le persone a farlo. Un avvertimento è che dovresti documentare come utilizzare con successo il codice abbastanza bene da consentire a qualcuno di avere una discreta possibilità di riprodurre i risultati pubblicati.

E, non preoccuparti: un po 'di codice di ricerca su cui ho lavorato era stato sviluppato da 5 postdoc di indifferente capacità di programmazione per una serie di progetti nel corso di circa 8 anni.

L'elenco delle variabili globali (solo i nomi) era di circa 4 pagine.

Circa un terzo di essi è stato utilizzato per impostare il comportamento predefinito per modificare la funzionalità che funzionava in un dato momento. Un altro 20% erano strutture di dati parallele - il che significa che memorizzavano approssimativamente gli stessi dati - e quindi funzioni nel codice estratte dalle strutture di dati più o meno a caso. Sì. A volte erano fuori sincronia. E a volte doveva essere fuori sincrono.

C'erano circa 50 versioni non documentate, memorizzate in porzioni casuali del server del gruppo - ognuna delle quali serviva almeno a uno scopo specifico - e solo un amministratore manteneva quegli scopi specifici nella sua testa. Era più comune che non avere persone che usavano la versione "sbagliata" per un determinato scopo.

L'uso di procedure ricorsive incredibilmente complesse, ad esempio, per scrivere un file, era standard. Seriamente, poche migliaia di righe per salvare i risultati dell'immagine.

Oh, e i resti di un tentativo macellato di risolvere una perdita di memoria (in realtà una figura invisibile) non creando mai una nuova variabile.

Oh, e il database, quel bel database. Circa la metà dei dati era inutilizzabile a causa di (a) errori di progettazione del database (b) errori di immissione dei dati (nei programmi automatici). Il codice per recuperare i file dal database era lungo diverse centinaia di righe di logica ... Il database stesso era anche così gentile da contenere molte copie degli stessi dati, molte delle quali con collegamenti interrotti tra le tabelle. Vincoli? No. Ho visto uno statistico passare dall'inquietudine alla paura fino alle lacrime fino all'abbandono del database entro un mese dall'affidamento del database ...

C'erano da 0 a 1 modi per utilizzare il software e recuperare i risultati corretti in un dato istante ...

E sì, c'erano gotos.

Oh, e nel tentativo di garantire operazioni opache e non deterministiche, una serie di calcoli è stata eseguita chiamando la GUI pulsanti con richiamate associate.

Circa il 90% di una data funzione non era, in modo abbastanza affidabile, rilevante per il risultato o per il debug del risultato, essendo composto, piuttosto, da progetti a breve termine inseriti e poi mai rimosso. Scherzi a parte, ho scritto una versione completa di funzionalità che funzionava effettivamente che era 1/10 della dimensione ... Le frazioni significative erano funzioni inserite con copia-incolla, molte delle quali differivano l'una dall'altra.

E, no Virginia, non c'è documentazione. O nomi di variabili descrittivi.

Oh, e le dll non documentate, difettose, e le librerie associate - generate usando codice che non esisteva più.

Tutto scritto in Matlab. In termini di pratiche di codifica Matlab, presumi che un uso abbondante di eval sarebbe il momento clou della tua giornata.

Seriamente, il tuo codice non è così male.

Detto questo, se hai fatto qualcosa di veramente utile, potrebbe migliorare la tua carriera rilasciare una versione ripulita in modo che altre persone utilizzino e citino la tua libreria. Se hai appena fatto qualcosa, probabilmente la riproduzione è fin dove ti consiglio di andare.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...