Algorithm Vs Design [duplicato]

12

Questa domanda è, forse, correlata principalmente agli sviluppatori web che, come me, codificano applicazioni aziendali e utilizzano linguaggi di alto livello come Java, C # principalmente.

A causa della natura delle app web aziendali, che essenzialmente eseguono le operazioni CRUD e dal momento che facciamo affidamento sulle librerie fornite dalla lingua, qual è il significato degli algoritmi di apprendimento?

So che il web è pieno di articoli che affermano in modo profondo che "il codice è un algoritmo", ma quando è stata l'ultima volta che qualcuno ha scritto l'algoritmo quicksort in tale applicazione?

Vedo molti più vantaggi nell'apprendimento di modelli di design e anti-pattern, che vengono utilizzati molto.

    
posta sij 23.09.2011 - 15:13
fonte

8 risposte

18

I see far more benefits in learning Design patterns and anti-patterns, which are used a lot.

Dal tuo punto di vista questo è certamente vero e molte applicazioni là fuori non sono davvero pesanti nell'algoritmo. Ma una grande quantità di applicazioni richiede una buona conoscenza di algoritmi e strutture dati, ad esempio giochi o applicazioni logistiche. Queste applicazioni spesso richiedono il loro algoritmo per trovare la via più breve o riempire uno zaino, non puoi semplicemente usarne uno generico.

I know the web is filled with articles profoundly stating that "code is algorithm", but when was the last time anyone wrote quicksort algorithm in such an application?

Non è questo il punto. La maggior parte delle persone non ha intenzione di reimplementare quicksort di nuovo. Ma quicksort dimostra alcuni dei concetti più fondamentali della progettazione dell'algoritmo. Se comprendi quicksort puoi applicare questo tipo di conoscenza ad altri problemi. Come detto sopra, non tutti gli algoritmi possono essere usati genericamente. Nel mondo reale devi spesso creare algoritmi personalizzati per i tuoi problemi, che sono costruiti con le stesse tecniche che, ad esempio, usano quicksort.

E questo può essere fatto solo con una conoscenza fondamentale di quelle tecniche di algoritmo e strutture dati.

L'un giorno in cui incappi in un tale problema o un collo di bottiglia nelle prestazioni in qualche routine, sarai in grado di affrontarlo. E prima o poi ce ne sarà uno. Ho visto sviluppatori CRUD che poi hanno semplicemente detto "Non è possibile", quando, in effetti, è stato abbastanza facilmente risolvibile.

    
risposta data 23.09.2011 - 15:26
fonte
6

Quando usi l'algoritmo di qualcun altro, devi ancora capire i compromessi. Ad esempio, in Java, il metodo sort() fornito dalla classe Collections utilizza un mergesort modificato che garantisce prestazioni n log (n). Tuttavia, afferma anche che scarica la raccolta in una matrice, ordina l'array e scorre sull'elenco. Questo uso di un array richiede un maggiore consumo di memoria.

La domanda diventa: è abbastanza buono per le tue esigenze? Se non comprendi algoritmi, complessità temporale e complessità spaziale, non puoi davvero rispondere. Non è necessario conoscere tanto la matematica e la teoria di base come qualcuno che sviluppa nuovi algoritmi, ma è necessario essere in grado di confrontare più algoritmi e determinare quale meglio consente di soddisfare i requisiti del sistema.

Si noti che la stessa identica cosa si applica alle strutture di dati. Comprendere le caratteristiche dei tuoi dati e l'inserimento e il recupero dalla struttura dei dati ti permetterà di scegliere la struttura più adatta alle tue esigenze.

Ora, tutto ciò accade a un livello inferiore rispetto ai modelli di progettazione. I modelli di progettazione non dicono nulla sulla struttura dei dati o sull'algoritmo di cui hai bisogno, ma piuttosto che devi avere una sorta di relazione tra i moduli della tua applicazione. Quando parli di design, potresti dire "abbiamo bisogno di ordinare i dati", o forse anche "abbiamo bisogno di fornire più algoritmi di ordinamento" (modello di strategia, forse?), Ma non parleresti di unire sort o di un ordinamento rapido o qualsiasi particolare algoritmo di ordinamento.

    
risposta data 23.09.2011 - 15:28
fonte
4

Essere in grado di scrivere un'implementazione Quicksort corretta è un livello di conoscenza. Sono d'accordo sul fatto che sia raramente necessario nella vita di uno sviluppatore web medio (tuttavia, quando ne hai bisogno, ne hai bisogno molto ).

Capire come funziona quicksort (ed essere in grado di scegliere tra esso e altri algoritmi di ordinamento per un compito specifico a portata di mano) è un altro. Penso che questo sia più spesso necessario, e uno sviluppatore decente dovrebbe avere questo livello di conoscenza generale sugli algoritmi fondamentali. Senza questo, non ti accorgi nemmeno di quando sei nella situazione che richiede un algoritmo specifico e questo può avere conseguenze negative.

