PDA

View Full Version : Imparare un linguaggio adatto a tutte le esigenze


Lukai
23-05-2018, 14:30
Ciao a tutti,

avrei una domanda che so di per certo essere stata posta in mille differenti salse in qualsiasi forum, thread o canale Youtube.

La domanda parrebbe semplice "Quale linguaggio imparare se si vuole iniziare DA ZERO" (nel 2018)?

Ovviamente qui ognuno direbbe la propria, chi Java anche se non semplice perchè é indubbiamente il più utilizzato nel mondo del lavoro, chi Python perchè é il più semplice da apprendere anche se non adatto a tutti gli scopi (applicazioni Desktop o mobile), chi C++ perchè in grado di fornire basi solide, chi C# perchè "nuovo" e altrettanto richiesto in ambienti windows ...

Poi però si aggiungerebbe qualcuno fuori tema che proporrebbe PHP perchè leader "indiscusso" per i siti web ed infine arriverebbe il suggerimento di provare con Javascript ... perchè ora il mondo è mobile.

Scenari visti e rivisti, ma forse il vero problema sta nel trovare una domanda che oggettivamente dia una sola risposta (o almeno il minor numero di alternative) :)

Proviamo allora ad individuare un linguaggio:

1. adatto a chi non abbia basi di programmazione. Quindi semplice per sintatti e per ragionamento;
2. adatto ad ogni necessità. Sia che si voglia fare un software per desktop, o una app (attenzione, non un sito consultabile) su un dispositivo mobile. Sia che si voglia un tool che lavori da terminale. Sia che si voglia un programma che lavori su Web, magari con database o server. Un linguaggio a 360° insomma con meno compromessi possibile;
3. che non imponga lo studio di altri N linguaggi per compensare le proprie carenze;
4. con una buona curva di apprendimento.

Premetto che agli albori avevo iniziato con Java per abbandonarlo praticamente subito e recentemente mi ero dato a Python per scoprire che non era adatto a molti progetti.

Vediamo un po' se arriviamo dalle stesse conclusioni dunque.
A voi la parola.

pabloski
23-05-2018, 15:39
chi Python perchè é il più semplice da apprendere anche se non adatto a tutti gli scopi (applicazioni Desktop o mobile)


E chi te l'ha detto?

Python per applicazioni desktop con gui ( e multipiattaforma )

https://wiki.qt.io/Qt_for_Python
https://www.wxpython.org/
https://pygobject.readthedocs.io/en/latest/

Per il mobile http://kivy.org/

Esistono inoltre librerie per lo sviluppo dei giochi ( PyGame ), intelligenza artificiale, analisi numerica, ecc...


chi C++ perchè in grado di fornire basi solide


Dipende da cosa s'intende per basi. C++ non ti aiuta a ragionare in termini algoritmici, anzi la sua complessità confonde e complica

per chi comincia C++ è l'ultimo dei consigli che darei

poi C++ è un linguaggio molto opinato, che implementa un ristretto set di modelli di programmazione e in maniera molto tirannica

se parliamo di basi, in particolare in termini di logica della programmazione, il linguaggio da consigliare sarebbe LISP


chi C# perchè "nuovo" e altrettanto richiesto in ambienti windows ...


Nuovo non direi. C# esiste da poco meno di 20 anni.



Javascript ... perchè ora il mondo è mobile.


Attenzione che javascript è una delle possibili scelte per lo sviluppo mobile, ma non è l'unica, non è quella standard e supportata ufficialmente da Google ed Apple e non è nemmeno quella più performante.

Attualmente il mondo mobile è diviso tra Swift/Objc e Kotlin/Java.


Premetto che agli albori avevo iniziato con Java per abbandonarlo praticamente subito e recentemente mi ero dato a Python per scoprire che non era adatto a molti progetti.


Cos'hai trovato in Python che non ti convince? A parte il packaging un pò convoluto per produrre binari per le varie piattaforme, è tra i linguaggi più carrozzati e semplici da usare.

Comunque, ad oggi, l'unico linguaggio che può fare quasi tutto è Javascript. Perchè lato web frontend non esistono altri linguaggi che girano nel browser ( parantesi su Webassembly, ma parliamo del futuro ).

Ma togliendo dall'equazione il frontend web, direi che hai un'ampia scelta: Python, Go, Haxe, Lua, Ruby, Racket.

Python, Ruby, Lua e Go sono la semplicità fatto linguaggio.

