2009-04-22 3 views
10

Se stavi pubblicizzando una posizione di programmazione per uno sviluppatore PHP (per esempio) e qualcuno con un ottimo curriculum applicato, ma erano uno specialista in ASP.NET e la componente PHP del loro CV era molto leggera, li consideri ancora per la posizione? Pensi che le abilità di programmazione in generale prevalgano su abilità linguistiche specifiche?Quanto sono trasferibili le abilità di programmazione tra le lingue?

risposta

14

Un buon programmatore può facilmente trasferire tra le lingue.

Tuttavia, il problema è che un buon programmatore, per definizione, è qualcuno che ha già le competenze per utilizzare una varietà di lingue. Se stai assumendo qualcuno che ha solo esperienza in un unico linguaggio e ambiente di programmazione (compilatore, framework, ecc.), Allora potrebbe non avere l'esperienza necessaria, soprattutto dato che lo "stack" PHP è in qualche modo diverso da .NET.

Se, tuttavia, state assumendo qualcuno che conosce Java, PHP e ha una certa esperienza con Python, questo indica che hanno già una buona gamma di esperienza di programmazione ed è molto più probabile che le loro competenze si trasferiscano facilmente ad ASP.NET .

Questa è la mia opinione.

+0

Cerca di spiegarlo a un cliente! : -/ – nalply

4

Non conoscere una certa tecnologia/linguaggio è proprio questo: non essere familiari. Se una persona ha un ottimo curriculum e mostra una profonda immersione nelle tecnologie con cui ha lavorato e ha buone capacità di programmazione e di risoluzione dei problemi, dovrebbe assolutamente essere presa in considerazione. L'unica eccezione è la situazione in cui hai bisogno di uno specialista qualificato in questo momento perché non hai tempo o puoi fargli imparare per qualche motivo.

7

Molto trasferibile. Per un buon programmatore, la sintassi è banale, purché sappiano dove e quando alcuni schemi di progettazione e tecniche di risoluzione dei problemi dovrebbero essere utilizzati (e quando sono disponibili per una lingua), quindi non ci dovrebbero essere motivi per cui non dovrebbero essere considerati .

7

Assolutamente. Le abilità di programmazione generale sono il valore fondamentale per qualsiasi sviluppatore. In effetti, le abilità comunicative possono anche superare ogni altra cosa. Un buon programmatore è un buon comunicatore.

La programmazione dovrebbe riguardare la comunicazione poiché il codice impiegherà più tempo a essere guardato e modificato rispetto a quanto necessario per scriverlo la prima volta, quindi è meglio comunicare ciò che si suppone stia facendo.

Un programmatore che ha una solida base nei fondamenti della programmazione dovrebbe essere in grado di arrivare alla velocità ragionevolmente rapidamente in quasi tutte le lingue.

1

Dipende. Se qualcuno ha un forte background tecnico, talento e passione dovrebbe essere abbastanza facile scegliere una nuova lingua o dominio. Voglio dire, questo è il punto centrale dell'informatica: le cose cambiano ogni giorno e ogni buon programmatore dovrebbe essere in grado di adattarsi.

4

Onestamente, potrebbe non sembrare così, ma credo che questa domanda sia quasi troppo vaga per ricevere una risposta accurata. Penso che molto di questo dipenderà dal lavoro specifico per il quale stai assumendo.

Se vi aspettate che qualcuno entri e sia immediatamente produttivo ad alto livello, allora volete davvero qualcuno con una forte esperienza con la lingua che userete. È sempre meglio avere almeno una persona che guida il progetto che capisca veramente la lingua e come usarla senza "andare controcorrente" nelle sue scelte progettuali. Allo stesso modo, se il candidato ha forti preferenze linguistiche, ed è il tipo che rimpiangerà sempre la scelta delle lingue (parlando di come il suo preferito avrebbe reso tutto migliore), allora non sarà la scelta migliore per questo ruolo.

