Indeciso su cosa concentrare la mia futura carriera

Pubblicità
Web design va a utilizzare html, css, js e frameworks derivati per far sì che la pagina web sia bella. In questo lavoro si usa più la creatività che la logica, visto che perlopiù si usano linguaggi di markup che non hanno un logica di esecuzione, mostrano tutto insieme contemporaneamente. Web development invece si concentra sul processare dati e gestire il funzionamento interno del sito, creando veri e propri algoritmi seguendo quindi una logica
 
No, il web designer tende a progettare siti web statici o con pochi elementi.
Il webdevelopment fa applicativi web (gestionali etc etc)
Ogni tanto capita che qualche web designer faccia qualche custom css per i web devs
 
Già che parti col pensare di studiare giochi sbagli. Pensa a studiare i concetti base con codice a livello basso
Ovviamente si, occorre prima di tutto imparare le tecniche di programmazione, e fare gli esercizi allegati. Però poi i libri di testo si fermano lì, gli esercizi sono quello che sono, esercizi, poche decine di linee di codice, la vita reale poi è diversa, un applicativo non ha semplicemente un ciclo o due, per implementarlo bisognerà applicare molti dei concetti che si sono imparati. GitHub è un paradiso di esempi di codice, devo dire che la maggior parte è scritta bene. Io suggerisco di non guardare solo un progetto, ma almeno una dozzina, fare i confronti, vedere come sono progettati e strutturati. Leggere le critiche degli utenti. Quando ho parlato di video giochi non intendevo certo prodotti da tripla A, pensavo piuttosto a cose semplici tipo Tetris. Proprio Tetris per anni è stato il mio campo di battaglia per imparare un linguaggio, leggevo la documentazione e poi come primo programma scrivevo una versione di Tetris. Poi scoprii che non fossi l’unico.

Come si fa a dire che un codice è scritto bene? Bella domanda. Il già citato Robert Martin cercò di dare una definizione formale, non entro nei dettagli ma una condizione necessaria (non sufficiente) è che qualunque persona possa capirlo e modificarlo senza dovere grattarsi la testa. Quindi, se il codice risulta incomprensibile, meglio lasciare perdere e passare ad altro.

Abbiamo citato il kernel di Linux, che è un ottimo esempio di codice ben strutturato. Basta aprire un modulo per innamorarsi subito. Si legge senza bisogno di commenti, leggi una procedura e capisci subito cosa faccia. Ma applicativi correlati a sistemi operativi sono casi molto particolari, difficile che uno agli inizi sia capace di comprendere tutto, compilarli, farli girare, modificarli e testarli. Per chi è all’inizio occorre guardare applicativi semplici e contenuti (ecco perché ho citato Tetris) che si possano poi usare da noi stessi. Cercare qualcosa a cui si sia interessati, io per esempio sono un appassionato di musica e guardo software che viene usato in quel settore, anche un semplice music player.

Quando io iniziai internet non esisteva, quindi non esisteva nemmeno GitHub, c’era pochissimo software a disposizione e quello gratuito era messo a disposizione per scaricarlo su server universitari, e veniva citato sui newsgroup (chi se li ricorda?) Io scaricavo tutto quello che trovavo, alla sera finito il lavoro, mi studiavo un modulo per giorno (nel mio caso, per notte). Per esempio se volevo imparare a usare la comunicazione tra processi cercavo programmi che usassero dup(), exec() e socket() (quasi tutto in quei tempi era scritto in C) per il sistema operativo che usavo.
 
Un codice solitamente è scritto bene quando x ottenere un result applichi poche righe di codice, faccio l'esempio piu stupido che fece il mio prof all'università.

Dato il numero 25 in output come lo ottieni?

Java:
Int number = 5*5;

Int number = 20 + 5;

Int number = 10 + 15;

Int number = 1 + 2 + 3 + n (ti porta a 25)

e cosi via,
ci disse quello che ci mette meno tempo e meno righe x ottenere il result è il codice migliore in assoluto
 
e cosi via,
ci disse quello che ci mette meno tempo e meno righe x ottenere il result è il codice migliore in assoluto
s-no.

Meno righe o piu veloce sono missioni differenti.

