Che impatto hanno i linguaggi di scripting sui programmatori junior? [chiuso]


18

L'altro giorno ho avuto una discussione con uno dei miei insegnanti.

Abbiamo discusso dell'impatto che linguaggi di scripting più semplici (come Python o Ruby) hanno sui programmatori junior.

Ha sostenuto che i linguaggi di scripting generano tecniche di codifica sciatte perché i principianti non capiscono cosa sta succedendo "sotto il cofano". Ha anche citato altri esempi di come i linguaggi di scripting spesso causano al programmatore di trascurare le preoccupazioni su efficienza, gestione della memoria, complessità operativa, ecc.

Ho sostenuto che le lingue di livello inferiore potrebbero essere troppo per alcune persone e potrebbero rinunciare prima di sviluppare la passione per la programmazione. Quando ho iniziato a studiare il mio primo linguaggio di programmazione (C), mi sono avvicinato ai puntatori e ho rinunciato perché i concetti erano troppo difficili (a mia difesa, avevo solo 14 anni). Se non fosse stato per Java, forse non sarei diventato un programmatore! Se avessi iniziato con un linguaggio più semplice e poi approfondito, sento che non mi sarei arreso e avrei imparato tanto quanto ho iniziato con C.

La lezione finì prima che entrambe le parti fossero esplorate a fondo.


A questo punto, ho predicato che i principianti dovrebbero iniziare con i linguaggi di scripting e quindi approfondire; ma dopo quella discussione, ho iniziato a chiedermi se fosse un pensiero errato.

Quindi, che impatto hanno i linguaggi di scripting sui programmatori junior?



4
Ho imparato a guidare un'auto con una trasmissione automatica. Più tardi, ne ho preso uno con una trasmissione manuale. Ci è voluto del tempo per imparare e mi sono sentito fortunato a non aver dovuto imparare la frizione e il cambio con tutto il resto.
David Thornley,

2
@Singletoned: True. In qualche modo ho dovuto pensare a xkcd.com/326 però ...


4
Personalmente penso che sia innaturale imparare a programmare basso e alto. Impariamo a gattonare, poi a camminare, a correre, a parlare, poi a scrivere. Non sono sicuro di quale sia la logica per l'inversione dell'ordine naturale al college. Di solito ascolto solo le persone concludere "perché se per me è stato difficile imparare, allora deve rimanere duro per te". Anche Joel ha detto questo. Immagino che il ciclo non finirà mai.
P.Brian.Mackey,

Risposte:


26

Non sono d'accordo. Innanzitutto, i linguaggi di scripting hanno un livello di astrazione più elevato e non c'è nulla di sbagliato in questo. All'inizio si sta solo cercando di apprendere i principi. In realtà direi che la scelta di una lingua di livello inferiore può incoraggiare una cattiva codifica, dal momento che bisogna avere a che fare con alcuni dettagli prima di essere in grado di capirli. Invece con un linguaggio più semplice si può iniziare a scrivere codice pulito e conciso dall'inizio.

Secondo, c'è molto da imparare in queste lingue. Per quanto riguarda l'apprendimento della lingua, direi che C è più facile di Python. Uno ha a che fare con i puntatori o prendersi cura delle stringhe, ma ci sono molti altri concetti da imparare in Python. Comprensioni, orientamento dell'oggetto, riflessione, metodi magici, funzioni di prima classe, lambda, iteratori e generatori, metaclassi: tutto questo fa parte del linguaggio.

Penso che a partire da Python sia possibile imparare molto di più sulla programmazione e con una curva di apprendimento più delicata. Una lingua di livello inferiore può avere meno astrazioni - quindi concetti meno generali da imparare - e sopraffare il principiante con dettagli di cui potrebbe voler fare a meno.


1
+1, anche se non credo che C sia più facile da imparare di Python in alcun senso. Forse ci sono meno concetti da imparare in generale, ma con Python imparerai di più nello stesso lasso di tempo. E ovviamente, se C è troppo facile, c'è sempre C ++, che ti insegna le complessità di entrambi i linguaggi di alto e basso livello. ;)
Martin,

+1, questo era il mio pensiero! Mi piacerebbe averlo letto prima delle lezioni :)
joe_coolish,

22

Non importa da dove inizi. È importante dove vai dopo l'inizio.