La tua domanda è un po 'analoga a chiedere se è utile per un tassista iscriversi a un corso che pratica come guidare su strade innevate / ghiacciate, dal momento che il 99,9% dei casi questa conoscenza non fornisce alcun vantaggio nelle strade ben tenute di una grande città. In effetti no - tuttavia in quello 0,1% quando è necessario, può fare la differenza tra uno shock lieve e una lesione grave. E non potresti mai prevedere in anticipo quando ne avrai bisogno!

Analogamente a un tassista (oa qualsiasi tipo di artigiano), siamo anche professionisti che dovrebbero conoscere i nostri strumenti del mestiere. Lo sviluppo del software riguarda la risoluzione dei problemi e il mancato apprendimento degli algoritmi riduce seriamente la nostra capacità di risoluzione dei problemi, quindi il nostro valore di mercato.

    
risposta data 23.09.2011 - 15:25
fonte
3

Se vuoi solo scrivere la stessa app web per il resto della tua carriera e non voler mai migliorare ed espandere il tuo skillset, il loro significato è limitato. Se vuoi continuare ad imparare, migliorare ed espandere la tua mente, le tue conoscenze e le tue abilità ... questa è un'altra storia. Ma non finisce qui, perché ti sbagli su una cosa.

Quando chiedi,

...when was the last time anyone wrote quicksort algorithm in such an application?

Una volta che sei esperto, come accade quando impari schemi di progettazione ... inizi a vederli ovunque, anche in luoghi che erano "solo codice" prima.

Ma anche allora ... ti stai comportando bene senza di loro. Perché sono importanti da sapere? Sono importanti perché arriverà un momento in cui un cliente fa una particolare richiesta di cambiamento, o l'azienda produce una nuova linea di software, o ottieni un nuovo lavoro perché hai aumenti costanti e un bambino appena uscito da scuola sarà bene con lo stipendio base, o ti conviene allargare i tuoi orizzonti e lavorare in un campo diverso ...

In quel giorno, avrai bisogno di questa conoscenza. Quel giorno, quel giovane cucciolo appena uscito da intro agli algoritmi non ha intenzione di intervenire e dire "spostati su Gramps, lascia che i veri sviluppatori lavorino" - e abbia ragione.

    
risposta data 23.09.2011 - 15:42
fonte
1

Nella scuola elementare mi lamentavo di imparare la matematica, dato che i calcolatori elettronici possono fare tutto il lavoro - ho pensato.

Che cosa voglio dire: come sviluppatore, dovresti sempre cercare di capire come funzionano le cose, invece di limitarsi a farle funzionare, anche se puoi contare su altri sviluppatori che funzionano nel 99,9% di tutti i casi.

    
risposta data 23.09.2011 - 15:19
fonte
1

but when was the last time anyone wrote quicksort algorithm in such an application

È come quando è stata l'ultima volta che qualcuno ha ridefinito 2 * 2 = 4. Gli algoritmi per questi problemi sono già stati definiti e ridefiniti nella soluzione ottimale. Quindi, non abbiamo bisogno di scriverne uno per noi stessi. Questo tipo di algoritmo si applica più a uno sviluppatore di sistemi che a uno sviluppatore web.

code is algorithm

Sicuramente, tutto ciò che scrivi per ottenere un compito è un algoritmo in sé. Se stai ottenendo buoni risultati con il tuo codice, allora stai facendo buoni risultati. Nel caso in cui l'applicazione sia lenta nell'esecuzione di una funzione come CRUD, è necessario ripensarci e decidere come aumentare le prestazioni. Questo è dove l'algoritmo è utile. Ciò non significa che devi fare R & D in Algoritmi, ma pensare in modo razionale su come puoi ottenere le prestazioni ottimali per la tua funzione. Come decidere cosa deve essere ordinato prima e dopo. Le cose di questo tipo sono più preoccupanti per uno sviluppatore di applicazioni web e per applicazioni che per quicksort e binarytree.

    
risposta data 23.09.2011 - 15:30
fonte
1

Devi imparare come capire e implementare un algoritmo, quicksort è solo un esempio - normalmente non lo scrivi mai da solo.

L'ordinamento è un buon esempio per imparare che ci sono molte soluzioni diverse per un problema, ciascuno con vantaggi e svantaggi a seconda dei dati su cui lavora.

È degno di avere alcune conoscenze fondamentali di algoritmi e complessità per evitare soluzioni come il conteggio delle occorrenze solo per verificare l'esistenza (solo un esempio semplificato).

    
risposta data 23.09.2011 - 15:36
fonte
1

Sospetto che tu stia parlando con i progettisti di front-end! Come designer di front-end e seguendo il commento di Falcon, aggiungo che "non è possibile" non è qualcosa che desideriamo ascoltare. Nell'immagine completa la soluzione non-pattern può essere troppo costosa, ma richiede ai programmatori - per essere competitivi - una risposta alla domanda, "È possibile e se sì, quanto?"

    
risposta data 23.09.2011 - 17:51
fonte

Leggi altre domande sui tag