Haxe è un pò più complicato, a la Java maniera. Racket è semplice per chi ha la mentalità giusta. E' un LISP e come tale richiede di ripensare completamente la logica di programmazione ( per chi viene da linguaggi imperativi è un pugno in faccia ).

Ci metterei Clojure accanto a Racket, visto che è un LISP e gira sulla Java Virtual Machine, quindi ha a disposizione gazillioni di librerie.

Ma imho l'elemento principale sono le API. Si può usare C# ( per esempio ) per programmare su tutto, da Windows ad iOS. Il problema è che però C# su Windows significa WPF o Winforms. Su Linux e macOS significa GTK#. Su iOS significa Cocoa#.

Alla fin fine ti ritrovi a dover studiare le funzioni ( non solo per realizzare interfacce grafiche ) di ogni sistema operativo. Ed è qui che si perde il grosso del tempo.

Da cui il vero valore aggiunto è dato da API multipiattaforma, librerie che astraggono le particolarità di ogni sistema.

Per esempio Electron ( un ambiente Javascript per scrivere applicazioni desktop ) è così. E' di fatto un browser su cui far girare applicazioni html5.

Idem QT, Gtk, Wxwidgets.

E c'è una libreria carina, si chiama Sciter, permette di realizzazione GUI tramite html + una specie di Javascript e la GUI può interagire con codice scritto in vari linguaggi ( Python, D, Go, Rust e altri ).

Se però parliamo SOLO di linguaggi, allora non ha senso ( per ora ) andare molto oltre Python, Ruby, Lua e Go.

iezzetto
24-05-2018, 09:37
Io penso che non esiste un linguaggio universale che si adatti a tutte le esigenze.
Ogni linguaggio ha i proprio pro/contro

Tutto dipende da cosa vorresti imparare a fare.

Mobile? ... WebApp? ... Firmware? ... Programmi desktop - client/server? ... etc...

Oggi siamo nell'era del mobile, tutto (o quasi) si fà tramite smartphone e quindi imparare un linguaggio adatto allo sviluppo di APP non è una scelta sbagliata.

Occhio che dietro ogni applicazione c'è quasi sempre un database.
E' chiaro che ti toccherà imparare anche il linguaggio SQL (per i DBMS) o altri linguaggi per i database NOSQL (es: MongoDB)

Io provengo da uno studio (fatto a scuola) di VB6 e quindi ho sviluppato diversi applicativi desktop client/server.

Da anni mi sono orientato alle webapp e servizi API sviluppando con PHP (backend) e html/css/js (frontend).
E' un mondo affascinante e con poche righe di codice riesci a fare molto!

Ciao

lorenzo001
24-05-2018, 13:26
La conclusione semplice è che non esiste quello che cerchi.

pabloski
24-05-2018, 14:39
Attenzione però che lui specifica di volere un linguaggio per chi impara da zero. Quindi ha circoscritto il perimetro di ricerca.

E credo anche che cerchi un linguaggio per gli usi comuni. Del resto se fosse stato in cerca di qualcosa per l'embedded, non sarebbe venuto qui a porre quel tipo di domanda.

Lukai
24-05-2018, 17:49
Ho letto con piacere le vostre risposte e mi piacerebbe ragionare del più e del meno (un po’ come al tavolo di un bar).

Concordo con Iezzetto quando dice che non esista un linguaggio universale.
Magari però esiste un linguaggio che con apposite librerie (perdonate il mio linguaggio da profano) riesca a fare tutto senza lode e senza infamia.

Sicuramente è importante avere le idee chiare sul PERCHE’ si voglia imparare o il COSA si voglia realizzare per una scelta ottimale. Ma quando una persona non ha un progetto specifico e soprattutto non ha il tempo per imparare più linguaggi, cerca qualcosa di “semplice” ma allo stesso tempo “completo”.

Avevo letto che per la creazione di app per Android/iOS la scelta migliore fosse Javascript proprio perchè (come detto da Pabloski) utilizzando delle librerie specifiche si poteva creare un programma multipiattaforma (anzichè creare due programmi distinti).

Per quanto mi riguarda avrei anche continuato con Python, ma dopo essermi sentito dire che il suo utilizzo non è ottimale per software desktop, nè ad applicazioni per cellulari, nè per soluzioni front-end web ... ma tot’al più per sviluppi scientifici (o per attività lato server) mi sono smontato un po’. Senza considerare la mia delusione quando aspettandomi gli array multidimensionali mi sono visto arrivare le liste -_-

