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