Newsgroup: it.comp.programmare
Titolo: Aspirante programmatore cerca consigli

Buona sera a tutti,
Dopo numerosi ripensamenti e perplessita' sono giunto alla conclusione
che forse e' meglio chiedere parere agli esperti che hanno
probabilmente gia' dovuto affrontare per conto loro un problema come
il mio.
Una breve presentazione prima: Sono un ragazzo di 20 anni e da quando
ne ho 12 mi dedico attivamente alla programmazione. Ho iniziato con
HTML, javascript, Basic e Visual Basic mentre ultimamente mi sto
dedicando a Php, Python e C. Mi sono procurato Ubuntu  per muovere i
miei primi passi nel mondo di Linux e sinceramente penso che
l'informatica sia la mia strada...
Di recente mi sono occupato di gestire la programmazione server-side
del sito del mio liceo e questo ha notevolmente sorpreso il mio
professore di matematica che conosceva soltanto la mia totale
incapacita' nella sua disciplina. Infatti, nonostante le profonde
affinita' che intercorrono tra materie come informatica, fisica e
matematica, io sono molto carente nelle ultime due. Probabilmente
perche' non mi sono mai interessato in quegli ambiti. O semplicemente
perche' non sono portato. Resta il fatto che mi dedico con molta
passione alla programmazione e mi piacerebbe trovare un'occupazione
che abbia a che fare con questo mio interesse.
Per farla breve, il mio problema e' che non saprei cosa scegliere
all'Universita'. Sono di Roma e sono stato attirato a prima vista dal
corso di laurea in Informatica che si tiene alla Sapienza, il quale a
giudicare dagli esami sembra meno pesante rispetto a quello di
Ingengeria Informatica. Ho parlato anche con ragazzi che frequentano
queste facolta' e mi e' stato detto piu' volte che l'informatica
affrontata in questi luoghi e' quasi essenzialmente a livello teorico,
quando a me interessa proprio l'opposto.
In sostanza, non vorrei rischiare di impelagarmi in qualche facolta'
per poi finire fuori corso al primo anno. Ho sentito da amici che
esistono anche corsi intensivi specializzati che oltre fornire
un'adeguata preparazione pratica conferiscano anche attestati
significativi per il mondo del lavoro.
Insomma non c'e' nessuno tra voi che non abbia il pallino della
matematica e sappia come aiutarmi? ;) (Poi a dirla tutta non e' che
non mi piaccia la matematica, trovo noiosa l'analisi e gran parte
della geometria analitica, ma mi attira la logica, la combinatoria e
l'insiemistica)
Scusate per il messaggio un tantino atipico per un newsgroup ma spero
di ricevere informazioni interessanti che mi permettano di riflettere
con piu' lucidita' sul problema.
Ringrazio in anticipo per l'aiuto.
-Marco

 significativi per il mondo del lavoro.
NESSUNA FACOLTA' universitaria di nessun tipo metterà mai corsi che 
insegnino la programmazione in pratica. La programmazione in sè e per sè 
è una skill di basso livello, come fare l'elettricista o il meccanico. 
Molto più importanti sono gli analisti software e i modellisti OOP, ed è 
QUESTO, cioè l'analisi e l'OOP che l'università ti insegnerà. Ma anche 
queste sono skill bassine, che vanno integrate con l'ingegneria del 
software per gestire il ciclo di vita di un programma e la gestione 
risorse umane per far lavorare i team. E naturalmente non puoi ignorare 
i database, non puoi non sapere nulla di reti, devi conoscere i sistemi 
operativi, devi conoscere la multiprogrammazione e i vari paradigmi di 
linguaggi... ma NON ti insegneranno MAI a farlo in pratica: dovrai farlo 
da solo, per conto tuo.
In definitiva chiederti qual'è la laurea che ti insegna a programmare è 
una domanda del caXXo. Chiediti invece quale facoltà ti  insegnerà a far 
fruttare meglio l'abilità di programmazione che già hai e che acquisirai 
DA SOLO in futuro... e in generale cerca di puntare più alto che puoi, 
che a scendere scendi quando vuoi ma a salire è dura... non limitarti a 
dire "voglio fare il programmatore".

 è una skill di basso livello, come fare l'elettricista o il meccanico. 
Questo e' quello che vogliono far credere quelli che non sanno 
programmare o a cui non piace programmare e vogliono fare altro.
Col risultato che a scrivere codice ci finiscono quelli che non sono 
capaci, con le conseguenze che il codice che scrivono fa schifo!
Codice non ottimizzato, ridondante a suon di copia/incolla, procedure 
non combacianti, tipi di dati assurdi, gestione degli errori inesistente...
E cosi' i progetti, per rispettare i tempi, rilasciano programmi 
approssimativi, tanto poi si va in riciclo, e chissenefrega se i tempi 
di riciclo sono 10 volte i tempi di sviluppo (senza contare che spesso e 
volentieri chi fa il riciclo non ha fatto lo sviluppo e quindi perde 
meta' del tempo a capire che diavolo fa il programma, e mentre cerca di 
capire, trova errori che non si sono ancora manifestati in esecuzione...).

 programmare o a cui non piace programmare e vogliono fare altro.
Questo è vero. Ma quando uno progetta il proprio futuro gli conviene - e 
molto - tenere conto anche di COME le sue abilità verranno valutate 
dagli altri. E l'abilità di un programmatore, purtroppo, non è valutata 
granchè... apposta il consiglio che gli do è di puntare a fare altro e 
di tenersi la sua capacità di programmazione come "arma segreta".
Per spiegarmi: il professore di matematica l'ha lodato perchè se la 
cavava bene a programmare: ma se fosse stato un professionista, quello 
stesso professore avrebbe cominciato a lamentarsi che questo non va 
bene, quello si poteva fare così e cosà... per cui ripeto: studia 
"altro", più redditizio, e continua a programmare per conto tuo.

programmare o a cui non piace programmare e vogliono fare altro.
Io non so se programmare sia un'abilità di basso o di alto livello, ma so
che programmazione, analisi e progettazione sono competenze completamente
diverse.
E mentre si può pensare di costruirsi in certa misura come programmatori
attraverso un percorso da autodidatta (certo, oggi molto meno che dieci o
vent'anni fa, ma chi è portato ed è disposto a studiare penso possa far
molto), analisi e progettazione richiedono un percorso didattico molto più
strutturato, che è pressoché impossibile darsi da soli.
Che poi sia necessario preoccuparsi seriamente della preparazione di buoni
programmatori (così come, immagino, di buoni elettricisti e di buoni
meccanici) è altra cosa.
Ciao.

 strutturato, che è pressoché impossibile darsi da soli.
Sicuramente le cose saranno cambiate ma non penso in peggio: per chi
e' interessato ci sono molti manuali e riviste specializzate e davvero
tanti codici open source in cui sbirciare...
Comunque mi sono convinto ad iscrivermi ad Informatica, grazie ancora
per l'interessamento.

 tanti codici open source in cui sbirciare...
In linea teorica forse. Il problema è  che un programmatore *bravo* non è 
un praticone. E' qualcuno che sa quello che sta facendo e perchè lo sta 
facendo.
E' difficile imparare a fare cose complesse 'by example'. Gli esempi sono 
utili, ma per i *dettagli* (imparare questo o quel framework, per dire).
Poi anche li bisogna vedere cosa vuoi fare. Vuoi programmare gestionali? 
Oppure magari vuoi programmare l'ottimizzatore di un compilatore oppure 
un filesystem? O ancora scrivere un database server?
C'è il programmatore improvvisato che sa tre scemate di SQL (ma per 
esempio non conosce la teoria dietro il modello relazionale), il 
linguaggetto diffuso (al momento PHP) e fa un po' di bricolage fra esempi 
del manualetto e robetta in rete. E butta fuori cagate mostruose.
Tra l'altro quando suddetti programmatori si uniscono e fanno progetti 
leggermente grossi, vengono fuori carrozzoni terribili.
Per salire di livello ci vogliono anche altre conoscenze. Molte delle 
quali è difficile apprendere in modo ordinato al di fuori di un corso di 
studio appropriato oppure *molti* anni di esperienza e costanza.
Sfortunatamente l'astrazione matematica (che *non* vuole dire analisi e 
geometria, per dire) è utile in molti dei casi di cui sopra. 
Poi io dovrei tacere: dopo tutto a breve mi laureo precisamente in 
matematica. Trovo carina geometria (ma in effetti la geometria che si fa 
a matematica è ben diversa dalle noiose banalità del liceo) e tollero 
analisi. Invece la parte della matematica che più mi interessa è 
precisamente Logica (e non dire 'insiemistica', Teoria degli Insiemi 
funziona meglio[0]). E nonostante la mia formazione universitaria abbia 
contribuito in modo relativamente limitato alle mie skill informatiche, 
ha esercitato in modo positivo le mie capacità cognitive (oltre che 
costringermi nei primi anni a fare alcune cose noiosette che poi si 
rivelano fondamentali).
Ora io non ti consiglio di fare Matematica: è una strada *molto* dura, 
anche perchè devi fare cose che non ti interessano direttamente (anzi, 
nel tuo caso ti fanno pure schifo) *e* devi studiare determinate cose per 
conto tuo.
Ora qualunque cosa tu scelga (per esempio Informatica) *dovrai* studiare 
molte cose per conto tuo. L'università ti da le basi, non ti porta on the 
edge.
Ci vuole e l'uno e l'altro. 
-----
[0] tieni anche presente che Teoria degli Insiemi è notevolmente formale 
come cosa e non è detto che se ti hanno divertito i giochini ingenui che 
si fanno alle superiori (la teoria che viene vista al liceo è nota 
appunto come teoria *ingenua* degli insiemi, proprio perchè non 
formalizzata) ti diverta pure quella.
-- 
-rik0

 conto tuo.