BASIC potrebbe non essere il linguaggio più elegante del pianeta, ma comprende i fondamenti della programmazione procedurale, ed è abbastanza per iniziare.

Ho iniziato con BASIC. Io non rimanere lì.


+1 per la risposta perfetta - mostrando concisamente quanto mal posta la domanda originale! (Come assoluta coincidenza, ho iniziato anche con BASIC ;-)
Péter Török,

5
Mi stupisce quante persone restano lì ..: o /
Gary Willoughby

1
Risposta eccellente. Breve, preciso e preciso. Ho iniziato anche con BASIC.
Michael Riley - AKA Gunny,

11

Il tuo insegnante ha ragione, tranne per il fatto che presume che le sue conseguenze siano cose negative.

Se guardi l'apprendimento delle lingue come un'attività puramente accademica per imparare come funzionano i computer, allora ha ragione. Se li guardi come un modo per fare le cose, allora hai ragione.


6
Devo essere in disaccordo con te. Le conseguenze sono cose cattive, perché la conseguenza è l'ignoranza. Ciò significa che alla fine qualcosa si romperà e il problema si troverà ad un livello di astrazione più basso di quello che capisci, quindi non avrai idea di come risolverlo. È sempre una brutta cosa.
Mason Wheeler,

6
Devo essere d'accordo con te. Le conseguenze del non sapere cosa succede sotto il cofano è una profonda semplicità e immediatezza di espressione senza preoccupazioni per le sfumature dell'hardware. Livelli più bassi di astrazione sono per i progettisti del linguaggio e non per gli sviluppatori di applicazioni.
S.Lott

1
@ Mason: assolutamente. Una volta ho fatto una notevole quantità di denaro risparmiando il culo di una squadra di programmatori che non aveva idea di cosa stesse realmente succedendo sotto il cofano, e quindi non potevano far funzionare bene il loro sistema di produzione o lavorare in modo affidabile. (Una volta perché quel tipo di lavoro fa schifo. La vita è troppo breve!)
William Pietri,

1
@Mason - Sono d'accordo con quello che hai detto, che è importante avere quella conoscenza se hai intenzione di programmare in modo professionale. Ho trovato estremamente utile la mia conoscenza di puntatori, strutture discrete e calcolo lambda. Sono stato bloccato in squadre in cui i membri del mio team non avevano queste abilità e hanno finito per creare un codice eccessivamente complicato o molto difettoso. solo perché non lo sapevano meglio. Sembra che a volte i college forniscano agli studenti CS troppo latte e non abbastanza carne, ma il rovescio della medaglia, se danno da mangiare ai programmatori principianti, corrono il rischio che cadano fuori.
joe_coolish,

1
@Joe: Secondo Joel, far cadere tutti quelli che non riescono a gestirlo è il punto. E poiché non solo un programmatore di computer ma anche un utente di computer , uno che deve lavorare regolarmente con programmi orribili che posso solo supporre siano stati creati da programmatori incompetenti, vorrei davvero che il bit "farli abbandonare" avesse più successo!
Mason Wheeler,

5

Penso che "linguaggio di scripting" sia una parola terribile, che è estremamente obsoleta o nella migliore delle ipotesi si adatta a una classe di linguaggi specifici del dominio. Il tuo insegnante sta semplicemente allineando tutto ciò di cui chiaramente non ha abbastanza comprensione in un asse del male.

Una distinzione ragionevole da fare è quella tra lingue di alto livello e lingue di basso livello, o tra quelle tipicamente e dinamicamente, che sono veramente ortogonali.

L'assemblatore è tipizzato dinamicamente a basso livello (se parlare di tipi ha alcun senso), C è tipizzato staticamente a basso livello, Ruby è tipizzato dinamicamente ad alto livello, Haskell è tipizzato staticamente ad alto livello. Java non è né statico alto né basso, ma C ++ è sia statico alto che basso. E così via.

La discussione può essere solo, quali paradigmi sono più adatti per un programmatore entry level.
Sono abbastanza convinto che la programmazione a basso livello probabilmente non lo sia. Potrebbe essere stato, qualche tempo fa, nei primi anni '90, quando si poteva effettivamente produrre risultati interessanti in tempi ragionevoli.
Ma la programmazione è alimentata dalla passione. La passione è nutrita dai premi. Pertanto, i programmatori entry level dovrebbero iniziare con strumenti gratificanti. Gli strumenti di basso livello non sono più gratificanti, perché c'è un vasto mare di strumenti di alto livello che ti danno lo stesso risultato in una frazione del tempo.