Pensando a cosa mi piacerebbe fare se sapessi programmare la lista è veramente lunga e spesso viene ispirata da quei tool che non si trovano open source sul mercato :D

- un programmino per l’invio bulk di mail (il classico invito personale ad un evento anzichè una mailing list)
- un’applicazione desktop che calcoli il calendario delle partite in base al numero di squadre, campi, i turni di riposo e gli arbitraggi ...
- un sistema per la suddivisione equa di persone eterogenee per gruppi (magari attingendo da un db online compilato da un form e che restituisca un excel con le possibili combinazioni ed un indice di rank)
- Un programmino per la verifica dei dati di backup
- Un’app per il cell che visualizzi i prodotti di un sito aziendale
- un CRM per l’attività commerciale o per il ticketing (nella mia azienda è stato sviluppato in java con db mysql)
- CMS da tablet per le ordinazioni ai tavoli (nella mia vecchia azienda credo fosse fatto in C#)
- Un bel progetto (desktop / web / app android) che visualizzi per un torneo della parrocchia il calendario partite, la classifica, i gironi, le qualificazioni (come Enjore o la versione web di SportsPress)

Insomma … le idee per allenarsi ci sono, ma davanti a quest’infinità di alternative sinceramente ci si sente MOLTO spaesati … e perdere mesi per realizzare che quello che hai imparato non lo sfrutterai (con il rischio di dimenticarlo) un po’ rattrista.


PS Grazie Pabloski, anche se mi sento sempre confuso, se non altro ho depennato C++ e tacitamente anche Java :mc:

pabloski
24-05-2018, 18:52
Magari però esiste un linguaggio che con apposite librerie (perdonate il mio linguaggio da profano) riesca a fare tutto senza lode e senza infamia.


Ed è esattamente questa la questione. Un linguaggio, a meno che non sia particolarmente ostico, si può apprendere dopo poche settimane di studio e utilizzo pratico.

Ma le API, cioè l'insieme delle funzioni esposte dalle librerie di uno specifico ambiente, cambiano da ambiente ad ambiente. Ed è qui che si pone il dilemma.

Ma non una questione di linguaggi, anche se alcuni framework sono nati intorno ad un linguaggio ( JVM è nata intorno a Java, .NET è nato intorno a C#, Qt è nato intorno a C++ e poi è stato integrato ottimamente con Python ), ma è questione di avere delle API che astraggano quelle della piattaforma e quindi siano multipiattaforma ( cross-platform ).

Su questo versante si ragiona di Electron, Qt, Gtk+, JVM, ecc...


Sicuramente è importante avere le idee chiare sul PERCHE’ si voglia imparare o il COSA si voglia realizzare per una scelta ottimale. Ma quando una persona non ha un progetto specifico e soprattutto non ha il tempo per imparare più linguaggi, cerca qualcosa di “semplice” ma allo stesso tempo “completo”.


Ed è giusto che sia così. Imparare a programmare in uno specifico ambiente richiede tempo e fatica. Magari da ragazzini ci si può divertire a provarli tutti, ma quando devi lavorare 10 ore al giorno per portare il pane a casa, la faccenda diventa più complicata.

Per questo le grandi software house e comunità ci vengono incontro. Hai fatto caso che oggi si parla a voce alta di cross-platform? Considera che .NET nacque esclusivamente per Windows, oggi esiste .Net Core ( e Xamarin/Mono ) che gira su un mucchio di piattaforme.

E la scelta può essere anche fatta guardando a dati statistici come questi https://insights.stackoverflow.com/survey/2018/

Come puoi vedere si parla di cosa preferiscono i programmatori dei vari settori, cosa trovano più semplice/completo, quali sono le tecnologie più richieste dall'industria ( alla fin fine se ti dicono che devi programmare in Java, non puoi dirgli che a te piace solo Python ).




Avevo letto che per la creazione di app per Android/iOS la scelta migliore fosse Javascript proprio perchè (come detto da Pabloski) utilizzando delle librerie specifiche si poteva creare un programma multipiattaforma (anzichè creare due programmi distinti).


Si e no. La storia di Javascript su mobile è complicata. Inizialmente si trattava di webapp che giravano in delle webview ( come fa Electron su desktop ). Facevano vomitare in termini di performance, lag a go go. Facebook s'è inventato per questa ragione React Native. Telerik s'è inventata Nativescript.

Google c'ha messo sopra Angular. Insomma si vuole sfruttare l'ampissimo parco di sviluppatori web per realizzare app mobile.

Tuttavia le tecnologie di base sono altre, Java per Android e Cocoa/Objc per iOS.

E poi altra gente s'è buttata sul carro del cross-platform. Qt, Mono/Xamarin, Python con Kivy, Ruby con Rubymotion e Ruboto, Lua con Corona, ecc...

Anche qui c'è l'imbarazzo della scelta. E no, Javascript non è la strada più performante.


Per quanto mi riguarda avrei anche continuato con Python, ma dopo essermi sentito dire che il suo utilizzo non è ottimale per software desktop, nè ad applicazioni per cellulari, nè per soluzioni front-end web


Sul frontend web sono d'accordo, c'è solo Javascript. Ma sono curioso di conoscere le motivazioni di chi ti ha detto che Python non va bene per le applicazioni desktop e mobile.

Se ti fai un giro su Linux, noterai che parecchie applicazioni sono scritte in Pyhton. Chi usa PyGTK, chi usa PyQT, ma sotto c'è Python.


... ma tot’al più per sviluppi scientifici (o per attività lato server)


Anche per quello. E il fatto che abbia letteralmente sfondato in ambito scientifico la dice lunga sulla bontà del linguaggio.

Ed è un linguaggio intorno a cui è stato costruito un'ecosistema di librerie e framework, col quale può competere solo Java.


Senza considerare la mia delusione quando aspettandomi gli array multidimensionali mi sono visto arrivare le liste -_-


E' l'array multidimensionale quello strano. In origine era LISP, il quale usava ( e usa ) le liste per rappresentare ogni genere di struttura dati. Poi vennero i linguaggi a basso livello ( come il C ) e s'inventarono l'array perchè è più vicino al modo in cui la macchina rappresenta gli insiemi di dati.

Considera che a basso livello anche il C rappresenta un'array ( per esempio ) di dimensione 3 come un'array di array di array di dimensione 1.

Insomma ci sono ragioni teoriche del perchè Python non possegga il concetto di array a la C. Tranne in casi molto particolari https://docs.python.org/3/library/array.html

I progetti che hai indicato sono fattibili in Python, ma anche in Javascript volendo ( sulle prestazioni possono esserci problemi per le app mobile e desktop ).

Allo stato attuale Python è il linguaggio che è meglio attrezzato per coprire tutte le tipologie di hardware. Python accoppiato a Qt ti offre uno strumento molto robusto.

Lukai
24-05-2018, 23:44
Allo stato attuale Python è il linguaggio che è meglio attrezzato per coprire tutte le tipologie di hardware. Python accoppiato a Qt ti offre uno strumento molto robusto.

E python sia allora :)
Vedremo se Kivy terrà testa a Xamarin di C# e a Javascrit.

Se qualcuno di voi vuole suggerirmi del materiale altrimenti vedo di procurarmi altri corsi di lynda.com o qualche volume dalle biblioteche comunali. ;)

