Sviluppo programmi di grandi dimensioni

di il
6 risposte

Sviluppo programmi di grandi dimensioni

Buongiorno a tutti. Penso che questo post sarà un pò lungo, quindi per facilitarne la lettura e comprensione, faccio una premessa.

Da diversi anni studio programmazione, nei ritagli di tempo. Poi sono riuscito ad organizzarmi meglio ed ho inizato a studiare tutto il programma previsto negli esami univeristari in informatica. Al momento, le mie conoscenze sono da secondo anno di informatica (fine corso). Nella pratica, sono iscritto al primi anno di informatica, pur essendo avanti con la preparazione. Per confermare la mia preparazione da autodidatta, ho deciso di dare tutti gli esami previsti, in una sessione, ottenendo il massimo voto in ognuno (programmazione, architettura dei calcolatori, analis1/2). Posso ritenermi soddisfatto di questo. Questo mi motiva a continuare così. Vengo ora al problema centrale: la programmazione. Come detto prima, "programmo" da diversi anni, dove per programmo intendo studio a menadito un linguaggio di programmmazione con relativa libreiria standard( finora c, c++, c#) e svolgo degli esercizi del tipo: algoritmi (implementazione di già esistenti oppure quelli che si trovano nella challenge di programmazione), esercizi proposti dai libri da cui studio, per verificare le conoscenze aquisite da ogni capitolo del libro. Quindi, per intenderci, saprei spiegare benissimo le regole di gni linguaggio che ho studiato, fare dei semplici esempi, ma...Ma non quello a cui miro veramente, ovvero la scrittura di un grosso progetto.

Questo problema in realtà è indipendente dal linguaggio, sono sicuro che qulcuno dirà che mi sono messo a studiare i lunguaggi più complessi esistenti che sono riservati a un'elitè di esperti ecc..., ma d'altronde, questo non è un passatempo, ma un investimento, che un giorno dovrà portarmi ad un serio lavoro (è così che si diventa esperti in qualsiasi attività umana). Vengo al dunque del problema: supponiamo io voglia realizzare un "grosso softaware", ridimensionato al mio ambito didattico; per esempio, se volessi realizzare un photoshop, che magari contine 1 milione di righe di codice, il mio photoshop ne avrà 3 mila. Al di là della conoscenza teorica richiesta per lo studio degli algoritmi di image processing, il problema sta nell'organizzazione del porprio programma. Supponiam io sappia tutt ciò che serve per realizzare un software del genere. Il problema è: come lo faccio? Per esempio se dovessi relizzarlo in c, sarebbe più semplice perchè ogni implementerei delle funzioni che fanno tutto ciò che serve, e una semplice interfaccia grafica. Diciamo lo 0.001% di ciò che è Gimp. Il problema grosso si presenta se volessi lavorare in c++. Questo perchè non saprei come organizzare il programma in classi e quindi oggetti, gerarchie di ereditarietà, quali sono le funzioni che dovranno essere ridefinite in calssi diverse, quindi il meccanismo del polimorfismo, quali classi devono scambiarsi informazioni ecc... Sinceramente, non avendolo mai fatto, non so elencare tutte le difficoltà che avrei. IL fatto che io sappia la sintassi e le regole del c++ ( o qualsiasi linguaggio OOP), che io sappia tutti gli algoritmi necessari, non mi premette di craere un prgramma del genere, seppure ridotto. Tra l'aver fatto svolto piccoli esercizi di OOP mirati a qualcosa di particolare e il saper organizzare un software su una cooperazione tra classi, metodi ecc.. c'è un divario. La prima domanda che vi faccio è: come colmare tale divario? Seconda domanda: come progettare un programma ( si intende sempre piccolo 2-3mila righe), ovvero craere dei "blocchi" di codice che cooperin tra di loro, che possano essere realizati indipendentemento l'uno dall'altro e che abbiano questa proprietà: se un "blocco" contiene un errore, questo non si propaghi negli altri "blocchi" quando quesi interagiscono con quello "difettoso" e sopratutto, se il programmatore si accorge di tale errore e lo risolve, questo non ne generi involontariamente in un altro blocco(per questo ho richiesto prima l'indipendenza).

Vi ringrazio per la pazienza nel leggerlo (anche se non è tanto scorrevole) e nell'aiutarmi.

