L'ingegneria eccessiva è un segnale di avvertimento? [chiuso]


22

Quindi presentiamo un semplice esercizio di codifica a nuovi candidati con requisiti ben definiti. Occasionalmente riceviamo soluzioni che non risolvono realmente il problema, ma sono troppo progettate per risolvere un problema percepito, spesso al di fuori dei limiti dell'esercizio.

Ora la mia domanda è: è un segnale di avvertimento?

EDIT: Gran parte della discussione si basa sul test che è imperfetto, il che è un punto giusto. Come ho descritto in un commento, la premessa di base del test è mostrare come è possibile leggere i dati dal file in modo ragionevole (e rimarrai stupito dalla varietà di approcci che vediamo) e come abbinare il elementi prima di calcolare la latenza tra gli aggiornamenti. Ora affinché ciò funzioni, è necessario formulare alcune ipotesi sui dati e cerchiamo queste ipotesi e dichiariamo anche esplicitamente che vogliamo vedere l'approccio adottato (incluso l'approccio OO ecc.) Tutto questo in due ore lasso di tempo.

IMHO, quando stavo intervistando, è stato l'esercizio più completo che mi sono imbattuto.

Lo scenario particolare di cui sto riflettendo è in cui un candidato, anziché leggere dal file, ha accettato l'input "rete" in un'applicazione multi-thread, che chiaramente non rientra nell'ambito.


43
puoi per favore includere un esempio di cosa sia l'esercizio. Il problema potrebbe essere nella sfida e non nel candidato.
Reactgular,

13
Sei sicuro che i candidati abbiano compreso il problema presentato nell'esercizio? Semplice per la persona che presenta l'esercizio non è sempre uguale al candidato sotto stress da eseguire.
cdkMoose,

23
Il fatto che tu l'abbia definito "troppo ingegneristico" non determina la risposta? È come chiedere "Un candidato troppo fiducioso è un segnale di avvertimento"? Certo, a meno che non sia solo fiducioso, ma hai già messo le tue conclusioni nella premessa della domanda.
psr

3
@MathewFoscarini L'ingegneria genetica non è sempre negativa? Implica che la persona si concentri sulle cose sbagliate e abbia implementato una soluzione inutilmente complessa, che richiede tempo o difficile da capire e mantenere. Come potrebbe non essere percepito come un difetto?
Andres F.,

2
@AndresF. è un'intervista. Over Engineering risponde a una domanda in un'intervista dato che la maggior parte delle interviste dura solo un'ora. Potrebbe essere un risultato. Sì, scrivere 1.000 righe di codice per ordinare qualcosa è finita ingegneria, ma ha scritto 1.000 righe di codice in meno di un'ora! Se l'ingegneria eccessiva è un problema che deve essere filtrato durante il processo di intervista. Dovrebbe esserci un test più specifico relativo alla portata e alla complessità del progetto. Preferirei dare alla persona una sfida di architettura del software da risolvere. Per esempio; "crea un diagramma UML per un sistema di auto a guida autonoma".
Reactgular,

Risposte:


48

Il problema è che il test è distorto. Stai chiedendo a qualcuno di dimostrare la sua capacità di scrivere software complessi a livello aziendale usando un semplice esercizio che richiede solo pochi minuti. Ci sono altri intervistatori di altre aziende che lamentano che i candidati non mostrano abbastanza abilità nella progettazione orientata agli oggetti con questi esercizi, quindi le persone tendono a compensare eccessivamente. Ciò non significa necessariamente che il tuo candidato non sia in grado di utilizzare un codice più semplice quando la situazione lo giustifica.

Se vuoi sapere se è il caso del tuo candidato, basta chiedere loro di rifarlo, dando loro alcune linee guida specifiche. Dì: "Vedo che hai messo in mostra le tue abilità progettuali orientate agli oggetti, ma sembra eccessivo per un problema così semplice. Puoi riscriverlo usando solo due piccole funzioni?"


5
dove nella domanda dice "software complesso a livello aziendale"?
Reactgular,

12
@Nim - Penso che il punto di Karl sia che, se consideri l'eccessiva ingegneria, altri intervistatori potrebbero considerare una buona rappresentazione della comprensione dell'OOD da parte dell'intervistato. Il riferimento allo pseudo-codice potrebbe non essere esplicito come si pensa nel descrivere il tipo di approccio che ci si aspetta.
Mike Partridge,