Almeno per i linguaggi compilati e non interpretati, se ti serve ottimizzare per prestazioni in alcuni casi si scrivono molte piu righe per ottenere un risultato piu efficiente. Se invece hai esigenze di size, allora meno codice possibile anche a scapito delle prestazioni.

Non c'e' un miglior codice "in assoluto", perche' meno righe e piu veloce magari per tua specifica "missione" non incontra il risultato necessario. C'e' un miglior codice per il tuo obiettivo.


Poi tutto varia a seconda delle architetture, perche' in alcune un operazione mul prende diversi cicli di clock, in altre risc magari 1. Alcune verisoni di Java ad esempio funzionano anche su dispositivi embedded e microcontrollori. Lo stesso codice andra' ritestato per prestaizoni sulla specifica architettura.

Restando il fatto che su moderni pc di tutte queste cose te ne impippi.
 
Nei compiler moderni conta avere il codice piu pulito possibile.
Avere classi con 30000mila righe di codice rindondante non è il massimo.
E su github porcherie del genere le trovi
 
Un codice solitamente è scritto bene quando x ottenere un result applichi poche righe di codice, faccio l'esempio piu stupido che fece il mio prof all'università.

Dato il numero 25 in output come lo ottieni?

Java:
Int number = 5*5;

Int number = 20 + 5;

Int number = 10 + 15;

Int number = 1 + 2 + 3 + n (ti porta a 25)

e cosi via,
ci disse quello che ci mette meno tempo e meno righe x ottenere il result è il codice migliore in assoluto
Non esiste il codice migliore “in assoluto”. Dipende dal tipo di applicazione. L’esempio che hai fatto ha poco senso, senza contare che compilatori moderni risolvono la aritmetica loro stessi, vedendo che assegni costanti. E non sempre il codice migliore è quello che impiega meno tempo a girare.

Codice con poche linee ha un grosso problema, e in genere poco flessibile, che è una caratteristica di “buon” codice. E si corre il rischio di scrivere codice illeggibile. Classico esempio chi mette tante istruzioni in un ciclo for() invece della solita gestione dell’indice. Certo, puoi scrivere tutto al suo interno, fai stare tutto su una linea, ma poi? Che ci guadagni? Non certo in efficienza. E se poi devi cambiare la logica devi buttare via tutto e riscrivere da zero (in genere meglio che provare a “spacchettare” un codice troppo conciso.

Piuttosto la regola delle poche linee di codice si applica bene per una funzione, in genere buone comunità e organizzazioni hanno un limite sul numero massimo di linee per funzione, che aiuta a rispettare anche il principio di Responsabilità Singola: una funzione deve fare solo una cosa e deve cambiare per un motivo solo.

Definire un codice “buono” non è facile, ma seguire certi principi di programmazione (per esempio i SOLID) è un buon punto di partenza.
 
Perdonami andretti ma io scrivo codice da 10 anni e non 3 giorni.
Ti garantisco che alcuni progetti li ho dovuti riscrivere totalemente perchè avevano :
A) milioni di righe di codice inutile impossibile da ottimizzare
B) zero commenti, per cui di qualsiasi constructor, method etc salvo fare reverse engineering non riuscivi a capire cosa facessero

Se scrivi del codice ben indentato e poco rindondante vedrai che casini non ne trovi.
Parlo dei linguaggi che uso ogni giorno ovvero:
- Java, .net c#, framework vari in javascript, python (che pero' già è piu difficile da gestire) e cosi via.

Un esempio concreto, nella vecchia azienda dovetti riscrivere totalmente un'app mobile in quanto fu proggettata da un ingegnere informatico che scrisse codice a dir poco imbarazzante.
I miei capi mi dissero sistemala, ho fatto a tempo a riscriverla e chi c'è oggi al mio posto la mantiene senza problemi
 
Si, ma in questa discussione di che linguaggio stiamo parlando??
Mi scuso, ma ho qualche vuoto di memoria a volte
 
Comunque, questo è il codice per un programmino per programmare la media di n numeri.
Nei commenti il problema
C:
#include <stdio.h>