Il pensiero umano è astratto. Quando impariamo a capire il mondo, lo facciamo con astrazioni a grana molto grossa e andiamo nei dettagli secondo necessità.
Per un bambino capire il suo ambiente, non gli insegnerai matematica, poi fisica, poi chimica, poi biologia, poi storia, sociologia e filosofia. Gli dai un modello molto semplice del mondo da affrontare e vorrà da solo desiderare di superarlo, lanciandoti infinite domande su di te quando sei giovane e negando completamente la tua autorità in seguito.

È così che pensiamo. Il cervello umano può elaborare solo quantità limitate di "unità" di informazioni, ma il grado di astrattezza conta poco nella quantizzazione delle informazioni. Ad esempio: leggere l'espressione '34 * 75 'per noi è più semplice per noi rispetto al calcolo, mentre per i computer è il contrario. Riconoscere (e quindi astrarre) un gruppo di pixel neri in una linea ondulata, che può quindi essere riconosciuto (e quindi ancora una volta sottratto) come una singola cifra è un'enorme quantità di lavoro.
Mia nonna capisce l'idea di aprire un file. Tuttavia non ha comprensione al di sotto di quel livello. E francamente, se avesse dovuto imparare questo studiando prima i meccanismi interni dell'hardware e del sistema operativo e cosa no, non ci sarebbe mai arrivata.

Ci sono molte persone là fuori che complicano troppo le cose, perché non è mai stato insegnato loro a pensare in termini di soluzioni chiare, concise e quindi eleganti, ma hanno passato troppo tempo a preoccuparsi di dettagli scambiabili di basso livello e risolvere problemi contro quelli. Insegnare alle persone a pensare come i computer è il peggior approccio possibile alla programmazione.
Il valore della programmazione sta nel trovare una soluzione a un problema. Esprimerlo come codice è davvero un compito noioso e meccanico e dovrebbe semplicemente essere fatto con qualunque strumento sia adatto.

Oh, e non preoccuparti di non aver capito i puntatori. Ho avuto lo stesso problema alla stessa età. Il problema qui è anche la mancanza di astrazione. Classicamente apprendi i puntatori da qualche libro C e mentre stai lottando per capirli, questo va di pari passo con l'allocazione della memoria e quindi con la memoria stack e heap e così via. Il concetto astratto dietro i puntatori è il riferimento indiretto. Una variabile, che contiene un indice in un array specifico, è proprio quella (in realtà è davvero la stessa in C, dove l'array specifico è il tuo spazio di indirizzi), e per questo non hai bisogno di aritmetica del puntatore.
Questo ha solo lo scopo di illustrare che la scelta di un alto livello di astrazioni rende le cose molto più facili da comprendere.

EDIT: e quando si tratta di digitare, preferisco le lingue tipizzate staticamente. E penso che i programmatori entry level dovrebbero comprendere chiaramente il concetto di tipi (che è astratto).


3

Non c'è niente di semplice in Python. Dai un'occhiata a Unicode e alla meta-programmazione.


Concordo sul fatto che Python può essere molto complesso e MOLTO potente. Ma le basi (manipolazione di stringhe, manipolazione di array, ecc.) Sono molto più facili in Python che in C.
joe_coolish,

1
Python è molto semplice da iniziare e molte attività quotidiane sono un ordine di grandezza più semplice rispetto ad esempio ai linguaggi di sistema. No, la lingua nel suo insieme, i suoi dettagli cruenti e le funzionalità avanzate non sono semplici (questo vale per tutto il linguaggio non giocattolo). Ma non era questa la domanda.

1
Allora perché il mio if searchstring.lower () in filecontent.lower (): non funzionava? a causa del bom nel file sql UTF-16LE in tfs su Windows con Python2.7. Non è stato divertente. farlo funzionare. ci sono volute alcune ore. string.find () non funzionava neanche ... Argghhh!
Christopher Mahan,

1
In che modo Unicode è più semplice da gestire in C?
dan04,

3

