On the other hand, one could also argue that this makes code reuse more difficult. If team A uses language X and develops a nice script using the tool, team B can reuse the script only if they also work in language X.
Come sottolineato da altri, se la funzionalità è di natura non banale, la centralizzerei in modo che entrambe le lingue possano accedervi (e quindi riutilizzarle).
My question is: from your experience, what is the global impact of having multiple APIs (potentially more people using the tool, but they can't share their code) or a single one (less people using the tool, but they can share their code)?
In generale, ho lavorato su prodotti che spesso supportavano più linguaggi anche di quelli che ne avevano fornito uno proprietario (casi antichi prima che fosse così popolare semplicemente incorporare cose come Python o Lua).
E in pratica si tende ad allentare la collaborazione tra gli sviluppatori che lavorano in questi diversi linguaggi. Generalmente svilupperanno diverse comunità e mentalità e modi di pensare e fare cose. La comunità di scripting pensa e approccia le cose in modo diverso e potenzialmente produce un codice di utilità diverso da condividere rispetto alla comunità di sviluppatori Java JNI o alla comunità di sviluppatori di plugin C ++ nativi. E potrebbe esserci qualche ridondanza di sforzi tra questi gruppi separati, sia che si tratti di duplicare il codice o qualcos'altro (ad es. Pubblicare libri e documentare come programmare il software).
Sul lato positivo, espandi il tuo gruppo demografico di persone che contribuiscono allo sviluppo e l'essere in grado di utilizzare più lingue può talvolta essere utile anche a un singolo sviluppatore. Il linguaggio di scripting incorporato potrebbe essere più veloce per creare qualcosa e più facile da distribuire e port (dato che non ci sono binari da compilare) e più sicuro (es: nessuna possibilità di segfaulting), mentre il codice nativo potrebbe essere utile da raggiungere quando le prestazioni sono un problema legittimo.
Another team working with Python could reuse this new component with some minor adjustments while the team working with C would have to rewrite the whole component from scratch.
Se quel componente è abbastanza utile da essere condiviso, cercherò di evitare questa restrizione. Nel nostro caso i plug-in scritti in script possono eseguire / valutare plug-in scritti in codice nativo e viceversa (quelli erano sempre requisiti pratici nel nostro caso dato che la nostra architettura plugin riguardava i plugin che registravano componenti che si valutavano / eseguivano l'un l'altro, e il punto era rendere irrilevante il linguaggio utilizzato per implementare i plug-in).
Dove ho trovato sforzi duplicati era più nel regno di cose secondarie che non avrebbero migliorato la produttività tanto da cercare di estinguere del tutto come una piccola duplicazione negli sforzi di documentazione, funzioni di utilità, condivisione di frammenti di codice, ecc., e solo il collaborazione più libera che ottieni da sviluppatori che praticamente parlano e pensano in diversi linguaggi di programmazione.
Se riesco a divagare un po ', non sempre trovo produttivo aumentare al massimo il riutilizzo del codice piuttosto che cercare pragmaticamente di mantenerlo entro limiti pratici e mantenibili. Nella peggiore delle ipotesi è possibile vedere comitati emergenti e litigi su come qualcosa di piuttosto banale nella funzionalità che salva a mala pena le persone il tempo di usare dovrebbe essere progettato in una libreria centrale (es: sviluppatori che discutono se una classe di bounding box dovrebbe archiviare centri e metà -misura o due vettori min / max, quando stavano ottenendo molto più lavoro svolto usando semplicemente classi separate in quel caso nei loro progetti locali), con più argomentazioni, passo-passo e, peggio ancora, trovare la funzionalità che viene spostata in posizioni centrali che non sono state testate in modo approfondito e testate in produzione per essere abbastanza stabili da dirigere molte dipendenze nella sua direzione, solo per ricevere ripetute modifiche centrali che interrompono tutto il suo utilizzo.
Quindi in questi giorni non trovo così utile prendere il riutilizzo del codice a un livello così zelante. Non sto parlando di tollerare massicci sforzi nella duplicazione, o bug duplicati, o qualcosa del genere, ma solo per rilassarlo a un livello pragmatico (come forse non passiamo 2 ore in una riunione degli sviluppatori a discutere su come progettare un riutilizzabile classe di bounding box che soddisfa perfettamente le esigenze di tutti quando un accordo unanime sembra impossibile, e non impazzire se un paio di sviluppatori sviluppano uno specifico per i loro bisogni localmente nei loro progetti), e fanno affidamento su ciò che gli sviluppatori stanno producendo l'obiettivo finale anche se c'è un po 'di ridondanza in termini di cosa potrebbero fare.