7
Non sto dicendo nulla delle tue intenzioni, @Nim. I candidati leggono le cose in domande che non sono esplicitamente dichiarate, e molti intervistatori si aspettano che lo facciano. I candidati non hanno modo di sapere se sei quel tipo di intervistatore o meno, quindi sbagliano sul sicuro.
Karl Bielefeldt,

5
@KarlBielefeldt: sì, a volte le persone leggono le cose in domande che non sono esplicitamente dichiarate - per esempio, in domande poste qui su PSE ;-)
Doc Brown,

3
Che ne dici di una semplice soluzione per aggiungere una frase alla fine dell'esercizio che dice "descrivi nel minor codice possibile" o qualcosa del genere
user60812

30

Direi che questo è un chiaro segnale di avvertimento, ma non necessariamente squalificante per un candidato.

Esistono due problemi distinti che i candidati sembrano avere:

  1. Manca il punto dell'esercizio - Questo è abbastanza allarmante. Tutta l'abilità di programmazione nel mondo non creerà un buon risultato se qualcuno non è in grado di esprimere il problema che sta risolvendo correttamente. Ho scoperto che gli ingegneri più produttivi sono quelli che sono in grado di identificare il vero problema da risolvere, anche se non è esattamente il problema posto. Avere la capacità di pensare criticamente alla domanda posta e forse riformularla in qualcosa che è più semplice da risolvere è un'abilità fondamentale. Manca il punto in cui il problema viene chiaramente indicato dovrebbe essere una grande bandiera rossa.
  2. Ingegnerizzazione eccessiva della soluzione - Questo è un problema secondario ed è spesso il risultato del primo problema. Ci sono un paio di diverse patologie che possono avere questo risultato. Innanzitutto, non comprendere correttamente il problema o lanciarlo in modo troppo ampio può portare a una soluzione troppo complessa. Ciò è chiaramente correlato al primo punto sopra. Secondo, cercare di "mettersi in mostra" pensando a scenari futuri che potrebbero non essere realmente rilevanti. Questo può essere problematico perché indica che il candidato non ha compreso il valore della semplicità nelle soluzioni e nel rinviare la complessità fino a quando non è veramente necessario. Questo è qualcosa che può essere corretto con una buona guida, ma fa attenzione quando si porta qualcuno nell'organizzazione.

Suggerirei di dare seguito al candidato in merito alla sua risposta nel corso del processo. Piuttosto che limitarsi a guardare il loro risultato, prova ad accertare cosa li ha portati al risultato, e dato una guida, come avrebbero risposto e cambiare la loro risposta. Questo sarà probabilmente più rivelatore delle loro capacità che della loro diretta risposta al problema. I "perché" del loro approccio possono darti la sensazione se non lo stanno capendo, o se la loro comprensione era leggermente offuscata nel modo in cui hanno scelto di rispondere. Questo tipo di follow-up rivelerà anche di più sul loro approccio generale alla risoluzione dei problemi.

Inoltre, riesamina il problema stesso e vedi se forse non è chiaro e forse induce le persone a prendere la strada sbagliata mentre formulano le loro risposte.


23

No, non durante un colloquio di lavoro. Troppi intervistatori fanno cose come intenzionalmente sottostimano i requisiti e si aspettano che l'intervistato faccia ulteriori domande o guardi l'attenzione a questioni del mondo reale non esplicitamente menzionate.

Ecco alcune cose, fuori dalla mia testa, che probabilmente le tue esigenze non hanno menzionato:

  • Standard di codifica

  • Commenti

  • La gestione delle eccezioni

  • Nomi descrittivi di variabili, classi, metodi

  • A seguito dell'uso idiomatico della lingua

  • Corretto design orientato agli oggetti

  • Attenzione a possibili problemi di concorrenza

  • Scrivere casi di test per il codice

Hai prestato attenzione a una di queste cose senza dichiararla esplicitamente? Come farebbe il candidato a sapere quali ti interessano e quali no?

Un'intervista è un ambiente altamente artificiale. L'intervistatore sta spesso cercando di "ingannare" un po 'il candidato in modo da rendere difficile per l'intervistato dirgli quello che vuole sentire, e l'intervistato sta cercando di indovinare cosa l'intervistatore realmente vuole .