Vedo un altro problema molto più profondo.

Le lingue non tipizzate non costringono a prestare attenzione ai tipi, a pensare nei tipi. Questo va bene finché ho piccoli script con alcune stringhe e numeri che vengono convertiti l'uno nell'altro senza accorgermene. Ma verrà il giorno in cui questo si spezzerà. Improvvisamente, il programma si interromperà e ogni soluzione rapida lo farà nuovamente.

Oppure, il programmatore di aspiranti principianti scopre che avrà bisogno di una manciata di liste invece di una lista di tuple, ma non avrà la minima idea "come farlo", e farà domande su StackOverflow che mostrano che è assoluta impotenza.


6
Ma Python e Ruby sono fortemente tipizzati. Questo è ortogonale all'essere digitato in modo dinamico. Stringhe e numeri non si convertono implicitamente l'uno nell'altro.
dsimcha,

3
@dsimcha: Sì - E come può confutare ciò che ha detto @Ingo?
Jim G.

1
Perché questa domanda riguarda principalmente Ruby e Python. Pensavo stesse insinuando che pensa che Ruby e Python siano debolmente tipizzati, il che è un malinteso comune.
dsimcha,

1
@ davidk01 - questo è il mio punto: i valori hanno tipi che lo vogliamo o no. Ma nelle lingue tipizzate dinamicamente (se quel termine ti piace di più), le variabili no. Al contrario, il controllo del tipo viene eseguito in fase di esecuzione per distinguere tra le numerose varianti di Unitype.
Ingo,

2
@Ingo: almeno ero in grado di trovare gli utenti di Common Lisp che pensavano che la mancanza di tipizzazione statica fosse un vantaggio (in realtà, la tipizzazione statica opzionale, utilizzabile per il controllo degli errori o per scopi di prestazione), in quanto accelerava lo sviluppo e che gli errori che la tipizzazione statica avrebbe evitato non si sono rivelati difficili da trovare e correggere in pratica. Non ho visto altro che l'opinione in un modo o nell'altro.
David Thornley,

2

Continuo a sostenere che l'istruzione formale e il tutoraggio sono un fattore molto più grande della scelta della lingua nella qualità del codice per principianti. Tuttavia, se dovessi scegliere una prima lingua per i principianti, sceglierei Python per i programmatori autodidatti e C ++ per l'istruzione universitaria.

Il motivo è che con l'istruzione formale puoi iniziare con piccoli e banali programmi per gettare solide basi teoriche anni prima che tu debba fare qualcosa di utile. Penso che l'ordine sia l'ideale se puoi permetterti il ​​tempo, e C ++ ti dà molto aiuto con errori del compilatore e errori di segmentazione tra le lezioni per farti sapere se non stai afferrando i fondamenti.

Alcuni di questi concetti fondamentali sono davvero difficili da imparare se sei autodidatta, fino a quando non avrai un po 'di esperienza. Inoltre, di solito devi creare qualcosa di utile il prima possibile e puoi ottenere le basi teoriche secondo necessità, anche se con questo approccio rischi di non imparare mai più del minimo indispensabile. Ecco perché ti consiglio un linguaggio come Python in quel caso.


2

L'abbiamo visto viceversa al college e penso che sia utile. * Abbiamo iniziato a basso livello. Puntatori, gestione della memoria, array di caratteri ... Quindi sì, abbiamo iniziato con C. Lo stesso con gli algoritmi: prima implementa un elenco collegato, una tabella hash, un albero ... E solo allora usa le librerie standard.

Successivamente siamo passati a linguaggi più potenti come Java, C # o perl. Ma con il vantaggio di sapere cosa sta succedendo sotto la cintura.

Mentre funziona, credo che anche andare dai linguaggi di scripting a una lingua di livello inferiore vada bene. Conoscere sia un linguaggio di alto livello che basso ti assicura di avere la facilità d'uso di un linguaggio di alto livello pur comprendendo cosa sta succedendo. L'ordine in cui le apprendi è meno importante.


1