D'altra parte, se questo non è necessariamente lo sviluppatore principale del progetto, potrebbero esserci altre opzioni. È completamente possibile per uno sviluppatore PHP competente entrare e assistere con un progetto Java e viceversa. Uno sviluppatore forte con buone capacità generali sarà migliore di uno sviluppatore PHP medio per molti aspetti. La sfida lì, come sempre, è nel valutare le loro abilità e se saranno in grado di adattarsi rapidamente alla nuova piattaforma.

2

Vorrei aggiungere l'avvertenza alle altre risposte qui che mentre le competenze di programmazione sono preziose e trasferibili, i reparti Risorse Umane possono semplicemente cestinare il tuo curriculum perché non hai le cose 'giuste' nel tuo curriculum. Se poi procedi a risolvere il problema inserendo una lingua sul tuo curriculum che non sei pronto a rispondere alle domande dell'intervista, probabilmente non impressionerai le persone che ti intervistano. È una catch-22 e un problema piuttosto grande nell'assunzione di alcune aziende, che fa schifo per le aziende e per le persone che vogliono lavorare lì e per le persone che già lavorano lì.

2

Direi che, in generale, essere un buon programmatore PHP significa che hai ottime possibilità di diventare un buon programmatore ASP.NET se dovessi passare il tempo ad appoggiarlo. Essere in grado di programmare è un talento, e l'apprendimento di una lingua è principalmente di formazione. Detto questo, credo ci sia molto di più che avere familiarità con la sintassi del linguaggio. Un buon programmatore dovrebbe avere una buona conoscenza dei framework disponibili, delle librerie, delle pratiche specifiche della lingua, ecc. Un programmatore ASP può scrivere codice PHP dopo aver letto un buon libro in PHP. Ma per diventare un buon programmatore PHP, è necessaria una comprensione molto più profonda e questa comprensione deriva principalmente dall'esperienza.

Quindi, tutto si riduce a questo: un buon programmatore può probabilmente imparare molte lingue. La domanda è, pagheresti per averlo reso un programmatore esperto?

3

D'accordo, un buon programmatore può trasferire tra le lingue.

Ma, non importa quanto sei bravo, un nuovo linguaggio/paradigma/mentalità ci si abitua. Se stavo assumendo un dev java. e aveva un C++ dev che era 'intelligente e ha fatto le cose', avrei dovuto avere una ragione molto convincente per assumerlo su qualcuno con esperienza java, considerando che 'familiare' e 'produttivo' sono due cose diverse.

In poche parole, se avevo bisogno di un anziano, la persona con l'esperienza rilevante vince su qualcuno che ha familiarità con la sintassi. Junior, forse allora c'è un margine di manovra.

1

Fintantoché il trasferimento è tra linguaggi di programmazione dello stesso paradigma, penso che sia facilmente trasferibile. Convertire un programmatore C in un programmatore Java è piuttosto difficile, e molti insegnanti che conosco preferiscono gli studenti senza alcun background a quelli con lo sfondo di tipo "C" quando imparano java.

1

PHP e ASP.NET possono essere simili, ma PHP e C# sono molto diversi e, se si utilizza C# 3, esiste una curva di apprendimento molto precisa. Se il programmatore può solo fare un lavoro di front-end, non sarà un grosso problema.

Ora, quanto è trasferibile la conoscenza tra le lingue è diversa, in quanto dipende se la lingua è lo stesso tipo di programmazione (strutturale, funzionale, orientata agli oggetti). Un grande programmatore C potrebbe non trasferire le sue conoscenze a OOP o FP, ad esempio, poiché il modo di approcciare il design è molto diverso.

4

La parte difficile di questi linguaggi di alto livello è la "libreria di classi", richiede un po 'di tempo per utilizzare le funzioni "integrate" che è possibile utilizzare. (non vuoi reinventare la ruota).

Ma se si considera solo la lingua in sé, poiché la maggior parte delle lingue sono correlate l'un l'altra in qualche modo un ragazzo che conosce più di 5 lingue ha un vantaggio rispetto a un ragazzo che conosce solo una lingua.

E se lo si riduce a un reclutamento, è una domanda su quanto tempo si intende mantenere il programmatore? Viene assunto per fare un lavoro veloce, per esempio 2-3 mesi o assumete un nuovo programmatore che volete mantenere per 3 o più anni?

