Il computer non è una macchina intelligente che aiuta le persone stupide, anzi è una macchina stupida che funziona solo nelle mani delle persone intelligenti.

— Umberto Eco

Eclissi in Europa

http://www.stenoweb.it/files/blog/eclipse_0.png Più per curiosità che per esigenze professionali ho fatto recentemente una piccola e superficiale ricerca sullo sviluppo desktop multipiattaforma. Quello che ne esce è sostanzialmente una babele di opinioni contrastanti che sviliscono e aumentano la confusione per chi deve non dico prendere una decisione, ma almeno una direzione verso cui investire il suo tempo.

Naturalmente non sempre è così e le migliori opinioni si leggono su ambienti "neutri": inutile chiedere cose del genere in forum di programmazione dedicati ad un ambiente o ad un altro, la risposta è scontata. Tuttavia una mia personale e per niente autorevole opinione me la sono fatta.

Scrematura

Non me ne vogliano i "fan" di python, ruby e compagnia, ma non è quello che cerco io. Vorrei concentrarmi su qualcosa che abbia un ambiente di sviluppo completo e integrato per un preciso tipo di applicazioni che coprono il 95% delle mie attività di programmatore: applicazioni di tipo gestionale per aziende, che vanno dalla piccola utility che "rimescola" dati e produce report di stampa o che esporta dati verso altri formati, al completo gestionale aziendale.

Quindi mi serve rapidità nel disegno delle interfacce, debugging, ottimo supporto ai database relazionali e strumenti di reportistica integrati. Tutto quello che ha Delphi insomma :) strumento che uso da un bel po' di anni.

Carrozzoni

Inizialmente mi ero fatto l'idea di eliminare gli ambienti che hanno bisogno del "carrozzone" tipo java o .NET ma poi mi sono reso conto che nel 2008 questo atteggiamento è sbagliato.
Avevo posto la mia attenzione su GTK e QT vere librerie multipiattaforma basate su C e C++ ma per il mio target di applicazioni non è forse la strada giusta, anche se vista la superficialità con cui ho "lurkato" su questi frameworks la mia conclusione è sicuramente opinabile.
Sviluppare con QT o GTK impone di portarsi appresso le rispettive librerie, tanto vale dedicare i propri sforzi su Java e portarsi dietro la sua VM. O no ?