I linguaggi di scripting non rendono i programmatori sciatti. La mancanza di chiarezza nella comprensione del dominio problematico (ad es. L'attività del programma) è ciò che causa la sciatteria.

Come dice il vecchio proverbio, "Puoi scrivere COBOL in qualsiasi lingua", anche se sospetto che quando tutti i tipi di dati sembrano uguali , diventa più difficile vedere quali sono gli aspetti essenziali del tuo programma, una delle caratteristiche principali di COBOL- zione.


1
Provalo prima di sospettare. La differenza principale è che non te ne frega niente di dove sia Fooo Baro qualcosa di completamente diverso finché puoi .frobnicate()farlo in entrambi i modi. Senza interfacce esplicite.

Conosco abbastanza bene i linguaggi dinamici, dato che il mio lavoro quotidiano è con Ruby on Rails. E sì, questa è una convenzione importante all'interno della comunità linguistica dinamica. In generale, questo si chiama 'anatra digitando'. Nella letteratura di ricerca, sono chiamati tipi strutturali e ci sono alcune convenzioni di sintassi che possono mostrarti come appare un "tipo quackable". Non solo, ci sono sistemi di tipi che possono riconoscerli e verificare che il tuo programma stia trattando le anatre con gentilezza.
Farley Knight,

Conosco i tipi strutturali e li considero un'idea piuttosto chiara. Ma dato che non esiste un unico linguaggio maturo, ampiamente usato a distanza (la base di utenti di livello O'Caml sarebbe un buon inizio) che li utilizza, non li considero un'alternativa pratica alla digitazione dinamica. Triste, ma fatto.

Le lingue ampiamente utilizzate non lo fanno, ma ciò non ti impedisce di reinserire il tuo sistema di tipi su uno ampiamente utilizzato. Sono sicuro che hai visto documenti su cose come l'inferenza dei tipi per i linguaggi dinamici.
Farley Knight,

Ancora una volta, non considero qualcosa usato da me e dal ragazzo della porta accanto un'alternativa pratica . Un programmatore ha bisogno di cose come librerie, sintassi stabile, strumenti, ecc.

1

Direi che i linguaggi di scripting non incoraggiano tecniche sciatta. (Si noti che questo non significa che le lingue siano cattive , solo che è difficile mantenere basi di codice di grandi dimensioni in tali lingue) Tuttavia, penso che per ragioni diverse rispetto alle altre risposte qui.

Penso di usare qualsiasi linguaggio di cui un programmatore abbia bisogno per avere una conoscenza di base della programmazione nel suo insieme. Non saranno efficaci da nessuna parte se non comprendono concetti come vettori, alberi e tabelle hash. Non devono necessariamente essere in grado di implementare queste cose, ma devono conoscere le loro caratteristiche.

Laddove penso che la sciatteria entri in gioco non è l'abilità di programmazione, ma quando è necessario creare componenti riutilizzabili. Questi linguaggi non richiedono di definire buone interfacce tra unità di codice o meccanismi per far sì che le librerie impongano vincoli ai loro client. Non è impossibile creare buoni componenti riutilizzabili in tali lingue, è solo molto più difficile.

I linguaggi di scripting fanno appello al programmatore principiante perché consente loro di fare più cose "una tantum" in meno tempo, ma quando quegli stessi programmatori iniziano a programmare la manutenzione spesso hanno problemi con questi linguaggi.

Non sto dicendo che i linguaggi di scripting siano cattivi, tutt'altro. Ma rendono difficile mantenere enormi codebase (diversi milioni di righe) (che è uno dei motivi per cui non vedi tali codebase fatte nei linguaggi di scripting). Quando hai bisogno di soluzioni relativamente piccole o una tantum, ti consentono di ottenere molto di più in meno tempo e meno codice (e meno codice è quasi sempre migliore).

Tieni presente che nessuno strumento è il migliore per ogni lavoro. Scegli lo strumento più adatto alla situazione. Questo vale per i linguaggi di programmazione come per qualsiasi strumento.


0

Sono con il tuo insegnante, ma anche con @Singletoned quando dice che il tuo insegnante sta assumendo che le conseguenze (ad esempio, nessuna conoscenza delle prestazioni) siano cattive.