Il ragazzo multilingue sarà probabilmente meglio nel lungo periodo, ma ci vorrà del tempo per farlo fino a velocità se non si conosce questo linguaggio specifico ....

/Johan

0

Se ti sei dato una buona educazione in programmazione si. Con ciò intendo che hai fatto un sacco di programmi, imparato ciò che la cpu sta facendo a un livello basso, capire gli algoritmi e la complessità del tempo di esecuzione, e sono bravi a risolvere i problemi.

Penso che alcune lingue abbiano ancora una lunga curva di apprendimento. Potresti essere in grado di entrare in una squadra di programmatori C++ e aiutarli senza alcuna esperienza, ma sicuramente ti caccerai contro i suoi angoli brutti e oscuri spesso.

I linguaggi di alto livello come sql o python possono sembrare molto facili da ottenere, ma le persone con anni di esperienza comprendono i trucchi, le caratteristiche non documentate e le cadute che non sono ovvie al valore nominale.

2

Le competenze sono facilmente trasferibili, ma ciò che rende una persona eccezionale in una particolare lingua piuttosto che semplicemente ok è la loro profonda conoscenza delle stranezze di quella lingua.

Ogni lingua ha i suoi strani idiomi che si possono raccogliere solo dopo aver lavorato con la lingua per qualche tempo. Essere esperti in un'altra lingua simile non aiuta affatto.

Anche per chi conosce ASP.NET come il palmo della mano, la prima volta che passa a PHP, ci sarà ancora una fase "WTF" importante che devono superare, durante il quale sono " Produrrò un codice piuttosto sgradevole. Potrebbe essere un codice funzionante, ma non sarà facilmente gestibile e probabilmente non si integrerà molto bene con il resto del progetto.

1

Domanda sbagliata, penso. È quanto trasferibili sono le abilità di programmazione tra i quadri. Uno sviluppatore asp classic e lo sviluppatore jsp possono probabilmente leggere e scrivere l'un l'altro codice. Lo stesso per Java Server Faces e ASP.NET. Come so dal mio attuale progetto, uno sviluppatore di winform C# potrebbe avere difficoltà a trasferire i suoi talenti a un progetto C# ASP.NET. La sintassi è una parte così piccola dei linguaggi di programmazione mainstream (escludo stranie come Prolog e F #, che hanno un approccio al codice fondamentalmente diverso rispetto alla famiglia delle lingue coinvolte)

1

Una delle cose che dà forma al mio atteggiamento verso qualsiasi tecnologia (/ piattaforma/prodotto/lingua) è quanto specifica sia l'esperienza di apprendimento. Ho colleghi che sono estremamente competenti in MS Access e che negli anni hanno costruito una grande varietà di sistemi aziendali su misura (di qualità variabile). Ma nonostante questo, sanno quasi nulla su sql. Se avessero passato tre mesi a mantenere un piccolo sito PHP/MySQL, sarebbero stati in una posizione molto migliore (abilità saggia) per iniziare almeno a guardare i sistemi Informix/Sybase/SQL Server/etc.

Oltre un certo punto anche se il costo dell'apprendimento di nuove tecnologie probabilmente svanisce. Passare da PHP a VBscript mi ​​è sembrato piuttosto irritante quando ho imparato sia dal momento che i semplici cambiamenti nelle convenzioni (ad esempio l'uso di ";") aggiungevano quel minimo fastidio non necessario nel processo di apprendimento.Più di recente ho dovuto passare da C#, Perl e VBScript un bel po 'e non è un problema - si seguono le regole di ogni grammatica senza pensarci.

2