Su .NET vorrei dire una cosa: ho simpaticamente letto un commento che affermava che seppure non multipiattaforma (anche se la presenza di MONO lima un po' questo fatto) permette comunque di "coprire" oltre il 90% del mercato desktop. Vero, ma allora mi tengo stretto il mio Delphi :D

Eclipse e Java

Ed eccoci al dunque. Il codice "managed" da una VM presenta indubbi vantaggi: se da una parte .NET pur nella sua validità non mi interessa, la stessa cosa non è più vera per l'altra metà del cielo rappresentata da Java.

Alcuni anni fà avevo messo il naso nella questione, ma avevo rapidamente abbandonato l'idea: lentezza, scarsa integrazione "look an feel" con il desktop, tutte cose che a molti non interessano, ma che per me invece sono importanti. Sapete, ognuno alle sue convinzioni e sbagliate o giuste che siano come tali vanno accettate.

Ora ho "rimesso il naso" in Eclipse e Java e devo dire che sono stati fatti passi ENORMI in avanti. Anzi, forse anche troppi: entrare a "freddo" in questo mondo fa venire il mal di testa tanto è vasto e complesso...
Però c'e' un oceano di documentazione e di blog dedicati all'argomento e il solo ostacolo che si può avere è il tempo da dedicarci.

Probabilmente io non ne avrò mai abbastanza, ma voglio comunque raccorgliere una serie di risorse per chi vuole darci un "occhio". Al momento sono poche e incomplete se avete suggerimenti dite pure.

Per iniziare

Innanzitutto le basi: secondo me meglio imparare java direttamente con/da Eclipse, e allo scopo ho trovato una interessante serie di videotutorial. Sono in inglese ma si seguono con facilità, li trovate qui. Il primo può essere seguito on line, gli altri si possono scaricare.

Interfacce grafiche

Grazie alla potenza delle librerie SWT/JNode possiamo ottenere un "look and feel" integrato molto bene nel SO su cui gira l'applicazione. GTK e Motif per Linux, Windows, MacOSX e pure qualcos'altro.
Per avere una "infarinatura" sulle SWT mi è stato segnalato questo indirizzo che contiene una serie di PDF da leggere per le basi sulle SWT.
Per lo sviluppo "visuale" delle interfacce possiamo tenere in considerazione SWT Designer. Si può iniziare con la versione gratuita, poi, se interessa la versione completa ha un prezzo veramente contenuto. Ringrazio per queste segnalazioni e anche per le prossime NICFury del forum di Archlinux Italia.

Database

Fondamentali per me sono strumenti e librerie SQL per accedere e gestire i database. Meglio se dispongono di un query builder visuale che permette di risparmiare un sacco di tempo. Riporto sempre quanto consigliatomi da NICFury:

Per progetti di una certa dimensione io consiglio vivamente l'utilizzo di un framework di persistenza come Hybernate o Cayenne sono framework che permettono di mappare tabelle di un databse su classi java. Questo permette di non lavorare più con jdbc, query e ResultSet (particolarmente noiosi a mio modo di vedere, inoltre più passibili di errori)ma semplicemente con oggetti java. E' quindi possibile, ad esempio, se si ha la tabella USERS, creare un oggetto User in java, che rappresenta esattamente una riga a db. Saranno utilizzati i relativi metodi getter (getName, getAddress, ecc.) e setter per leggere o impostare i dati sulla riga del database. All'inizio se non si ha mai lavorato in questa maniera l'approcio è un po' macchino, ma garantisco che una volta abituiati permette una pulizia nel codice assolutamente irraggiungibile in altre maniere. Inoltre è possibile creare query dinamicamente dal codice java, senza mai scrivere una riga di SQL, stupendo.

Aggiungo io che questo è il comportamento predefinito di Delphi (anzi, non conosco nessun altro metodo per interfacciarmi con un database con esso), ed è di una comodità pazzesca. Quindi fondamentale prendere confidenza con queste librerie.

MVC (Model View Controller)

Il concetto di MVC io personalmente l'ho visto applicato solo sui CMS (tipo Drupal e Joomla per capirci) ma evidentemente questo è un mio limite ed è un peccato non applicarlo anche allo sviluppo in genere. Per questo riporto sempre quanto consigliatomi:

Creazione di applicazioni MVC (Model View Controller) web o non web: a mio parere inoltre, è comodissimo utilizzare framework che permettano la semplificazione della struttura delle applicazioni. Personalmente ritengo Spring il re indiscusso di questi framework in java. E' possibile gestire praticamente tutto in maniera pulita e semplice (una volta imparato ad usare lo strumento). Ed è possibile fare questo creando applicazioni scalabili, gestibili e usabili (dal punto di vista dello sviluppatore). Spring ha una serie infinita di moduli che permettono già di craere la struttura base per una valanga di cose diverse: applicazioni web, client, interazione con il database, ecc. Inoltre si integra alla perfezione con moltissimi framework di persistenza (vedi sopra), essendo già preconfigurato per gestirne le transazioni a db.

Stampa e reporting

Qui server qualcosa tipo ReportBuilder o Crystal report che gli sviluppatori in ambiente Windows ben conoscono. Il mio spudorato copia incolla prosegue :

Personalmente per quanto riguarda la reportistica con Java (al lavoro) utilizzo JasperReport e il relativo editor visuale iReport. Mi trovo molto bene, anche se devo dire di non aver mai provato altre soluzioni, quindi non posso fare confronti diretti. Ho iniziato con Jasper e, essendomi trovato bene, non mi sono mosso da lì. Jasper permette la creazione al volo tramite java di report di qualsiasi tipo (pdf, excel, ecc...). E sufficiente creare il report con iReport (molto molto comodo da usare), dopodichè si crea una Map java con tutti i parametri necessari che viene passata al report, et voilà, il gioco è fatto.

Grazie infinite per le dritte, veramente preziose per me, purtoppo qui c'e' lavoro per un anno, non ce la farò mai a trovare il tempo :D

Se avete tempo e voglia sono ben felice di accettare altri vostri suggerimenti, nel frattempo ... buon lavoro !