In generale, fare un errore su questa ipotesi è piuttosto diverso che fare un errore nelle decisioni di progettazione del mondo reale. Se vuoi sapere se qualcuno progetta troppo le cose, probabilmente devi parlare di design piuttosto che guardare un esercizio di codifica molto artificiale.


Non l'ho mai visto fatto. In realtà la maggior parte delle aziende desidera la soluzione più semplice e concisa. Sarei diffidente nel lavorare per qualsiasi azienda che non può formulare una richiesta adeguata, e per mancanza di un candidato in grado di comprendere "requisiti chiari" non lo assumerei.
Shaun Wilson,

1
@ShaunWilson: dipende molto. Immagino che le grandi aziende potrebbero essere interessate a vedere cosa puoi fare con specifiche chiare. Nei team più piccoli, le persone dipendono dalle reciproche capacità di entrare in empatia, estrapolare, leggere tra le righe ed esplorare da soli lo spazio problematico.
back2dos,

@ShaunWilson L'ho visto fare molte volte. Dare un incarico, persino dire al candidato di ignorare cose come il controllo degli errori e fornire solo le basi, quindi fallirle perché non includevano ogni singolo caso d'angolo e contingenza. È purtroppo molto, molto comune.
jwenting,

Per un esercizio di codifica, è un po 'troppo aspettarsi che i candidati si attengano agli standard e allo stile di codifica, ma la coerenza è un'aspettativa equa. Ci aspettiamo che i candidati usino la lingua in modo idiomatico, ma non stiamo cercando casi di test - il periodo di tempo è di sole due ore (penso che sia irrealistico.) Non credo nei trucchi delle interviste, non ha senso - Ho stato in quelle situazioni prima, e francamente trovo che siano un viaggio dell'ego per l'intervistatore e quindi è meglio evitarlo. Citiamo esplicitamente OOD (eppure è incredibile vedere soluzioni che non usano OO ..)
Nim

@jwenting, ti assicuro che non facciamo nulla del genere, è semplicemente subdolo. Se procediamo comunque, nelle interviste di f2f parleremo di come potrebbero espandersi per aggiungere casi d'angolo, ma solo se i candidati lo presentano.
Nim,

12

IMHO la risposta è chiaramente , è un segnale di avvertimento, se

  • l'esercizio di programmazione aveva un compito chiaro
  • ha requisiti ben definiti (e anche ben scritti),
  • i candidati hanno avuto la possibilità di porre domande per assicurarsi di risolvere il problema corretto.
  • vuoi persone intelligenti e che fanno le cose nella tua squadra, non gli astronauti dell'architettura .

1
+1 per l'elemento interattivo. In molti casi le specifiche sono vaghe, incomplete o contengono una terminologia specifica del dominio. Senza l'opportunità di chiarire eventuali problemi potrebbe essere inappropriato criticare il candidato.
HABO,

1
+1 per il fatto che la tua risposta modella perfettamente il processo. Hai risposto chiaramente alla domanda posta dall'OP.
dcaswell,

1
+1, questo è il mio attuale processo di pensiero, immagino sia bello vedere che non è ingenuo o semplicemente stupido ... Grazie per i due collegamenti di Joel ...
Nim,

1
Non essere così veloce a disprezzare gli astronauti dell'architettura. Essere un astronauta dell'architettura è una fase che uno sviluppatore deve attraversare prima di diventare un programma di nastro adesivo veramente competente. Vedi questa risposta di Aaronaught ai Francesi , preferisci la codifica da cowboy? domanda.
Marjan Venema,

1
@MarjanVenema: dubito che Aaronaught intendesse la parola nello stesso senso di Joel Spolsky, che ha creato quel termine. E onestamente, non credo di aver "disprezzato" nessuno - se vuoi che gli sviluppatori nel tuo team creino, beh, diciamo soluzioni visionarie, sentiti libero di assumerli.
Doc Brown,

5

Un segnale di avvertimento non così grande come non risolvere il problema in questione . Il fatto che abbia fallito il test e non abbia fornito la soluzione corretta è un segnale di avvertimento. Non è necessariamente uno scenario vietato perché dipende da come e perché non ha fornito la soluzione corretta.

Molte volte la domanda è una schifezza completa e semplicemente senza risposta. Non far finta che gli intervistatori non commettano mai errori. È ancora un fallimento da parte sua scoprire perché la domanda è una schifezza. Se stai assumendo un ingegnere che dovrebbe aiutare a soddisfare i requisiti, questo è un problema. Se stai assumendo un programmatore, non ti aspetti che lo faccia.