A un livello, le competenze di programmazione sono indipendenti dalla lingua. La programmazione è fondamentalmente un problem solving. È necessario sapere come identificare il problema, analizzarlo e scomporlo nei suoi componenti essenziali e progettare una soluzione (che si tratti di algoritmi, strutture dati o, più spesso, entrambe). Ogni lingua è semplicemente una cassetta degli attrezzi che impieghi per costruire la soluzione. Alcuni, come Java e C#, sono più semplici da usare, ma hanno strumenti di blunter, quindi raramente puoi affinare la tua soluzione esattamente nel modo desiderato. C è il linguaggio più flessibile e potente (al di fuori dell'assembler). Ti dà il potere e la libertà di fare praticamente esattamente ciò che vuoi fare, incluso l'abuso generalizzato (intenzionale, ovviamente) violazione delle sue regole (non forzate). Ma la sua cassetta degli attrezzi è piena di molti strumenti molto nitidi, e richiede molte più competenze di programmazione da usare in sicurezza (che è ciò che lo rende un buon ponte tra, per esempio, Java e il codice macchina che alla fine viene eseguito dalle CPU

C'è una cosa che mi preoccupa di questa conversazione e questo è l'enorme numero di persone che hanno programmato solo in linguaggi altamente astratti come Java, C# e qualsiasi linguaggio web con script (Python viene subito in mente). Ho programmato un buon codice a due (almeno una volta) sulla mia codifica di 37 anni

È vero che ogni nuova lingua ha una curva di apprendimento che abbassa la sintassi, la semantica, le librerie e le idiosincrasie. è un altro problema che non vedo indirizzato qui.

Oggi, la maggior parte dei programmatori sono addestrati praticamente esclusivamente in lingue di alto livello e molto astratte e non hanno la minima idea di cosa il loro codice faccia effettivamente sotto le copertine. Stai comunicando con un "cervello" totalmente alieno, che è allo stesso tempo molto stupido e, attraverso la capacità di mettere insieme milioni, persino miliardi, di semplici operazioni e di eseguirle a velocità quasi inimmaginabile, può simulare una brillantezza virtuale.

I programmatori con cui lavoro non sono mai stati radicati nei linguaggi di assembly, C, o anche C++, ma che pensano di programmare solo a livello di Java, C#, ecc. Finiscono senza assolutamente capire cosa sia il bello il codice che stanno scrivendo in realtà sta per fare, e quali sono i vantaggi e le conseguenze (spesso DIRE) delle scelte che fanno nel modo in cui brandiscono la lingua.

Hai bisogno di un po 'di esperienza con un linguaggio che possa portarti a un livello basso - specialmente con DOS da riga di comando o Unix senza livelli GUI - per esempio, prima che i sistemi operativi in ​​modalità protetta isolino il programmatore dalla codifica al nudo e alla negoziazione con porte, indirizzi di memoria, tabelle di indirizzi di interrupt, registri e codici op operativi e operandi che la macchina esegue effettivamente.

Ti darò un esempio di ciò di cui sto parlando. Quanti programmatori Java hanno mai inizializzato un StringBuilder o StringBuffer in questo modo?

StringBuffer strBuf = new StringBuffer(); 

e quindi ha proceduto a fare una dozzina di operazioni .append() su di esso? In particolare all'interno di un ciclo che esegue migliaia, anche milioni di volte. Ciò di cui il programmatore Java medio non è consapevole è che il costruttore predefinito crea un buffer interno di 16 byte. Come ogni strBuf.append (str); aumenta la lunghezza del contenuto del StringBuffer, è costretto ad allocare un nuovo, più grande blocco di memoria, copiare i contenuti esistenti nella memoria, aggiungere la nuova stringa e quindi contrassegnare il vecchio buffer per gc. Ciò si risolve in un numero enorme di allocazioni, copie e memoria frammentata fuori dall'ambito che devono essere gc'd.

Se si definisce StringBuffer appena fuori dal ciclo e si utilizza il costruttore che gli dà una dimensione del buffer iniziale che è più che grande abbastanza per gestire qualsiasi lunghezza massima prevista, si alloca un singolo blocco di memoria e non si deve mai fare tutto di quelle migliaia o milioni di riallocazioni, copie e gc non necessari.

StringBuffer fixedStrBuf = new StringBuffer(1024); 