Penso che iniziare con C sia meglio che iniziare con i linguaggi di scripting. Come insegnante, mi concentrerei su tutto ciò che riguarda l'architettura di von Neumann (ALU, registri, memoria, porte I / O, ...), passare direttamente ai puntatori (mi dispiace, è davvero un concetto chiave [non rilasciare riferimenti (ad es. puntatori) nei linguaggi VM è una fonte primaria di perdite di memoria]), colpire alcune strutture di dati (albero, elenco collegato, tabella hash 1 ) e quindi ... avviare un livello di astrazione in qualcos'altro (OO, programmazione funzionale, qualcosa - regole di digitazione statiche forti , yo \ m /, quindi niente "linguaggi di scripting"> :().

1 Hmm, forse sono d'accordo con il tuo insegnante su considerazioni sulle prestazioni, dopo tutto.


La programmazione sciatta è una fonte di perdite di memoria e non ci vuole molto per insegnare alle persone a tenere traccia delle risorse come gli handle di file. Ci sono innumerevoli programmi in C con perdite di memoria, quindi non sono sicuro di cosa ti occupi insegnando alle persone i puntatori il prima possibile.
davidk01,

Questo è vero, ma ... (a) non capire le basi porta ad alcuni codici errati (tramite l'hacking-fino a quando è giusto o programmazione sciatta), e (b) stavo cercando di motivare perché i puntatori sono ancora rilevanti, no affermando che C è meglio dei linguaggi raccolti in modo inutile in termini di perdite di memoria. L'obiettivo di arrivare ai puntatori al più presto è in modo che possiamo ottenere il diavolo da C.
JohnL4

0

Penso che il meglio sia iniziare con un linguaggio modulare e poi passare a cose più complicate, ai miei tempi abbiamo iniziato con Pascal e COBOL e abbiamo cercato di capire cosa significano subroutine, variabili del flusso di controllo, ecc. Solo dopo essermi sentito a mio agio con Pascal ho persino avuto il desiderio di passare a linguaggi come C / C ++ e di apprendere tutte le altre tecniche che sono più un aggiunta al programmatore junior.


0

Hai ragione entrambi.

I linguaggi di scripting rendono sicuramente più difficile per gli sviluppatori alle prime armi capire cosa sta realmente succedendo. (Lo stesso vale per database, framework e librerie. Oh, e browser, server, reti e filesystem.) Quando intervisto sviluppatori più giovani, sono spesso sbalordito da quanto poco sanno su come funzionano effettivamente i computer e quanto sono inclini a caricarsi -cult programmazione.

D'altra parte, la cosa numero uno che cerco nelle interviste non è la comprensione perfetta, è che amano fare le cose. All'inizio, un computer che faceva qualsiasi cosa era piuttosto impressionante, quindi le mie piccole cose di Apple Basic e 6502 mi sembravano davvero fantastiche. Ma al giorno d'oggi i computer fanno un sacco di cose fantastiche, quindi penso che vada bene che le persone inizino ad un livello piuttosto alto se questo è ciò che serve per essere agganciati.

Fondamentalmente, penso che sia ok per iniziare nella parte bassa della piscina solo finché alla fine ti colpisci per acque più profonde.


0

In primo luogo, inizierò di certo con un linguaggio di livello di astrazione più elevato. Attualmente consiglierei Python. Il motivo più importante per scegliere un linguaggio di scripting come prima lingua è che puoi facilmente mettere insieme qualcosa che funzioni. Come menziona Joe nella sua domanda, la cosa numero uno mentre diventi un programmatore è che hai la motivazione per andare avanti e scavare più a fondo. Questa motivazione si ottiene quando si è in grado di creare software funzionante e utile.

Oltre ai punti con la comprensione dell'astrazione (livello elevato) e la comprensione dell'implementazione sottostante (livello basso), manca un terzo punto. Per essere un buon programmatore al giorno d'oggi devi certamente padroneggiare entrambi i due punti sopra. Inoltre, per la tua competenza è fondamentale che tu guardi costantemente a nuove tecnologie e punti di vista. Non importa da quale livello di astrazione inizi, devi migliorare costantemente e mettere in discussione i tuoi metodi attuali.

Dovrebbe essere chiarito fin dall'inizio che i linguaggi di programmazione sono semplicemente strumenti per portare a termine il lavoro. È molto importante scegliere lo strumento corretto per una determinata attività. Penso che per un programmatore principiante un linguaggio di scripting di alto livello aiuterà a sottolineare questo punto. Un linguaggio di livello superiore fornirà una prospettiva più ampia e motiverà il programmatore a scavare più a fondo.

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.