int main(int argc, char const *argv[]) {     
    printf("======Average Calculator======\n\n");
  
    //creazione di un ciclo per fare in modo che il programma possa essere utilizzato quanto volte vuole l'utente
    while(1) {
        //scansione della quantità dei numeri
        printf("How many numbers should I calculate the average of?\n");
        int numberQuantity;
        scanf("%d", &numberQuantity);
      
        //ciclo per sommare gli n numeri in sum
        int sum;
        for(int i = 0; i < numberQuantity; i++) {
            printf("Immetti un numero: ");
            int number;
            scanf("%d", &number);

            sum += number;
        }
      
        //calcolo della media e stampa su console
        int average = sum / numberQuantity;
        printf("La media è %d\n\n\n", average);

        /*
        qui il programma dovrebbe chiedere se l'utente vuole continuare,
        in caso di y ricomincia il ciclo, in caso di n interrompe.
        il problema si manifesta quando arrivati a questo punto il programma stampa la richiesta,
        l'end-line e ricomincia, senza farmi scegliere
        */
        printf("Do you want to continue? [Y/N]\n");
        char choice;
        scanf("%c", &choice);

        if(choice == 'y' || choice == 'Y') {
            continue;
        } else {
            printf("\n\n======End of the program======"); //end-line
        }
    }

    return 0;
}

non riesco a capire il problema


EDIT: trovato il problema, avevo dimenticato il break, scusate

EDIT 2: nonostante abbia messo il break il programma ignora completamente lo scanf dopo la conferma di continuazione, non riesco a capire perché...
 
Ultima modifica:
Se scrivi del codice ben indentato e poco rindondante vedrai che casini non ne trovi.
Anche quelle sono condizioni necessarie, ma non sufficienti.

Sui commenti, non servono a nulla se il codice e' ben scritto un quanto si auto-commenta da solo. Anche qui poi bisogna decidere e stabilire quando e come mettere commenti. Io personalmente li uso per spiegare perché ho deciso di usare quel codice invece che altro, magari con la postilla "attenti nel cambiare questo codice, che e' inserito per evitare il problema XXX di della versione YYYY del sistema operativo e/o librerie di sistema (credimi, ne ho trovati di questi problemi)
 
Perdonami però se parli di web development lascia perdere il C.
Inizia ad usare Java Spring Boot oppure c# con .net per fare programmi molto semplici che si interfacciano al web. Oramai il C si usa poco è solo x scopi ben precisi. Le aziende si basano su applicativi web.
E su strumenti come react e compagnia bella .
 
@Hero467 ho guardato il tuo codice. A parte il missing break (che hai trovato) ci sono altri due errori. Il primo è che usi una variabile (sum) non inizializzata. È una cosa da evitare come la peste, in certi linguaggi viene considerato un errore di compilazione. Sempre inizializzarle, sempre, mai assumere che siano zero.
Il secondo è che fai uso sempre di variabili di tipo intero. Quando usi una variabile accumulatore (sum, nel tuo caso) c’è il pericolo che possa andare in overflow. Quando fai una divisione (come nel tuo caso per calcolare la media), mai usare un intero, in quanto non hai controllo su come il risultato sia approssimato (troncamento? Approssimazione?), sempre usate variabili a virgola mobile)

Il problema che riscontri è uno dei problemi principali del linguaggio C, ossia il I/O formattato, che è scritto (mi spiace dirlo) proprio con i piedi. Lo scanf() non viene ignorato, come dici tu, semplicemente quella istruzione mette nella variabile specificata il primo carattere del buffer di ingresso (in quanto usi per la lettura il formato %c), e nel tuo caso è il carattere di ritorno che hai usato per inserire l’ultimo numero della serie, in quanto lo scanf() non lo rimuove dal buffer di input. Quello che hai scritto dunque non è sbagliato, semplicemente che non conoscendo i dettagli del linguaggio non sapevi di questa peculiarità.
Personalmente, non uso mai scanf() in C, per leggere la tastiera uso sempre e solo gets() in modo da leggere tutta la linea, da cui poi prendo i “pezzi” che mi interessano, facendo le conversioni usando sscanf(). È più lavoro (ma non troppo) ma sono in controllo di quello che leggo, e posso più facilmente controllare gli errori di conversione.
 
Pubblicità
Pubblicità
Indietro
Top