Processo di pensiero generale per domande sul colloquio "Come faresti a costruire questo sito web / app" [chiuso]

14

Ho raccolto un sacco di domande per interviste come "Descrivi come disegneresti un'applicazione per album di foto", "Descrivi come progetteresti questa particolare funzionalità di questo particolare sito web" (ad esempio, Mi piace su Facebook, consigli su Amazon, shopping carrello, gioco di black jack). Quindi, cosa succede se ci sono milioni di questa cosa? Cosa cambieresti?

Sembra che sia in attesa di uno schema di database o di una serie di definizioni di classe (o entrambe?). Ho imparato a conoscere i database a scuola, ma non ho mai architettato un'applicazione in precedenza e sto avendo problemi a sapere da dove cominciare, se i disegni che ho escogitato sono "buoni" e cosa posso cambiare per renderlo scalabile.

Esiste un approccio generale o un processo di pensiero durante la progettazione di questi sistemi? E problemi / problemi generali che sembrano emergere molto nel design che dovrei cercare di evitare? Qualcuno potrebbe forse guidarmi attraverso uno (o preferibilmente tutti, confrontando i bisogni di ciascuno) con questi e spiegare:

1) Come vieni con quali entità sono necessarie? 2) Come decidi su quali relazioni avrà tutto? 3) Come incorpori l'ottimizzazione delle prestazioni nel tuo progetto? 4) Lo faccio usando classi o database? Fa una differenza (ad esempio, avrei una classe che non può essere realmente tradotta in una tabella di database, ad esempio?)

Il motivo principale che sto chiedendo è che stavo passando per "Cracking the Coding Interview" e le mie risposte erano completamente diverse da quelle dell'autore - avevo idee molto diverse su quali fossero le classi importanti.

IL MIO TENTATIVO: Con l'app di condivisione foto, avrei le classi / tabelle: Foto e Utente di sicuro.

Quindi, se stiamo cercando di creare uno schema, ci sarebbe una tabella che collega foto e utenti se supponiamo che ogni persona nella foto sia collegata alla foto (è questa tabella necessaria? In caso contrario, è pratica ancora comune per avere una tabella separata per le relazioni molti-a-molti o no?).

Ma se stiamo cercando di adottare un approccio orientato agli oggetti, forse avremmo una classe chiamata album che fa tutto il lavoro e ha tutte le informazioni delle altre due tabelle / classi. Questa è una cosa che ho notato nel libro - ci sono un sacco di classi e poi una classe che ha fondamentalmente tutte le informazioni e collega le altre classi - è comune? Ad esempio, nei miei esempi sopra, sembra che si applicherebbe?

Spero solo che vengano seguite alcune regole / linee guida generali perché al momento non ho idea di come sia una buona architettura per un sistema di grandi dimensioni.

    
posta Mastid 26.04.2013 - 06:24
fonte

3 risposte

19

Il punto di tali domande è valutare se si dispone di competenze del mondo reale nella scrittura di un'applicazione software. Hai imparato qualche teoria, ma la conoscenza teorica non può che andare così lontano. L'unico modo per capire veramente lo sviluppo del software è farlo.

Non esiste una scorciatoia per questo, perché non ci sono risposte in stock a domande come "quali entità sono necessarie?" Invece, devi applicare la tua esperienza di vari strumenti e paradigmi e come lavorano insieme, per trovare una soluzione pratica al problema.

Una domanda come "Lo faccio usando classi o database?" suggerisce che manchi una conoscenza di base di cosa sono e come funzionano. Classi sono un paradigma per organizzare il tuo codice; I database sono un metodo di archiviazione dei dati. Sono due concetti intrinsecamente non correlati (sebbene possano lavorare insieme). Questa non è una o / o domanda.

Non intendo essere duro, ma penso che tu abbia bisogno di sviluppare la tua esperienza di programmazione per avere successo in un colloquio di lavoro. Sicuramente ne hai il potenziale: la tua discussione sull'app di condivisione delle foto ha alcune delle idee giuste e va nella giusta direzione. Ma devi imparare come funziona in prima persona. Il modo migliore per preparare il colloquio è creare un'applicazione dall'inizio alla fine. Un'app di condivisione di foto sarebbe un progetto di dimensioni appropriate o potresti scegliere qualcos'altro. La tua conoscenza si espanderà davvero quando vedrai come tutte le parti possono lavorare insieme per creare un'applicazione funzionante.

    
risposta data 26.04.2013 - 07:58
fonte
8

It looks like this is either expecting a database schema or a bunch of class definitions (or both?)

Penso che tu sia troppo concentrato sui dettagli qui. Con questa domanda, il reclutatore non si aspetta una descrizione completa di tutte le classi che scriverebbe (altrimenti ti chiederebbero di codificarlo, non di parlarne).

La tua risposta deve prima di tutto riguardare il quadro generale: architettura, livelli, livelli, persino il ciclo di vita del progetto e il processo di sviluppo che avresti messo in atto. Non esitare a porre domande sui requisiti e sull'ambiente in cui si suppone che l'applicazione venga eseguita per regolare la risposta. Come sottolineato da Dan1111, non esiste una ricetta generale per una corretta progettazione dell'applicazione. Tutti i disegni dipendono dal contesto.

Solo se il reclutatore inizia a fare domande molto specifiche dovresti entrare nei dettagli su quali classi, entità o tabelle di database useresti sotto il cofano.

Inoltre, se hai poca esperienza, è normale dire "ti mostrerò una soluzione usando il tipo di design dell'applicazione che mi è stato insegnato e utilizzato fino ad ora. Conosco questo e altri approcci che posso descriverti in grande ma non li ho mai applicati veramente, sono anche aperto a scoprire e applicare gli altri ".

Non c'è niente di sbagliato nel riconoscere che ci sono solo tanti strumenti nella tua casella degli strumenti che la tua esperienza ti permette di avere - in effetti, è meglio che sputare una risposta provata che non hai idea di come funzioni nella pratica.

    
risposta data 26.04.2013 - 13:21
fonte
2

Ho pensato di fare un rapido commento sulla tua prima domanda:

1) How do you come up with what entities are needed?

La prima cosa che faccio per un nuovo progetto è, su una lavagna bianca o su un grande pezzo di carta in bianco, annotare tutte le cose fisiche e concettuali su quel particolare progetto a cui io e il mio team possiamo pensare. È una sessione di brainstorming.

I nomi tendono ad essere oggetti, i verbi tendono ad essere casi d'uso o metodi.

Fisico: foto (ovvio!), tipo di visualizzazione, sistema, file di foto, formato di file, utente, data ....
Concettuale: aggiungi, cancella, salva / salva, recupera, ordina, modifica, visualizza / mostra foto ....

Crea connessioni tra nomi e verbi. L'utente aggiunge foto. (Bene - c'è un caso d'uso!)

Suggerisco anche di considerare UML e Design Patterns e come possono essere utilizzati in OOD generico. (Nota: non ho menzionato una lingua o un database da nessuna parte sopra. Non scegliere una lingua e quindi fare il tuo OOD. Fai il tuo OOD in modo che il progetto possa essere implementato da qualsiasi OOL.

    
risposta data 22.07.2014 - 20:52
fonte