Grazie veramente di cuore.
Non immaginate quanto possa essere utile qualcuno che vi dica "ascolta un 'cretino' che ci è già passato, e vedrai che mi ringrazierai".
Ai giorni d'oggi la cosa che vale di più è il proprio tempo e un buon consiglio ;)

pabloski
25-05-2018, 10:41
E python sia allora :)
Vedremo se Kivy terrà testa a Xamarin di C# e a Javascrit.


L'unico neo di Kivy è che è pensato per i giochi, quindi implementa relativamente pochi widgets e questi non hanno il look&feel nativo di Android/iOS.

Per alcune applicazioni può essere un problema. Sia mai che l'utente trovi un pulsante che non somiglia a quello "ufficiale". Specialmente gli utenti Mac/iOS in genere chiamano la polizia :D

Nel qual caso c'è la possibilità di usare Qt in accoppiata a Python.

Riguardo Kivy c'è il sito ufficiale con la documentazione https://kivy.org/docs/gettingstarted/intro.html

Riguardo Python c'è il libro indicato da Bellaz89 ma anche un altro fatto molto bene https://learnpythonthehardway.org/

Vorrei ricordare che ancora ci sono in giro due versioni di Python, entrambe diffusissime ( la 2 e la 3 ). Inutile dire che sarebbe preferibile usare la 3.