Non sono d'accordo su questi due punti:ottimo per imparare a programmare
non capisco invece perché c debba per forza "servire sempre da qualche parte", ma mi sa che abbiamo già fatto questo discorso...
ma non è per niente vero, anzi python ha una delle sintassi più "rigide" che ci siano (pensa solo all'indentazione obbligatoria), e il motivo è proprio l'opposto di quello che indichi: farti prendere delle buone abitudini e rendere il tuo codice uniforme e leggibile. non so cosa potresti pensare di perl o ruby...1- Python ha una sintassi molto versatile e leggera rispetto ad altri linguaggi sopracitati, perciò secondo me si potrebbe prendere qualche cattiva abitudine nella stesura/struttura del programma;
non è certo un male ma continuo a credere che ci siano scelte migliori nello stesso àmbito. parliamo comunque di un linguaggio nato nel 1969: l'informatica di oggi è quattro volte più vecchia di quanto fosse quando C è stato inventato...2- Vabbè da C derivano parecchie cose, conoscerlo di certo non è un male :v
cosa consiglieresti?Comunque Python rimane un ottimo linguaggio, anche se non lo userei mai per addentrarmi nel mondo della programmazione.
boh, secondo me insegnare subito l'OOP ha poco senso, perché è un paradigma adatto a cose più strutturate e complesse di quelle che si fanno all'inizio, e poi (specialmente con java) uno si fa l'idea che siano fondamentali per qualsiasi cosa, dando origine ad abomini tipo "AbstractSingletonProxyFactoryBean". d'altronde il bello di python è che non è assolutamente necessario utilizzare gli oggetti e può essere tranquillamente usato in modo imperativo.E poi boh non capisco quest'idea che nessuno debba mai partire dai linguaggi OOP per imparare, secondo me ha i suoi vantaggi.
Si forse è vero, conosco gente che ha imparato con java ed è esattamente così che ragiona, però se si è indirizzati a comprendere che gli oggetti non sono strutture fondamentali per tutto e soprattutto se si impara con un linguaggio come python che, come dicevi, non è necessariamente finalizzato alla programmazione a oggetti, ci possono essere dei vantaggi, invece magari di dover cambiare linguaggio per passare dalla programmazione imperativa all'OOP, poi non so.boh, secondo me insegnare subito l'OOP ha poco senso, perché è un paradigma adatto a cose più strutturate e complesse di quelle che si fanno all'inizio, e poi (specialmente con java) uno si fa l'idea che siano fondamentali per qualsiasi cosa, dando origine ad abomini tipo "AbstractSingletonProxyFactoryBean". d'altronde il bello di python è che non è assolutamente necessario utilizzare gli oggetti e può essere tranquillamente usato in modo imperativo.
sarebbe anche interessante vedere se un "profano" di programmazione è, come penso, avantaggiato nell'imparare per prima cosa un linguaggio puramente funzionale. per esperienza (puramente aneddotale) il problema dell'imparare i linguaggi funzionali è che richiedono un modo di ragionare completamente diverso, e può essere che chi non ha conoscenze di linguaggi "classici" possa trovarsi avantaggiato (specialmente se ha conoscenze matematiche).
impara prima python\java\etc, poi prova ad imparare il c e vedi come piangi :Dconoscere il c ≠ iniziare col c.
ma è sicuramente l'unico linguaggio che le usa e che vale la pena imparare come primo. ci sarà un motivo se il c ha quarant'anni ed è ancora usatissimo e spesso consigliato come primo linguaggio da chiunque ne capisca un minimo di computer, no?tra l'altro puntatori e allocazioni dinamiche non sono certamente feature esclusive di c
se è per questo la cattedra di informatica teorica all'unina c'è l'ha uno laureato in filosofia alla columbia, e precedentemente ce l'aveva un fisico cibernetico di fama internazionale. che c'entra?conosco gente (matematici) che si occupa di teoria della computazione
ma perché, scusa? secondo me piangi di più a imparare subito il c, rispetto a quando conosci già bene un altro linguaggio di programmazione... perché il percorso dev'essere necessariamente basso livello -> alto livello? allora impariamoci tutti assembly per primo, così con il c c'è da piangere di meno...impara prima python\java\etc, poi prova ad imparare il c e vedi come piangi :D
anche ammettendo che sia meglio insegnare prima un linguaggio di basso livello (cosa che, ripeto, non mi trova d'accordo), per esempio un rust o un go, pur non supportati da altrettanta popolarità, permettono di capire "il computer" altrettanto bene, e senza i problemi di c. ecco l'esperienza di un professore che ha adottato rust nel corso di operating systems alla university of virginia.ma è sicuramente l'unico linguaggio che le usa e che vale la pena imparare come primo. ci sarà un motivo se il c ha quarant'anni ed è ancora usatissimo e spesso consigliato come primo linguaggio da chiunque ne capisca un minimo di computer, no?
significa che dire "se vuoi fare il computer scientist devi sapere il c" ha poco senso quando la CS è una materia così vasta che per alcuni ambiti non è neanche necessario saper programmare.se è per questo la cattedra di informatica teorica all'unina c'è l'ha uno laureato in filosofia alla columbia, e precedentemente ce l'aveva un fisico cibernetico di fama internazionale. che c'entra?
per lo stesso motivo per cui è più semplice passare dal cambio manuale a quello sequenziale che non il contrario.ma perché, scusa?
questa è una tua personalissima opinione che non ha 'sto gran seguito all'interno della comunità informatica mondiale, poi..anche ammettendo che sia meglio insegnare prima un linguaggio di basso livello (cosa che, ripeto, non mi trova d'accordo)
quindi in capa a te all'università, cioè in un posto dove il tempo scarseggia, come primo linguaggio bisognerebbe insegnare linguaggi usciti l'anno scorso e in beta oppure strambi come rust o go? solo perché UN tipo ha preferito qualcosa al c? un tipo che gestisce un corso di SISTEMI OPERATIVI, che è roba per gente che si presume sappia programmare?per esempio un rust o un go, pur non supportati da altrettanta popolarità, permettono di capire "il computer" altrettanto bene, e senza i problemi di c.
sei liberissimo di laurearti in matematica e poi trovarti per caso ad approfondire campi legati alla computer science, ma non esiste sulla faccia della terra che ti danno una laurea in informatica e non sai scrivere in c, punto.significa che dire "se vuoi fare il computer scientist devi sapere il c" ha poco senso quando la CS è una materia così vasta che per alcuni ambiti non è neanche necessario saper programmare.
per lo stesso ragionamento è molto più facile imparare a guidare col cambio automatico che con quello manualeper lo stesso motivo per cui è più semplice passare dal cambio manuale a quello sequenziale che non il contrario.
perché immagino che tu rappresenti la comunità informatica mondiale... comunque dato che a sparare link a caso per supportare la propria tesi siamo bravi tutti, ecco i mieiquesta è una tua personalissima opinione che non ha 'sto gran seguito all'interno della comunità informatica mondiale, poi..
veramente ho solo obiettato che c non è certo l'unico linguaggio che permette la programmazione a basso livello, e che le basi dell'informatica si possono capire anche con linguaggi più moderni (peraltro go è ampiamente stabile e utilizzato e gestisce milioni di richieste al minuto sui server di google e cloudflare). il link è riportato solo per completezza (il corso non era indirizzato a principianti) perché contiene una motivazione molto approfondita sulla scelta di rust e sulla non-scelta di c, che ti invito a leggere.quindi in capa a te all'università, cioè in un posto dove il tempo scarseggia, come primo linguaggio bisognerebbe insegnare linguaggi usciti l'anno scorso e in beta oppure strambi come rust o go? solo perché UN tipo ha preferito qualcosa al c? un tipo che gestisce un corso di SISTEMI OPERATIVI, che è roba per gente che si presume sappia programmare?
ma sei serio?
ne conosco almeno due (uno attualmente fa le robe con agda in un'università svedese) che non lo sanno scrivere (anche se ovviamente lo sanno leggere). ripeto, dipende dagli ambiti in cui operi...sei liberissimo di laurearti in matematica e poi trovarti per caso ad approfondire campi legati alla computer science, ma non esiste sulla faccia della terra che ti danno una laurea in informatica e non sai scrivere in c, punto.
è ovvio che essendo a oggi uno dei linguaggi più popolari sia tra i più nominati per iniziare (anche perché molti concepiscono solo l'esistenza della triade c/c++/java, e altri - mi sembri un buon esempio - sono convinti che se non ci sono dei puntatori non sia vera programmazione). non significa che sia sempre ed esclusivamente la scelta didattica migliore, dato quanto è cambiata l'informatica e quanti strumenti migliori abbiamo a disposizione rispetto agli anni in cui c è stato creato. e poi mi sembra che si crei un circolo vizioso: c è rilevante perché tutti lo insegnano perché è rilevante.peggio di parlare con un muro, oh. da che mondo è mondo il c è l'unico linguaggio che dura nel tempo e che viene sempre nominato come buon inizio, non ti sei mai chiesto il perché?
se vuoi guidare su strade a venti corsie, ok. se vuoi fare il pilota, forse dovresti imparare da quello manuale, no?per lo stesso ragionamento è molto più facile imparare a guidare col cambio automatico che con quello manuale
i MIEI link portano le opinioni di gente del calibro di spolsky, linus torvalds o dell'utenza di stackoverflow, il che sarebbe tutto dire. i tuoi parlano di come python sia migliore per cominciare. opinabile, in alcuni casi potrei trovarmi d'accordo certo (come ho già detto), ma poi appena si approfondisce un po' la programmazione si inizia a piangere perché poi roba come python o ruby guarda caso si basano sul c.
e io ripeto che C è l'unico linguaggio di medio livello che vale ancora la pena imparare fra i primi.veramente ho solo obiettato che c non è certo l'unico linguaggio che permette la programmazione a basso livello, e che le basi dell'informatica si possono capire anche con linguaggi più moderni
anche il c#, perché non iniziare con quello? go è pure strano come paradigma, non è roba da principiantiperaltro go è ampiamente stabile e utilizzato e gestisce milioni di richieste al minuto sui server di google e cloudflare)
neanche sid vicious sapeva suonare il basso, consiglieresti a tutti i musicisti di tentare le luci della ribalta senza saper prendere uno strumento in mano? il fatto che due persone che conosci fanno cose informatiche senza conoscere il c non li rende esempi da seguirene conosco almeno due (uno attualmente fa le robe con agda in un'università svedese) che non lo sanno scrivere (anche se ovviamente lo sanno leggere). ripeto, dipende dagli ambiti in cui operi...
tralasciando la presa per il culo (a me manco piace così tanto java, ma è da folli non riconoscergli meriti), un informatico deve sapere cosa significano puntatori, allocazioni dinamiche, stringhe gestite in modo elementare, passaggi per riferimento e tutte quelle cose che il c costringe ad imparare. ed è una buona cosa impararle PRIMA di essere abituati a risolvere i problemi con "import antigravity" e tutte quelle comodità degli altri linguaggianche perché molti concepiscono solo l'esistenza della triade c/c++/java, e altri - mi sembri un buon esempio - sono convinti che se non ci sono dei puntatori non sia vera programmazione)[/size]
Però se usiamo questi paragoni, le persone passano prima dal motorino e poi alla moto, è una cosa naturale, il motorino non ha le marce, la moto si, non mi pare che nessuno si sia mai lamentato...per lo stesso motivo per cui è più semplice passare dal cambio manuale a quello sequenziale che non il contrario.
https://yourlogicalfallacyis.com/appeal-to-authorityi MIEI link portano le opinioni di gente del calibro di spolsky, linus torvalds o dell'utenza di stackoverflow, il che sarebbe tutto dire.
non è che si basano sul c, il loro interprete canonico è scritto in c. esistono implementazioni alternative (pypy è scritto in python e ha un compilatore jit, poi ci sono i vari jruby/jython, la roba per .net, ecc). comunque la cosa che sto cercando di dirti è che non mi sembra necessariamente vero, dal punto di vista didattico, che c sia più difficile da imparare più tardi. molti dei programmatori che conosco (che non è che voglia dire granché, pura esperienza personale) hanno cominciato con php e adesso lavorano tranquillamente con c/c++ (o linguaggi di difficoltà comparabile), altri addirittura hanno cominciato smanettando con tlc per programmare i bot su irc... e dall'altra parte conosco gente che ha imparato c alle superiori e scrive dello spaghetti-code allucinante. non ci vedo necessariamente una correlazione, insomma, e dall'altra parte credo che c possa essere "troppo" per una persona alle prime armi.i tuoi parlano di come python sia migliore per cominciare. opinabile, in alcuni casi potrei trovarmi d'accordo certo (come ho già detto), ma poi appena si approfondisce un po' la programmazione si inizia a piangere perché poi roba come python o ruby guarda caso si basano sul c.
ma andrebbe benissimo anche c#, che è un ottimo linguaggio, figurati!anche il c#, perché non iniziare con quello? go è pure strano come paradigma, non è roba da principianti
vabbè le analogie basta...neanche sid vicious sapeva suonare il basso, consiglieresti a tutti i musicisti di tentare le luci della ribalta senza saper prendere uno strumento in mano? il fatto che due persone che conosci fanno cose informatiche senza conoscere il c non li rende esempi da seguire
perché?tralasciando la presa per il culo (a me manco piace così tanto java, ma è da folli non riconoscergli meriti), un informatico deve sapere cosa significano puntatori, allocazioni dinamiche, stringhe gestite in modo elementare, passaggi per riferimento e tutte quelle cose che il c costringe ad imparare. ed è una buona cosa impararle PRIMA di essere abituati a risolvere i problemi con "import antigravity" e tutte quelle comodità degli altri linguaggi
dipende da come interpreti l'insegnamento universitario. se lo scopo è formare utilizzando i migliori strumenti possibili, non vedo perché non prendere in considerazioni linguaggi moderni di equivalente astrazione e potenza (anche perché dubito che si possa insegnare c "come si deve" nella durata di un corso universitario). se lo scopo è formare gente perché venga assunta nelle aziende, allora che si insegni quello che vogliono le aziende, ma porta alla ripetizione del circolo vizioso di cui parlavo nel post precedente...ps: il signor virginia avrà tutti i suoi buoni motivi, ma tutti i sistemi operativi di questo mondo sono scritti in c (perfino quelli usciti l'altroieri) e i suoi studenti usciranno dal corso di sistemi operativi senza saper usare il linguaggio di riferimento.
Sinceramente, lo vedo in giro un po' ovunque, ma è ovvio che se ne può fare bellamente a meno, almeno nei livelli più alti di programmazione. Poi è chiaro che se ti servono i puntatori da qualche parte ricadi su C: c'è un motivo per cui ha praticamente soppiantato qualsiasi cosa ci fosse prima, assembly escluso.non capisco invece perché c debba per forza "servire sempre da qualche parte", ma mi sa che abbiamo già fatto questo discorso...
perché è il suo mestiere.perché?
perché i linguaggi nuovi sono meno collaudati, sono meno conosciuti, probabilmente hanno meno supporto da parte della comunità, meno librerie, meno tutto. l'insegnamento funziona che uno ti dà degli strumenti per iniziare, poi il resto sono principalmente cazzi tuoi. ed è molto più utile insegnare cose diffuse e standard e poi imparare roba esotica come go o rust per fatti propri che non il contrarionon vedo perché non prendere in considerazioni linguaggi moderni di equivalente astrazione e potenza
appunto: c viene insegnato perché è popolare perché viene insegnato. quindi niente potrà mai soppiantare c e resteremo per sempre chiusi in un circolo vizioso. un po' come questa conversazione.perché i linguaggi nuovi sono meno collaudati, sono meno conosciuti, probabilmente hanno meno supporto da parte della comunità, meno librerie, meno tutto.
la cosa bella dell'informatica è che ti insegnano subito a non reinventare la ruota e di basarsi sempre su cosa è stato scritto prima di te. quindi ovviamente linko un articolo al riguardo, http://www.joelonsoftware.com/articles/fog0000000319.htmll "perché?" era inteso come "perché queste cose dovrebbe impararle subito invece che quando ha già dimestichezza con la programmazione?".
nulla contro spolsky (e comunque l'articolo è del 2001), ma non sono d'accordo con ciò che dice. in qualsiasi campo l'insegnamento avviene a partire dal più facile per arrivare al più complesso... e se davvero sostiene che "If you want to teach somebody something well, you have to start at the very lowest level", non vedo perché non dovrebbe partire da assembly.la cosa bella dell'informatica è che ti insegnano subito a non reinventare la ruota e di basarsi sempre su cosa è stato scritto prima di te. quindi ovviamente linko un articolo al riguardo, http://www.joelonsoftware.com/articles/fog0000000319.html
ma non eri tu che sostenevi l'impossibilità di scrivere programmi senza un'ide? comunque si parlava del REPL incluso in python, particolarmente comodo per l'apprendimento.i tuoi link precedenti come argomentazione alla tesi "iniziare col python" portano cose del calibro di "si può programmare in python anche col solo text editor" (puoi farlo con qualsiasi linguaggio, anzi, BISOGNA farlo con qualsiasi linguaggio)
la mancanza di boilerplate e la semplicità della sintassi a me sembrano fattori fondamentali per chi sta imparando. ymmv.oppure "ha poco boilerplate" (che è roba che non interessa ad un neofita della programmazione come problema)
guarda che python pur essendo dinamico è fortemente tipizzato e non consente operazioni tra tipi diversi (a differenza di js, php, ecc), ed espone il suo type system in maniera piuttosto chiara. ma poi quale genere di cose?oppure "il typing dinamico è meglio per un newbie" (e poi piangi perché un newbie fa un SACCO di errori e un linguaggio dinamico non è per niente adatto per questo genere di cose)
prendere un'opinione e decidere che è un fatto non la rende un fatto :)per esempio, invece, il mio ultimo articolo da un chiaro esempio di abitudini di programmazioni sbagliate che una educazione che parte dal c permette di evitare. questo è un fatto, non una opinione con cui si può concordare o meno.
veramente contestavo proprio l'affermazione del tuo amico secondo cui bisogna iniziare dal "very lowest level" (per inciso, non consiglierei mai l'assembly come linguaggio iniziale)ps: a me fa morire questa fissazione che hai per l'assembler. il c ha senso non perché è di basso livello, ma per le tematiche che permette di approfondire. l'assembly (quale assembly, poi? mica ce ne sta uno solo) in che modo sarebbe migliore per queste tematiche?
è un ottimo linguaggio dinamico, e l'interprete luajit è velocissimo (quasi c-like), oltre al fatto che lo usiamo sul wiki. ma avendo meno librerie, comunità e documentazione a disposizione, ti consiglierei di partire da qualcos'altro.Ma se invece cominciassi col LUA, andrebbe bene lo stesso?