program5
analisi funzionale del programma sondaggio conoscenze programmatorie listaioli
Donato Taddei su uictech, 18\02\2013, h. 19.35.

Prerequisito:
Aver letto, compreso, e tenere a portata di mano il precedente messaggio dal titolo:
Programmazione: riassunto della presente tornata di messaggi, che perciò viene riportato in coda al 
presente.
Volendo seguire non ci sono scuse.

Nelle conclusioni si era ipotizzato, al fine di focalizzare i concetti, una applicazione pratica 
consistente in un sondaggio per saggiare le conoscenze programmatorie dei listaioli
e si era detto che sarebbe stato quasi immediato, appunto sulla scorta dei punti precedenti, 
definire le voci del questionario.

Questo è un possibile esempio di form:
Campo1:
Indica, separati da virgole, i linguaggi di programmazione che conosci, o lascia in bianco.
Campo2:
Indica gli ambienti di sviluppo che utilizzi, separati da virgole, o lascia in bianco
Campo3:
Indica l'ambiente di sviluppo che hai trovato più accessibile.

Seguono poi una serie di caselle da marcare:
Casella1:
usi linguaggi compilati?
Casella2:
Usi linguaggi interpretati?
Casella3:
programmi a basso livello?
Casella4:
utilizzi linguaggi di alto livello?
Casella5:
Utilizzi linguaggi procedurali?
Casella6:
utilizzi linguaggi orientati agli oggetti?

Nota: i nomi campo1, casella6, ecc. si riferiscono ai campi di editazione e alle caselle in cui chi 
partecipa al sondaggio immetterà i suoi dai.
Allora possiamo dire che i nomi simbolici campo1, campo2 ecc. sono delle variabili che avranno come 
valore quanto immesso dai partecipanti.
Ogni form avrà una variabile campo1, casella4, ecc. ma il suo contenuto sarà diverso per ogni form, 
appunto variabili.

Abbiamo così definito le voci del questionario o, se si preferisce, definito l'oggetto questionario 
e le sue proprietà.
Adesso andremo a definire il prospetto riassuntivo dei dati del sondaggio, cioè il risultato della 
nostra elaborazione, del programma che andremo a scrivere.
In Gergo questa operazione viene chiamata "analisi funzionale", od anche "microanalisi" od ancora 
"specifiche di minutazione" ma può essere anche semplicemente tradotto come "andiamo a vedere cosa 
deve fare questo programma e come".
Cominciamo col dire che, a differenza della form col questionario, le voci del prospetto saranno il 
risultato di specifiche elaborazioni, prodotto quindi del programma che andremo a scrivere.
Allora diremo che le voci del prospetto sono il risultato di funzioni e, a ben sottolineare questo 
concetto, accanto ai nomi simbolici delle singole voci porremo una coppia di parentesi tonde, nelle 
quali mettere appunto tra parentesi singole porzioni del programma.

Il prospetto coi risultati dovrà quindi contenere:

1) - Totale-partecipanti()
Sarà incrementato ad ogni form analizzata
2) - totale-utenti-linguaggi-inpercentuale()
sarà incrementato solo per le schede che non hanno lasciato il campo in bbianco;
ne sarà riportato il dato percentuale rispetto ai partecipanti;
Inoltre si riporterà, per ciascun linguaggio indicato, che abbiamo detto possono essere anche più 
di uno in ciascuna schedda,
nome e la percentuale di utilizzo rispettto al totale di quelli che hanno specificato un linguaggio.

3) - totale-utenti-ambienti-sviluppo()
verrà riportato il totale di quelli che utilizzano un ambiente di sviluppo, in percentuale rispetto 
agli utenti di un linguaggio,
e la distinta per ciascun ambiente con indicazione della percentuale rispetto agli utenti di 
ambienti di sviluppo.

4) - ambiente-sviluppo-accessibile()
Sarà riportato l'ambiene di sviluppo ritenuto più accessibile.