Si, dalle risposte che ho ricevuto mi pare di capire che il modo
migliore sia fare l'universita'( quindi studiare teoricamente) e
continuare con i miei programmi-esercizi (quindi rendere pratico il
mio studio).
Comunque non mi ha mai fatto "schifo" la Matematica, e' solo che il
suo linguaggio spesso mi e' oscuro e a volte mi pare poco concreto.
Per fare un esempio: Trovo poco pratica l'equazione canonica di una
circonferenza che non saprei come usare se volessi fare un algoritmo
per disengare circonferenze. Mentre allo stesso scopo trovo molto piu'
buona l'equazione parametrica che definisce in modo chiaro le
coordinate. Quest'ultima e' molto piu' "pratica" puo' facilmente
trascriversi con un qualsiasi linguaggio di programmazione.
Ma forse e' meglio non inserirmi in questo genere di tematiche, data
la mia crassa ignoranza matematica. :)

Baffetto ha scritto:


I corsi di laurea in materie informatiche e ingegneristiche sono ricchi 
di matematica astratta, principalmente analisi e geometria analitica. 
Tali studi servono a formare una base culturale matematica e a risolvere 
alcuni problemi che si incontrano nell'attivita' di programmatore.
Dato che non sei ne' portato ne' interessato ne' istruito in matematica, 
ti consiglio di non iscriverti a corsi di laurea in materie 
informatiche. Se sei appassionato di programmazione, l'informatica ti 
puo' dare molte occasioni di lavoro discretamente retribuito e molte 
possibilita' di soddisfazione personale senza aver bisogno di una 
laurea. Per diventare un bravo programmatore nella maggior parte dei 
settori applicativi e' sufficiente avere un diploma di perito 
industriale o conoscenze equivalenti. Dato che hai frequentato un liceo, 
ti consiglio di iscriverti a un corso teorico/pratico di 
specializzazione biennale in sviluppo del software. Tali corsi sono 
orientati a specifici ambiti applicativi, per cui dovresti prima 
scegliere il settore di interesse. I principali settori sono: 
automazione industriale, amministrazione aziendale, Web.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 trascriversi con un qualsiasi linguaggio di programmazione.
Hai scelto un problema che viene risolto meglio in una delle due forme.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.

