Progetta modelli soffocando la creatività


21

Molti anni fa, stavo parlando con un professore di Economia dei modelli di progettazione, di come stavano stabilendo un linguaggio comune per i programmatori e di come stavano risolvendo problemi noti in un modo carino, ecc. Ecc.

Poi mi ha risposto che questo è esattamente l'approccio opposto che userebbe per i suoi studenti di Economia. Di solito presentava un problema e chiedeva loro di trovare prima una soluzione, in modo che potessero prima pensarci e provare prima a trovare il modo di risolvere il problema, e solo dopo presentava la soluzione "classica".

Quindi stavo pensando se l'approccio del "modello di progettazione" è davvero qualcosa che rende i programmatori più intelligenti o più stupidi, dal momento che molte volte ottengono semplicemente la "soluzione giusta per questo problema" invece di usare la creatività e l'immaginazione per risolvere alcuni problemi in un modo nuovo e innovativo.

Cosa pensi?


5
Suggerirei di leggere A Pattern Language (il libro, non l'articolo di Wikipedia) su cui si fondano i concetti di pattern dell'architettura software. Non sono elementi costitutivi o pezzi di puzzle per adattarsi perfettamente allo stesso modo.

11
Appoggiarsi / insegnare è diverso dal fare. Quindi un ottimo corso CS potrebbe farti scrivere un compilatore: se suggerissi al tuo datore di lavoro che dovevi scrivere un compilatore per il suo sistema di elaborazione degli ordini, saresti / dovresti essere licenziato.
James Anderson,

2
Non credo che i due siano necessariamente comparabili: i modelli di progettazione non sono la soluzione classica, sono un approccio a una moltitudine di soluzioni.
jmoreno,

1
possibile duplicato di motivi di design - li usi? - la domanda può sembrare diversa, ma le risposte a questa domanda si adattano bene a questo caso.
Doc Brown,

2
Non conosco la creatività, ma la moltitudine di "Che modello è questo?" o "C'è un modello per questo?" le domande danno l'impressione che alcuni sviluppatori pensino che ci sia uno schema per tutto.
JeffO

Risposte:


43

Il tuo professore di economia ha assolutamente ragione.

I modelli di progettazione software sono principalmente un modo per gli sviluppatori di software esperti di comunicare tra loro . Sono una scorciatoia per soluzioni consolidate a problemi noti.

Ma dovrebbero essere usati solo da persone che capiscono come risolvere il problema senza lo schema, o che hanno escogitato uno schema simile da soli. Altrimenti, avranno lo stesso problema del codificatore copia / incolla; avranno codice, ma non capiranno come funziona e quindi non saranno in grado di risolverlo.

Inoltre, molti dei modelli di progettazione sono modelli aziendali , modelli che devono essere utilizzati in sistemi software aziendali di grandi dimensioni. Se impari le meraviglie del contenitore Inversion of Control, vorrai utilizzarlo in ogni programma che scrivi, anche se la maggior parte dei programmi non ne ha davvero bisogno (ci sono modi migliori per iniettare le tue dipendenze in programmi più piccoli, non richiede un contenitore IoC).

Impara gli schemi. Comprendere i modelli e il loro uso appropriato. Sapere come risolvere lo stesso problema senza lo schema (tutti gli schemi del software sono astrazioni rispetto agli algoritmi fondamentali). Quindi sarai in grado di utilizzare i modelli software con sicurezza, quando ha senso farlo.


3
Sono abbastanza sicuro che ci sono così tanti sviluppatori che senza usare i modelli di progettazione scriveranno un codice di così bassa qualità che nessuno vuole guardarlo nemmeno. Non sono d'accordo sul fatto che dovrebbe essere usato SOLO da persone che capiscono come risolvere il problema senza lo schema ... Per me questo è un punto fondamentale di uno schema progettuale; Se sapessi come farlo, perché dovrei scegliere un modello di design? Inoltre cosa dovrebbero fare quegli altri sviluppatori se li forziamo a non utilizzare un modello di progettazione? Dovrebbero creare un vero software con le loro idee e lasciarlo fallire e quindi imparare qualcosa di nuovo?
Mahdi

18
@Mahdi quando molte persone trovano la stessa soluzione, quella soluzione si chiama modello. Non è il contrario: non guardi i pattern e li usi come soluzioni, guardi le soluzioni e trovi i pattern.
user253751

13
@Mahdi Vedo molti più principianti che pensano che se solo usano il pattern XXX creeranno software perfetto ogni volta (dove XXX è quello che hanno letto per ultimo ovviamente) e poi fanno di tutto per torturare ogni progetto per adattarlo quello schema.
jwenting

5
@Mahdi: non prendere la frase "da persone che capiscono come risolvere il problema senza lo schema" troppo alla lettera. Robert sicuramente significa "da parte di persone che hanno compreso il problema in gioco abbastanza bene da prendere una decisione ragionevole su quando usare un modello e quando no".
Doc Brown,

2
@Dunk Posso provare qualcosa di creativo sulla cima di uno schema ben noto o posso farlo da zero, ma dopo aver provato un sacco di altre cose e dopo aver capito quali sono i pro e i contro esatti di ogni modello. Se mi chiedi di andare a costruire una casa per la prima volta e dimmi solo di essere creativo, non riuscirò mai a costruire qualcosa di solido, semplicemente perché all'inizio è troppo complicato. Se vuoi essere creativo invece di usare uno schema, dovresti già avere una solida comprensione del problema stesso e lo otterrai solo dopo anni di esperienza ...
Mahdi

21

Il modo in cui i pattern di design vogliono che le persone guardino i pattern di design è come un insieme di soluzioni che è possibile applicare in caso di problemi simili. Non vogliono che tu li consideri come le uniche soluzioni possibili, date da Dio a Mosè scolpite su tavolette di pietra sulla montagna.

Sfortunatamente, alcune persone li prendono come qualcosa di più vicino alla scrittura sacra piuttosto che a un mucchio di esempi di disegni che potrebbero essere appresi. Questo uccide la creatività e crea un culto del carico.

Il tuo professore di economia ha menzionato la presentazione del problema agli studenti e il loro tentativo di risolverlo prima, il che è una buona tecnica educativa, ma aveva una soluzione per mostrarli. Avere un sacco di soluzioni a molti problemi diversi nella tua testa è una buona cosa, ed è qualcosa che Design Patterns cerca di essere. Penso che fallisca in qualche modo (Singleton incoraggia i cattivi approcci, un'attenzione miope all'OO imperativo, ecc.), Ma potrebbe essere usato bene con intelligenza e gusto. Tuttavia, è un errore pensare che ogni possibile soluzione di esempio nel software debba essere un modello di progettazione ufficiale.

Se osservi un problema e ti chiedi "Qual è il modello di progettazione per questo?", Allora stai sbagliando e avrai meno probabilità di vedere una soluzione che ti sta fissando in faccia.

Se guardi un problema e ti chiedi "Come posso risolvere questo?", Allora se c'è una soluzione non-pattern, la vedrai e se c'è una pattern che si adatta, vedrai anche quello.


10

Penso anche che il tuo professore di economia sia corretto ed è un modo per imparare qualcosa in primo luogo; Comunque diamo un'occhiata a questo: manterresti la ruota segreta e permettere a tutti di reinventarla, per il bene della creatività ? Mi aspetto che tu dica di no, perché non tutte le persone sono fatte / capaci di inventare le loro ruote - e se lo sono, lo faranno ad un certo punto, non importa se sono a conoscenza dell'esistenza della ruota o non.

Torniamo ai programmatori; Sono uno sviluppatore web di giorno, quindi MVC è una di quelle cose con cui interagisco quotidianamente. Più volte ho provato a costruire le mie strutture, ho imparato molto, ma sostanzialmente non hanno avuto successo. Ho fatto del mio meglio, ma cosa accadrebbe se non ci fossero MVC là fuori? Bene, semplice, il mio codice sorgente fa schifo - in termini di affidabilità, manutenibilità ed estensibilità.

Penso che sia lo stesso per la maggior parte di noi. Se nessuno ti parla di DI - come buona pratica, quante applicazioni aziendali dovrebbero lottare o fallire fino a quando i loro sviluppatori non imparano la lezione?

Il secondo punto sono gli standard del settore . Se non insegnerai MVC agli sviluppatori web, allora sei pronto ad affrontare tutte quelle strutture non standard di cui hai bisogno per passare un po 'di tempo per imparare prima il loro modo di fare le cose, e poi ti rendi conto che alcune di quelle strutture potrebbero avere una buona idea, ma la maggior parte di essi presenterà gravi difetti di progettazione che potrebbero avere gravi conseguenze per il proprio progetto software - anche i quadri noti continuano a lottare con i difetti di progettazione di volta in volta.

Ma cosa accadrebbe se avessimo tutte quelle idee carine e le mettessimo tutte insieme e quegli sviluppatori intelligenti prendano le cose buone da tutti quegli esperimenti e creiamo una struttura davvero interessante che funziona meglio per quel problema specifico? Quindi hai appena creato i motivi di disegno . Se sei una creatura vivente, non c'è altro modo per aggirare; Anche gli animali seguono le migliori pratiche e i modelli di progettazione nella loro vita quotidiana.


3
"Ho imparato molto, ma sostanzialmente non hanno avuto successo. Ho fatto del mio meglio, ma cosa sarebbe successo se non ci fossero MVC là fuori? Beh, semplice, il mio codice sorgente fa schifo" - parole di oro massiccio!
ankush981

5

Non reinventare un martello, ma non trattare tutti i problemi come un chiodo

Gli schemi di programmazione fanno risparmiare molto tempo, perché offrono soluzioni pronte per l'uso, ben documentate e testate con casi medi di cui potresti facilmente dimenticare. Ma devi imparare (e pensare) quando usarli.

Parafrasando la tua domanda: imparare a guidare mi farebbe muovere più velocemente o camminare più lentamente?

Imparare a usare il modello di programmazione non significa che non dovresti allenarti a trovare le proprie soluzioni. Ci saranno ancora abbastanza problemi su cui esercitare la tua creatività. Conoscere gli schemi di programmazione ti consentirà di essere veloce solo con problemi noti e concentrarti su quelli che sono meno banali.

Tornando alla seconda parte della tua domanda - il tuo proffesor ha ragione?

Sì, ha ragione . L'obiettivo primario degli studi è imparare gli studenti a pensare . Devono cercare di trovare le proprie soluzioni al problema e confrontarle con le soluzioni esistenti. Solo in questo modo possono davvero capirli. Se prima impari loro gli schemi, rischi che impareranno solo meccanicamente ad applicarli e non a capire cosa c'è dietro.

Questa è la ragione per la prima volta che insegni agli studenti a programmare, e gli schemi vengono introdotti in ulteriori semestri.


5

Vorrei assolutamente sconsigliare l'insegnamento della programmazione insegnando modelli di progettazione. Non puoi applicarli bene senza comprendere i principi che li stanno dietro, quindi insegnare quei principi è molto più importante.

Tendo a pensare che i modelli di progettazione non siano davvero così preziosi neanche per i programmatori che lavorano. Se capisci appieno i principi coinvolti in un determinato modello di progettazione, quindi in una situazione in cui è una buona soluzione tenderai naturalmente a costruirlo (o qualcosa di simile) comunque, ovviamente, anche se non lo sapevi che era uno schema con un nome. Indipendentemente dal tempo che passeresti, i modelli di apprendimento potrebbero essere spesi meglio imparando a pensare al codice in generale. Se le tue abilità di "problem solving in generale" non sono all'altezza, allora non puoi scrivere un buon codice, non importa quanto tu sia bravo ad applicare una serie di schemi. E se le tue abilità di "problem solving in generale" sono buone, allora puoi risolvere i problemi anche se non conosci un singolo schema.

Penso anche che in un mondo ideale non ci sarebbe essere eventuali modelli di progettazione, perché le idee abbastanza comune per essere chiamato un modello tutto sarebbe ben implementato, nelle biblioteche e ci piacerebbe davvero essere il riutilizzo di codice, invece di costante riscrittura esso. Immagina se esistesse un "modello di progettazione di espressioni regolari", che richiedeva l'implementazione di un piccolo motore regex ogni volta che lo volevi usare. I modelli di progettazione sono solo librerie che non possono essere scritte perché la lingua non fornisce le giuste strutture di astrazione.

Questo è in realtà un altro motivo per cui non importa molto di loro; non sono affatto universali come si dice a volte, ma in realtà sono fortemente legati ai modi particolari di strutturare i programmi che una determinata lingua consente / incoraggia. Un libro di modelli di design scritto per Python sarebbe completamente diverso da uno scritto per Java, e ancora più diverso da uno scritto per un linguaggio non imperativo come Haskell. Meglio capire a un livello più profondo, e sarai in grado di scoprire tu stesso i modelli di progettazione in qualsiasi lingua con cui acquisisci familiarità.


Hmm, risposta interessante. Ma ho sentito che le interviste di programmazione sono pesanti sui modelli di progettazione. Perché sarebbe se ci fosse poco valore in loro?
ankush981

@dotslash Per lo stesso motivo che i test di QI sono pesanti in matematica / logica: hanno un certo valore e sono facili da testare. Detto questo, nella mia ricerca di lavoro come programmatore non li ho incontrati tanto nelle interviste; Sono australiano però, quindi forse c'è una differenza nella moda.
Ben

Ma imparare sui modelli di progettazione non è un ottimo modo per vedere esempi concreti di come pensare al codice? Quali cose guarderesti per imparare a pensare al codice se non ai problemi + soluzioni generali che risolvono i problemi ed esempi di codice che implementano la soluzione?
Amy Blankenship,

@Amy Sì, ma c'è una grande differenza tra "ecco un problema, ecco una soluzione, ecco come sono arrivato" e "ecco uno schema, memorizzalo in modo da poterlo applicare a questi problemi in futuro". Vuoi insegnare la capacità di generare soluzioni, perché gli schemi possono essere applicati sempre e solo alcune volte, quindi avranno bisogno di quell'abilità indipendentemente da quanti schemi conoscano. Se fossi insegnando un corso compresi i modelli, probabilmente sarei farlo impostando esercizi destinati a rendere gli studenti notare da loro stessi che ci sono stati concetti comuni nelle soluzioni agli esercizi.
Ben

Risposta eccellente. Il miglior ambiente di programmazione incapsulerebbe i modelli più interessanti in librerie o linguaggi, liberando gli sviluppatori a lavorare a un livello superiore. Mi piace anche il punto sulle dipendenze linguistiche; molti modelli di progettazione comuni sono attualmente obsoleti.
Frank Hileman,

3

Il commercio e l'istruzione hanno obiettivi diversi. Se insegnassi agli studenti modelli di progettazione, prenderei lo stesso approccio. Ma in un ambiente di produzione, tempo ed efficienza sono tutto.

Inoltre, (macro) economia al di fuori della classe è una cosa diversa. Vedi i governi dire: "Whoa! Ora siamo molto annoiati di fare le tasse e allo stesso modo, quindi proviamo qualcosa di super stravagante questa volta"? No, perché tali esperimenti selvaggi possono distruggere l'economia senza possibilità di riparazione. Al contrario, tendono ad attenersi ad approcci collaudati: aumentare il tasso di interesse, annunciare le esenzioni fiscali, ecc. In altre parole, si basano su schemi di progettazione.


1

La risposta è, ovviamente: Sì.

I modelli di progettazione sono uno strumento di apprendimento meraviglioso in sé, purché ci si prenda il tempo per capire come funzionano e perché apportano il valore che apportano.

Possono anche essere ottimi stimolatori della produttività seguendo rapidamente un processo di progettazione, poiché forniscono soluzioni familiari ai problemi che si presentano continuamente.

Tuttavia, se progettano troppo cortocircuito o le persone diventano dogmatiche e troppo precise riguardo al loro uso, allora hanno l'effetto opposto.


3
sono terribili strumenti didattici per insegnare la programmazione (piuttosto che progettare). Portano alla domanda oh così comune nei forum su Internet di "come posso implementare XXX usando il modello YYY", che è la domanda sbagliata da porre, la domanda dovrebbe essere (quando si desidera forzare i modelli) "quali schemi sarebbero appropriati per l'implementazione di XXX ".
jwenting

1
lol Ho detto strumento di apprendimento, non strumento di insegnamento - se uno vuole imparare;)
Rob

-2

I modelli di progettazione sono ovviamente meno creativi. Questa è l'intera idea. La creatività è una risorsa scarsa. Non dovresti sprecarlo per problemi che non richiedono creatività. È molto più facile, più veloce e più probabile che funzioni, se risolvi un problema come centinaia di sviluppatori prima di te. Il codice noioso e poco emozionante che fa il suo lavoro è in realtà buono.


2
è solo questa la tua opinione o puoi sostenerla in qualche modo?
moscerino del
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.