Presumendo che l'esercizio di codifica non sia orribilmente incasinato, sembra che il modo in cui ha fallito sia stato interpretare erroneamente il problema ed entrare nelle erbacce cercando di risolvere un problema che non c'era. Sì, è un segnale di avvertimento.


3

Può essere.

Non risolvere il problema è ovviamente un chiaro segnale di avvertimento che qualcosa non va. Che cosa è andato storto? O hanno frainteso il problema o hanno fatto una cattiva soluzione. Una cattiva soluzione per qualcosa di semplice è un chiaro segno che il candidato è povero.

Se hanno frainteso il problema, dai un'occhiata alle tue esigenze. Anche le cose che ti sembrano cristalline potrebbero non essere chiare per gli altri che non hanno familiarità con un dominio o da un background diverso (locale, età, educazione). Se il candidato fosse lì nella stanza con te, o offrisse l'opportunità di porre domande e continuasse a fallire, lo considererei un fallimento da parte loro. Se i requisiti venissero gettati oltre il muro, probabilmente darei loro il beneficio del dubbio (e penso a risolvere il processo di intervista).

Se la soluzione era corretta, diventa meno chiara. Personalmente, penso che un certo numero di persone prenda YAGNI troppo lontano. Se riesci a risolvere un problema specifico e creare una soluzione generale senza aumentare la complessità o danneggiare la manutenibilità, perché non creare la soluzione generale? (Pensa di invertire una stringa anziché invertire qualsiasi collezione) Quel tipo di "sovraingegneria" è chiaramente buono secondo me.

Tutto il resto è quella via di mezzo grigia. La soluzione affronta probabili assi di cambiamento? La soluzione aggiunge complessità o danneggia la manutenibilità? Aggiungendo un po 'di complessità per risolvere i problemi futuri che sono quasi garantiti per una vittoria. Danneggiare notevolmente la manutenibilità per tenere conto di qualcosa che è totalmente improbabile non lo è.

Essere un buon ingegnere informatico significa trovare qui il giusto equilibrio. Essere un buon intervistatore significa trovare il giusto giudizio / inferenza su come e perché il candidato ha scelto quell'equilibrio, spesso usando altre parti dell'intervista per valutare.


2
Se il problema è difficile da capire, o non è stato comunicato bene, questo è il momento per loro di dimostrare l'abilità critica che i programmatori moderati DEVONO possedere - definire il problema.
Adam Davis,

La domanda non dice che il candidato non abbia approfittato della possibilità di porre domande.
dcaswell,

3

Forse, ma considera quanto segue:

  • Le interviste sono difficili: le persone sono sotto stress. Questo dovrebbe essere preso in seria considerazione per qualsiasi problema che dai a qualcuno

  • Lunghezza dei requisiti: quanto sono lunghi e diretti i requisiti? Li hai resi più prolissi per assicurarti di aver incluso tutto. Di conseguenza, potrebbero essere chiari per te, ma i requisiti potrebbero essere troppo ingegnerizzati! Ho fatto un colloquio di lavoro una volta per un'ora con circa 3 pagine di testo per un problema relativamente semplice. A volte tutto quel testo può essere difficile da leggere e interpretare in un'intervista e può anche essere male interpretato.

  • A volte meno è di più: preferirei avere alcuni punti elenco, frasi e / o esempi che mostrano i requisiti principali e quindi una discussione con qualcuno a cui porre domande e magari raggiungere la strada, se necessario. Immagino che cosa sto cercando di dire è che dovresti prima controllare che i requisiti del tuo test non siano eccessivamente complicati per un semplice problema.

  • Abilità comunicativa: dovresti testare la capacità dei candidati di comunicare e porre prima domande intelligenti sul problema e una volta che sai che hanno dimostrato di aver compreso il problema, puoi metterli in pratica sulla loro implementazione.

  • Bottom Line: Se non hai verificato che il problema sia compreso, non sai davvero cosa fare del sovraingegneria. Come altri hanno già detto, potrebbe essere una cosa buona o cattiva, ma se non hai verificato la comprensione o comunicato con il candidato il problema in anticipo, è più difficile conoscere la loro comprensione generale del problema e cosa farne.