On 27 Lug, 00:04, 
r...@despammed.com
 (Enrico 'Mc Osten' Franchi)
wrote:

Si scusami, quello che intendevo dire e' che il mio voler fare un po
tutto da solo mi spinge pochissime volte a leggere negli altrui codici
e in caso a copiarne le idee.
Quando dicevo che non facevo un copia incolla ma tentavo di elaborare
il contenuto e comprenderlo intendevo proprio che non copio funzioni o
routine, al massimo guardo dentro e cerco di riprodurre nel mio codice
un'idea simile a quella usata nell'altro.
E' vero il riuso e' complesso, sopratutto con programmi complessi, ma
con linguaggi come python per esempio e facile dividere interi listati
in moduli e poi riutilizzare moduli per altri programmi. Per esempio
una volta, solo per vedere come funzionava, ho copiato il module
htmltextview.py dai codici di emesene (un clone di msn opensource in
python) e l'ho applicato ad un mio programma. Il modulo che ho citato
in pratica crea una textview "potenziata" capace di leggere qualche
tag di xhtml, caricare immagini e formattare il testo. Questo modulo
serviva per la finestra della chat per scrivere messaggi con emoticon
e testo formattato, ma poteva benissimo applicarsi ad un altro mio
progetto in cui serviva un "viewer" di testo formattato. Dopo che ho
capito a fando quel codice(quando l'ho importato non l'avevo letto
granche') ne ho ricreato uno specifico per il mio programma ed e'
proprio questo che intendo.
Comunque ho creato al volo il codice per quella circonferenza... il
codice l'ho scritto in un compilatore di freebasic(e' molto simile al
quick basic per sintassi)
screen_width = 1024
screen_height = 768
screen_resolution = 16 'bit
ScreenRes screen_width, screen_height, screen_resolution
r = screen_width / 4
x0 = screen_width / 2
y0 = screen_height / 2
for t  = 0 to r^2
x = x0 + r * cos(t)
y = y0 + r * sin(t)
pset(x, y), rgb(255, 255, 255)
next t
f$ = input(1)  ' aspetta un carattere dalla tastiera
end
Penso sia abbastanza leggibile anche per chi non conosce il basic.
[Probabilmente rimarrai disgustato dal r^2, lo so... E' solo che mi
veniva un cerchio impreciso, e ho pensato che dovevo aumentare i
punti, cosi' ho reso piu' corposo il for aumentando i cicli fino a
r^2, pensando che il numero di punti e' in funzione del raggio]
Come vedi ho semplicemente utilizzato la formula parametrica e in
questo caso e' ottimale.
Grazie ancora per le info (avevo sentito che si potevano usare le
primitive di X, ma se sono quelle del programma xeyes e xterm sono
decisamente orribili :D)

 decisamente orribili :D)