Dobbiamo ora gestire le caselle con le altre voci.
Poichè però tra gli scopi del questionario c'è anche quello di saggiare le conoscenze 
programmatorie dei listaioli,
a differenza del punto precedente sull'ambiente di sviluppo accessibile, che è un dato soggettivo,
qui si tratta di valutare la congruità di quanto affermato nelle caselle con quanto si è dichiarato 
in precedenza.
uno può aver detto di usare il c e poi dichiarare di usare linguaggi orientati agli oggetti,
un altro può aver detto di programmare in perl e averlo marcato come linguaggio a basso livello,
un altro ancora aver dichiarato di conoscere l'assembler ed averlo dichiarato di usare un 
linguaggio orientato agli oggetti.
Dunque il prospetto dovrà evidenziare che percentuale di utenti di linguaggi in realtà dimostra di 
non sapere di cosa sta parlando e quale linguaggio ha per le mani.

Possiamo pensare allora ad una unica funzione.
5) - Verifica-caselle()
che oltre al totale percentuale per ciascuna casella, sempre rispetto al totale utenti di 
linguaggio,
iporti le percentuali per ciascuna casella degli errori grossolani:
esempio: il 60% usa linguaggi compilati anche se il 35% degli utenti ha dichiarato inesattezze al 
iguardo.

Abbiamo finora quindi definito 9 variabili nel questionario e 5 funzioni per generare il prospetto 
riassuntivo.

Ma non è ancora il tempo di cominciare a scrivere codice.
L'obbiettivo, o come anche si dice il "goal" di questo modo di procedere è quello di scrivere la 
minor quantità di codice possibile, o, come pure si dice, di Massimizzare il riutilizzo del codice 
stesso.
Necessita quindi un lavoro di ottimizzazione per fare in modo appunto di scrivere il minor numero 
possibile di righe di codice,
nonchè può essere necessario rivedere il tutto e stabilire per esempio di aggiungere altre voci al 
questionario e altre funzioni per elaborarle.
Questo può essere fatto da chiunque, anche senza conoscere un linguaggio, e infatti, in ambiente 
professionale, potrebbe essere il commitente del programma a chiedere modifiche e aggiunte.
Perciò questo è un esercizio in cui può cimentarsi chiunque, indipendentemente dalla conoscenza di 
un linguaggio di programmazione.

Per fare qualche esempio:
potremmo fare una unica funzione per il calcolo delle varie percentuali, considerato che il 
problema si ripropone in parecchie delle funzioni che abbiamo definito;
Analogamente potremmo definire una funzione che divida per virgola i campi che ammettono più 
linguaggi e più ambienti.
Dovremo inoltre definire una tabella con le caratteristiche di ciascun linguaggio da confrontare 
con quanto inserito nelle caselle dai partecipanti.

Nota:
come detto al nome di ciascuna variabile corrisponderanno valori diversi per ogni scheda; viceversa 
ad ogni nome di funzione corrisponderà sempre lo stesso pezzo di programma che sarà eseguito su 
ciascuna scheda e a cambiare saranno solo i valori delle variabili su cui lavora ciascuna funzione.

Normalmente non opera affatto così chi scrive un programma per diletto:
individua le librerie e le funzioni che fanno al caso della idea che intende realizzare e comincia 
a scrivere codice che spesso è costretto a riscrivere per non aver tenuto conto di tante cose e nel 
riscrivere magari ci infila altri errori logici.
Nella migliore delle ipotesi il programma funzionerà ma quando tra qualche anno il programmatore 
dovrà aggiornare il suo programma, specie se non ha messo molti commenti nel codice, egli stesso 
non ci capirà più una mazza o quasi e farà meglio a riscriverlo da zero, pealtro potendo così 
mettere a frutto l'esperienze nel frattempo maturata.

Per focalizzare quanto detto dunque l'esercizio fondamentale è quello di ottimizzare l'analisi 
funzionale, per poi passare afinalmente a scrivere codice nei diversi linguaggi.
Se infatti tutti quelli che seguono avranno ben chiaro cosa fa il programma e come, sarà perfino 
istruttivo vederne la realizzazione nei diversi linguaggi, per capire come, a parte il formalismo 
che contraddistingue ciascun linguaggio, in questi casi semplici, tutti i linguaggi si equivalgono 
nel senso di poter fare le stesse cose, sia pure con formalismi abbastanza diversi.