Poi, ogni .Append() nel ciclo semplicemente copia la nuova stringa su quello esistente nello stesso tampone. Quando hai finito e hai recuperato il contenuto con fixedStrBuf.toString(), chiama semplicemente fixedStrBuf.setLength (0); che lascia intatto il buffer stesso, ma lo reinizializza per riutilizzarlo. Puoi anche fare la chiamata setLength (0) all'inizio di ogni ciclo. Assicurati che l'oggetto StringBuffer diventi fuori ambito appena esci dal ciclo di elaborazione che lo riutilizza continuamente, o almeno assegni un valore di NULL al termine, quindi può essere gc'd quando non ne ha più bisogno.

BTW, StringBuilder è più veloce di StringBuffer ed è preferibile se non si ha la necessità di rendere il codice thread-safe. Inoltre, è possibile aumentare ulteriormente la velocità e la flessibilità (e una maggiore protezione da null imprevisti) utilizzando il metodo Apache Commons:

org.apache.commons.lang.text.StrBuilder;

Come StringBuilder, non è sincronizzato, quindi usarlo con attenzione, ma ha almeno una dozzina di altri metodi utili, tra cui .clear(), che fa la stessa cosa che fa .setLength (0), ma rende codice un po 'più leggibile.

Un paio di anni fa, sono stato chiamato da un'importante compagnia di trasporti dopo che il loro programmatore stella Java (il 10% superiore della sua classe a Penn, e ha seguito il test Brainbench) aveva scritto un programma ETL (datamining) che era Si supponeva che prendesse i dati che arrivavano da un giorno all'altro, facessero alcune importanti trasformazioni su di esso e creasse un datamart temporaneo da cui gli ingegneri senior potevano richiamare grafici, griglie e report di cui avevano bisogno per il lavoro quotidiano. Sfortunatamente, il suo programma ha impiegato tra i 300 ei 360 minuti (da 5 a 6 ore) per funzionare, e gli ingegneri erano rimasti indietro di una mezza giornata perché non riuscivano a ottenere i dati di supporto alle decisioni fino all'ora di pranzo. Ho trascorso due settimane analizzando e rielaborando il programma e, senza alcuna riscrittura, ho ridotto il tempo di esecuzione a 15-20 minuti. In quel programma, tra molti altri usi impropri del linguaggio (tutti corretti per quanto riguarda la sintassi e la semantica), il programmatore aveva effettivamente usato il precedente StringBuffer() con circa una dozzina di appende ogni passaggio in un ciclo che andava bene oltre un milione volte, creando fino a quindici milioni di allocazioni, copie e cancellazioni non necessarie. E quella era solo una riga di codice. Potrei scrivere un libro su tutti i modi in cui il programmatore non era a conoscenza delle conseguenze di basso livello del suo codice Java bello, ma terribilmente inefficiente.

Quindi, il mio consiglio è, invece di provare ad aggiungere Ruby o Python o qualsiasi altra cosa sia il tuo nuovo repertorio, prendi alcuni mesi del tuo tempo libero, studia C (o C99 o anche più vecchio - don " t preoccupati di cercare di raggiungere il nuovissimo standard C11, che quasi nessuno usa ancora), e ottenere un libro intitolato "Cracking the Coding Interview" di Gayle Laakmann, che, tra le altre perle, ha 150 piccoli esercizi di codifica del digitare potrebbe essere chiesto di codice su una lavagna durante un'intervista tecnica. Possono essere tutti risolti in C, C++ e Java (dà risposte alla fine del libro in Java perché è più ampiamente compreso, anche se C fornirebbe soluzioni molto più semplici ed eleganti). Lavora attraverso di loro in C mentre stai studiando e imparerai un'enorme quantità di conoscenza su ciò che è buona programmazione Java e programmazione Bad Java. Post scriptum trovare un paio di buoni primer C - provare a imparare C dal manuale originale K & R (Kernighan e Ritchie) è come sopportare un canale radicolare di due giorni. Se leggi K & R, trova almeno la seconda edizione. H & S (Harbison & Steel) è un manuale di insegnamento più chiaro.

BTW, le JVM che eseguono il tuo p-code Java sono scritte in C o C++.

+0

Se sei preoccupato/turbato da persone che conoscono/usano solo Java, C#, Python, ecc. Allora mi odierei ... Uso solo Javascript in questi giorni. – nickf