Non è che sono 'orribili' sono di bassissimo livello. Le altre sono
costruite su quelle.


 geometria 'astratta' possa rendere il tuo codice molto più performante.
Non conosco le matrici comunque quindi non ho capito il motivo del
perche' la rotazione puo' tradursi in quel modo.
Comunque ho capito la lezione: Conoscere la matematica puo' essere
molto utile per risolvere problemi informatici...
A proposito, posso chiederti un tuo parere "matematico" per un altro
codice che ho fatto "a intuito"?
Mi piacerebbe sapere se c'e' un modo piu' veloce e meno "intrecciato"
per ottenere lo stesso effetto:
import cairo, gtk
from math import pi
width, height = 1280, 1024
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
cr = cairo.Context(surface)
cr.set_source_rgb(1, 1, 1)
cr.rectangle(0, 0, width, height)
cr.fill()
cr.set_source_rgb(0.0, 0.8, 0.0)
x, y, k = width/2, height/2, 10
dx, dk  = x, k
j = 1
for i in range(80):
	cr.arc(dx, y, dk, 0, pi)
	dx, dk = x+k, k*2*j
	j = j + 1
	cr.arc(dx, y, dk, pi, pi*2)
	dx, dk = x-k, k*2*j
	j = j + 1
cr.scale(4, 4)
cr.stroke()
surface.write_to_png("spirale.png")

 per ottenere lo stesso effetto:
Suppongo che quello che tu volevi ottenere fosse una spirale. 
Ma quella che tu ottieni *assomiglia* a una spirale, ma non è una spirale.
Tu stai componendo frammenti di circoferenza in modo da costruire una 
cosa che assomiglia ad una spirale.
In coordinate polari, una spirale è una curva di equazioni (con a e b 
qualsiasi)
r = a + b * theta
Il modo per 'immaginare' una spirale è questa. Immagina un punto che ha 
velocità costante, vincolato a muoversi su una retta che gira con 
velocità angolare fissata.
Oppure vedila così: prendi un'asta abbastanza lunga e immagina il tutto 
senza attrito. Infila un anello sull'asta e fai girare abbastanza 
velocemente l'asta, tenendola per un estremo. La traiettoria descritta 
dall'anello è una spirale (questo ti dovrebbe chiarificare cosa intendevo 
con il precedente paragrafo).
Le coordinate piane sono legate a quelle curvilinee dalla seguente 
relazione (invertibile quasi ovunque).
x = r * cos theta
y = r * sin theta
Con pochi semplici conti trovi che 
r^2 = x^2 + y^2
ovvero r = sqrt(x^2 + y^2)
Scoprire theta è leggermente più complicato.
y/x = tan theta
da cui
theta = arctan (y/x)
Come ti avevo annunciato la trasformazione è invertibile quasi ovunque.
Infatti non puoi notare che l'asse delle x da qualche piccolo problema :)
Ad ogni modo ci sono vari modi per schivare il problema e non ce ne 
preoccuperemo.
Ad ogni modo vediamo benissimo che questa strada di fare i conti è 
maledettamente inefficiente.
In Logo per esempio una 'spirale' (una cosa che ci assomiglia, non ho 
fatto le verifiche matematiche) si fa così
to spiral :size
   if  :size > 30 [stop] ; an exit condition
   fd :size rt 15        ; many lines of action
   spiral :size *1.02    ; the tailend recursive call
end 
La procedura è ricorsiva. fd 'va avanti' (disegnando) dell'argomento.
rt gira a destra (right turn) dell'angolo in gradi specificato.
La cosa puoi banalmente tradurla per non usare ricorsione.
Nota che ancora una volta avendo l'angolo 'fisso', se vuoi calcolare il 
tutto esplicitamente, basta che seni e coseni li calcoli una volta sola.
Mi spiego meglio: tu aggiungi un segmentino alla volta. Ad ogni passo il 
segmentino in questione si 'allunga' *e* il secondo vertice ha una 
rotazione di 15 gradi rispetto al segmento precedente. 
Oppure vogliamo parlare della spirale logaritmica?
In natura è molto più diffusa e c'è un sistema molto carino e divertente 
di approssimarla. Trovi tracce di questo sulla pagina us di wikipedia.
-- 
-rik0