6 Risposte

  • Re: Sviluppo programmi di grandi dimensioni

    Devi conoscere bene i principi oop ed inoltre leggere libri su clean code , design pattern ed ingegneria del software , ed abituarti a testare il tuo codice se non addirittura a partire dai test (TDD , https://it.wikipedia.org/wiki/Test_driven_developmen) , secondo me è utile anche UML almeno i diagrammi di classi
  • Re: Sviluppo programmi di grandi dimensioni

    @surfnet ha toccato gli argomenti spiccioli, MA, fondamentalmente, devi fare i seguenti passi:

    A) suddivisione del programma in MODULI indipendenti. Nel caso di un'applicazione stile gimp, potrebbero essere:

    0) il tuo oggetto FONDAMENTALE e' l'immagine in memoria come 3 matrici distinte RxC, una per il rosso, una per il verde, una per il blu

    1) modulo di lettura/scrittura: devi leggere qualunque formato e convertirlo in un'immagine in memoria, devi salvare l'immagine in memoria in uno degli infiniti formati possibili (PNJ, JPG, TIFF, BMP, GIF, ...)

    2) modulo di modifica dell'immaginie, che potresti suddiviere in sottomoduli: uno per la modifica mediante ''pennello"" ed uno per l'applicazione di ""filtri""

    3) interfaccia utente: che integra in modo coerente tutto il resto

    B) per ogni modulo, devi definire le ""interfacce"" degli oggetti che lo compongono, e le funzionalia' ad alto livello

    C) implementazione dei singoli moduli

    Per i punti A,B,C si usano i concetti di ingegneria del software e ci si aiuta con una serie di diagrammi UML

    Nell'implementazione dei singoli moduli (punto C) entrano in gioco OOP, design patterns, ..., e altri diagrammi UML

    Tutta questa organizzazione e' indipendente dal linguaggio di programmazione.

    Per quanto riguarda i l inguaggio di programmazione, NON E' questione di elite, MA di ambito di utilizzo.
    Ogni linguaggio ha il suo ambito specifico.
    Conoscere il linguaggio vuol dire poter accedere a lavori in quell'ambito.

    Anche la realizzazione non e' detto venga fatta partendo dall'interfaccia utente.
    Anzi, in generale la UI e' l'ultima pare ad essere implementata, proprio perche' l'applicazione NON E' la UI, MA l'elaborazione dell'immagine, e la UI serve SOLO per organizzare le funzionalita' in modo ""visuale""

    SOLO i programmatori INESPERTI partono dalla UI.

    Comunque, un programma complesso NON VIENE realizzato in un'unica volta.

    Si realizza la versione 1, con la quale si mettono a fuoco i componenti principali e l'organizzazione generale, anche se un'idea di massima la si deve gia' avere.
    Poi si passa alla versione 2, dove si ribalta il 75% del codice
    Quindi alla version 3, dove si corregge il 50%
    Alla versione 4 si arriva a ritoccare il 25%
    Dalla versione 5 in puoi si inizia ad avere un programma con una struttura ragionevole, ben organizzata,, facilmente mantenibile ed aggiornabile.

    Insomma: non e' solo questione di competenze, MA anche, e sopprattutto, di ""ordine"".
  • Re: Sviluppo programmi di grandi dimensioni

    Grazie a entrambi per le risposte. Il mio progetto per i prossimi 8 mesi è appunto quello di studiare ciò che riguarda l'ingegneria del software, qiuindi pattern design, rappresentazioni in uml e tutti i libri rlativi alle best practice, agile development, clean code ecc, per il c++ i libri della serie exceptioal, effective, modern programming ecc... La mia domanda era giusto per avere un'idea generale del tutto. Ciò a cui applicherò questo, lo studierò nei corsi della magistrale, vorrei focalizzarmi su questi settori: compuer graphics, machine learning, image processing, crittografia. Per applicare strada facendo ciò che studierò e sopratutto mettere in praticala programmazione OOP col c++, ho in mente di realizzare un piccolo motore fisico. MI appoggerò su uno di tanti libri in commercio a riguardo, e avendo già solide basi nella materia e nell'analisi numerica, porterò avanti tale progetto. Mi è subito sorta una domanda che vi pongo: supponiamo io abbia realizzato tutta la logica dietro le simulazioni fisiche (gravità, collisioni, rotazioni ecc.), ma non dispongo della parte grafica che permette di reallizare degli oggetti visuali (cerchi, quadrati ecc.) a cui sono applicate le "leggi fisiche codificate". E' possibile relizzare ciò e in seguito, una sorta di sistema che permetta di "appiccicare" la parte grafica alla parte fisica, senza dover "fondere" le cose tra loro, ciò realizzare due cose a parte e poi metterle in "comunicazione"?
  • Re: Sviluppo programmi di grandi dimensioni

    'ciò realizzare due cose a parte e poi metterle in "comunicazione"? ' , direi che è possibile e forse consigliabile..
  • Re: Sviluppo programmi di grandi dimensioni

    Prova a farlo tu. Scegliti un gioco semplice, tipo asteroids, e ti fai prima la parte fisica e poi disegni gli oggetti a video
  • Re: Sviluppo programmi di grandi dimensioni

    Ottima idea!
Devi accedere o registrarti per scrivere nel forum
6 risposte