1
Risposta solida, ma è difficile guadare attraverso il muro di testo. Valuta la possibilità di modificare la tua risposta e di scomporre le sezioni principali.

2

Molto di questo potrebbe essere attribuito a come pronunci la domanda e come hai messo l'intera intervista in prospettiva.

È come "Vediamo quanto sei creativo. Che cos'è 2 + 2?" Quattro? Tutto quello che potresti trovare è la risposta più semplice, ovvia e accurata? Gli sviluppatori giovani / entry level che sono così desiderosi di impressionare durante un'intervista prenderanno il "Vogliamo testare le tue abilità di programmazione o vedere quanto sei bravo a programmare." per dire "fai qualcosa di molto sofisticato". A tutti noi piace pensare che semplice sia meglio, tranne quando rende le cose più difficili.

Ci sono modi per vedere se qualcuno è incline a essere sempre troppo ingegneristico. Fornisci un esempio di codice di qualcosa che era troppo complesso e chiedi una soluzione più semplice. Quando qualcuno fornisce una soluzione che non pensi possa funzionare, questa è una grande opportunità per vedere come reagiscono alle critiche. Personalmente, vorrei vedere qualcuno essere aperto a nuove idee e ricongiungere una soluzione migliore di qualcuno che farà gli stessi errori più e più volte.

E in realtà, non abbiamo sempre l'opportunità di cambiare il nostro codice quando non funziona? È possibile sotto il design o sopra il design inizialmente. Una volta riconosciuta la soluzione semplice, non dovrebbe essere più facile da implementare?


"Che cos'è 2 + 2?" 4 contro "Vediamo quanto sei creativo. Che cos'è 2 + 2?" Il limite della sequenza 3.9, 3.99, 3.999, 3.9999, ...
emory

"Vediamo quanto sei creativo. Che cos'è 2 + 2?" 5, per valori sufficientemente grandi di 2.
Michael,

e definire "overengineering". A seconda dell'ambiente, qualcosa che potrebbe apparire ingegnerizzato a qualcuno che non ha familiarità con esso può essere considerato come prendere troppe libertà e scorciatoie per qualcuno in quell'ambiente. Pensa al software di controllo missilistico quando guardato da qualcuno il cui campo principale è scrivere giochi per telefoni cellulari ...
jwenting

2

Dipende, ma generalmente no.

Il design in generale è un'abilità appresa con esperienza. La descrizione di Aaronaught di quella progressione legata da Marjan è generalmente buona.

La comunicazione in qualsiasi forma dipende anche molto dal contesto. Ciò che può sembrare perfettamente chiaro significare una cosa in un contesto, può significare altrettanto chiaramente qualcos'altro in un contesto diverso. Sapere quali domande porre è anche qualcosa che viene fornito con l'esperienza.

Il loro processo di pensiero e il modo in cui ragionano sulle loro decisioni è molto più importante della loro soluzione. Senza rivedere la loro soluzione e le loro decisioni con loro non è possibile valutare completamente il contesto in cui è stata sviluppata.

Data la progressione sopra, un candidato con la soluzione troppo ingegnerizzata potrebbe benissimo essere più avanti del candidato con la soluzione semplice.

Inoltre: quale posizione di livello stai assumendo? L'ingegnerizzazione eccessiva di un candidato entry level o di livello intermedio è meno problematica dell'ingegnerizzazione eccessiva di un candidato di livello senior.


1

Se il programmatore non ha risolto il problema, tutto il codice aggiuntivo è il tentativo del programmatore di offuscare la non risposta. È la stessa tecnica utilizzata in un test di saggio da uno studente che non sa molto sull'argomento. Lui o lei si dilungheranno su una questione convincente, ma non correlata, nella speranza che la sua ignoranza sia mascherata dal conteggio delle parole.

Se il programmatore ha risolto il problema ma ha aggiunto molto più codice, prendere in considerazione il background del programmatore, poiché alcune aree di programmazione richiedono tolleranze maggiori di altre.

Ad esempio, il codice che esegue l'autopilota in un aereo passeggeri commerciale ha tolleranze di guasto molto inferiori rispetto a un gioco Android gratuito. Uno sviluppatore abituato a programmare dispositivi integrati che sono difficili da raggiungere e quasi impossibili da aggiornare tenderà a programmare più what-if di uno sviluppatore che può inviare 15 aggiornamenti in un giorno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.