Era questo che sottolineava tempo fa Francesco Melis, prima di sparire, sequestrato in qualche 
grotta del supramonte.
Ma non è solo lui ad essere sparito:
è sparito pure chi come Giovanni trovava illuminanti questi messaggi, Angela che ci vedeva più 
chiaro, Odisseo imprigionato a Malta dalla ninfa Calipso, Guido che a quest'ora, dopo aver gettato 
il dado, attraversa il Rubicone, e l'arcangelo Gabriele che detta il suo Corano al profeta.
Loro interventi in merito non sarebbero sgrditi, meno ancora quelli di chi ha in queste cose un po 
di esperienza in più come Andrea Roveretto o Mario Barbuto.

Don

---------------------------------
Messaggio di riferimento

----- Original Message -----
From: Donato Taddei
To: uictech@yahoogroups.com
Sent: Friday, February 15, 2013 8:49 PM
Subject: Programmazione: riassunto della presente tornata di messaggi
Prerequisito: nessuno.
Non è necessario nemmeno aver letto o minimamente compreso i messaggi in merito passati in questo 
ultimo scorcio.
Nei romanzi a puntate il riassunto delle puntate precedenti si fa per quelli che hanno saltato la 
puntata oltre che per quelli che non ricordano.
Il riassunto è di per sè un procedimento di sintesi, dal particolare si risale a concetti generali, 
ciooè si prescinde dai dettagli che ciascuno ha esposto, per astrarre, sintetizzare, generalizzare 
il succo.
Si compie cioè un processo di astrazione o di generalizzazione.
Ma, oltre al riassunto, qui si vogliono anche cominciare ad anticipare alcuni concetti che 
potrebbero essere oggetto di una successiva tornata.
Alcune parole o frasi verranno sottolineate, ribadite, sia con delle ripetizioni, dei sinonimi, sia 
attraverso le virgolette.
1) - "linguaggio di programmazione"
é stato questo uno dei principali "oggetti" del contendere, il linguaggio di programmazione è stato 
oggetto di discettazioni varie.
Bene:
"un" linguaggio di programmazione qualunque, ogni linguaggio di programmazione, dunque tutti i 
linguaggi di programmazione
ha come scopo quello di permettere all'uomo di dare istruzioni al computer.
Tutti i linguaggi di programmazione hanno quindi in comune questo scopo, e quindi possiamo dire che 
un linguaggio di programmazione qualsiasi ha comunque la caratteristica, la "proprietà", di servire 
a fare programmi.
Questa proprietà non è una descrizione, una chiacchiera, si sostanzia nelle azioni che farà poi 
compiere al computer.
2) - l'"ambiente di sviluppo"
"un" ambiente di sviluppo, quindi "ogni" ambiente di sviluppo, vale a dire "tutti" gli ambienti di 
sviluppo hanno come scopo ultimo quello di aiutare il programmatore a scrivere programmi in un 
determinato linguaggio.
Questo scopo viene raggiunto:
A) - attraverso la generazione di codice al posto del programmatore,
b) - il riutilizzo di spezzoni dicodice presente nelle sue librerie sempre per far faticare meno il 
programmatore,
c) - fare una serie di cose di cui normalmente il programmatore medio manco si accorge e non ha 
nemmeno una pallida idea che esistano, figurarsi a farle.
Dunque lo scopo viene raggiunto attraverso parecchie azioni.
Allora possiamo dire che tutti gli ambienti di sviluppo condividono un unico fine che si esplicita 
nelle tre azioni che abbiamo detto.
3) - linguaggi e ambienti
Tutti i linguaggi hanno un proprio ambiente di sviluppo?
No.
Dunque l'ambiente di sviluppo non fa parte delle proprietà comuni a tutti i linguaggi di 
programmazione perchè ci sono pure quelli che non ce l'hanno.
4) - Ambienti di sviluppo accessibili agli orbi.
Solo pochissimi.
Dunque la proprietà accessibilità non è una proprietà comune a tutti gli ambienti di sviluppo ma 
solo a una esigua minoranza di essi, vale a dire agli ambienti di sviluppo accessibili.
5) - Linguaggi compilati e linguaggi interpretati.
Fanno tutti parte dei linguaggi di programmazione ma hanno due modalità alternative e a volte 
concomitanti di funzionamento:
I linguaggi compilati producono alla fine un file exe,
quelli interpretati vengono eseguiti passando il codice come input a un programma specifico che 
provvede ad eseguirlo.
Un programma scritto in un linguaggio compilato avrà un suo codice e il corrispondente file exe 
prodotto dal compilatore.
In un linguaggio interpretato ogni programma avrà il proprio codice ma come eseguibile il programma 
interprete del linguaggio in cui il codice è stato scritto, e sarà sempre quello per qualsiasi 
programma scritto in quel linguaggio.
6) - il livello dei linguaggi di programmazione
Si dicono a "basso livello" quei linguaggi che sono più vicini al funzionamento della macchina;
si dicono ad "alto livello" quei linguaggi che sono invece più vicini al linguaggio e al 
ragionamento umano;
si dicono di "medio livello" quei linguaggi che hanno caratteristiche intermedie tra questi due.
Comunque ogni linguaggio di programmazione ha un suo specifico livello, per cui possiamo dire che 
il livello è una cratteristica comune a tutti i linguaggi, ancorchè assuma differenti valori per i 
tre sottoinsiemi di linguaggi considerati.
7) - linguaggi procedurali e linguaggi ad oggetti
Con buona approssimazione possiamo dire che ricadono nei tre sottoinsiemi di cui al punto 
precedente:
i linguaggi ad oggetti corrispondono all'incirc a quelli di alto livello,
quelli molto procedurali a quelli di basso livello,
e quelli cosiddetti "orientati agli oggetti" al medio livello.
8) _ Pensiamo a una applicazione pratica delle banalità suesposte perchè non stiamo facendo 
filosofia ma parlando appunto di programmazione.
Potremmo per esempio voler fare un programma che elabori un questionario in merito alle preferenze 
e conoscenze programmatorie dei listaioli.
Ovviamente dovremmo prima di tutto definire la scheda con le voci del questionario, ovvero, per 
usare la terminologia fin qui usata, definire l'"oggetto scheda" e le sue proprietà (le voci), 
ovvero definire le proprietà che caratterizzano l'oggetto scheda, cioè che ogni scheda del 
questionario dovrà contenere.
Se qualcuno volesse esercitarsi avrebbe gioco facile: basterebbe riferirsi ai 7 punti precedenti.
Altro paio di maniche invece sarebbe esercitarsi a organizzare il programma che dovrà elaborarle, 
nonostante questo sia u caso estremamente semplice, in quanto ogni voce è indipendente dalle altre.
Se parecchie persone vi si cimentassero il risultato sarebbe quello di ottenere tanti programmi 
diversi quanti fossero quelli che facessero l'esercizio, con relativa babele di approcci, di 
linguaggi, distinguo, funzioni che sembrerebbero tutte uguali, ma in realtà nella pratica molto 
piene di errori che sfuggirebbero a un esame superficiale di chi legge ma che prolungherebbero 
all'infinito la discussione perchè poi ognuno chiederebbe agli altri dove può stare la causa dei 
suoi errori, cioè perchè il suo programma non funziona.
La torre di babele sarebbe notevolmente moltiplicata nel caso più complesso in cui le singole voci 
fossero interdipendenti le une dalle altre, come potrebbe essere il caso in cui, anzicchè voci di 
un questionario, le variabili in gioco dipendessero le une dalle altre come un sistema di equazioni 
o le variabili di una formula fisica.
E allora dovreste migrare in massa perchè non se ne potrebbe più di codici, di if, di loop, di 
costrutti, di parentesi, e relativi dibattiti.
Supponiamo infine che prevalga il buon senso e che quindi prima di lanciarsi in esercizi logici e 
dialettici, si faccia uno sforzo di sintesi e di astrazione, tipo quello che state leggendo e che 
si faccia prima di impelagarsi, non dopo come questo riassunto.
é garantito che la babele sarà molto minore e più breve.
Si potrà allora dire che il problema del questionario ai listaioli è stato affrontato con uno stile 
di programmazione orientato agli oggetti.
Come avete potuto vedere in questo riassunto si è parlato di linguaggi di programmazione senza aver 
avuto bisogno di nominarne neppure uno, e si può continuare senza ricorrere ai costrutti e alla 
grammatica e sintassi di alcun linguaggio per cominciare a sviluppare il programma.
L'esercizio potrebbe essere proprio questo.
Chi legge ed è digiuno di queste cose non conosce alcun linguaggio di programmazione, ma conosce 
l'italiano, la logica e il buon senso, o almeno si spera.
Torna all'indice