Sfida: una riga di codice al giorno

Il metodo della gamification unito alla challenge per riuscire finalmente a dedicarmi con maggiore regolarità e profitto alla programmazione.

Sfida: una riga di codice al giorno
Immagine di fancycrave1 from Pixabay

Non sono un programmatore, anche se ai tempi delle scuole superiori e dell'università era quello che sarei voluto diventare. Sono sempre stato abbastanza portato per le materie scientifiche, in particolare per la matematica e la logica, ma in informatica non sono mai andato oltre i semplici esercizi didattici o le micro-tesine d'esame.

💡
Il punto è che a scuola o all'università non vi insegnano a programmare, ma a ragionare per risolvere dei problemi.

Programmare, banalmente, consiste nell'imparare in maniera approfondita un linguaggio di programmazione, imparare (possibilmente dopo averli capiti) delle tecniche algoritmiche e dei pattern di sviluppo, infine nell'utilizzare correttamente le librerie esistenti che implementano già la soluzione al 99% dei problemi che dovrete affrontare nella realizzazione di un progetto.

E qui si arriva al punto dolente: il progetto.

Potete essere bravi quanto vi pare, conoscere tutti i linguaggi di programmazione del mondo, risolvere in maniera efficientissima tutti i problemi che volete, ma senza un'idea di quello che volete realizzare tutto questo non serve a niente.

👨🏻‍💻
Quindi mi stai dicendo che non posso realizzare un'applicazione fantastica che mi farà avviare la mia startup milionaria semplicemente mettendomi davanti al computer a spippolare sulla tastiera?

Esattamente. Serve un progetto, e prima di questo serve un'idea. Più l'idea è dettagliata, più il progetto prende forma, più facile sarà tradurre tutto in codice.

⁉️
Ehi, aspetta! E la programmazione agile? L'extreme programming? Il TDD? Il test first?

Tutto molto bello, tutto interessante e utile a velocizzare lo sviluppo delle singole feature, ma il progetto, quello grosso, ce lo devi avere già in mente, anzi su carta. Poi la direzione dello sviluppo, l'aggiunta di nuove funzioni e caratteristiche può avvenire in maniera agile, ma la base deve essere definita.

💵
Ok, quindi serve un progetto (quanto più dettagliato) che scaturisce da un'idea. Dove la trovo l'idea?

Questa è forse la parte più difficile, a seconda dei casi. In genere l'idea di produrre un'applicazione, di avviare un'impresa, di realizzare un prodotto scaturisce da un bisogno. Può trattarsi di un bisogno o un'esigenza personale, oppure di un bisogno individuato dall'osservazione del mondo che ci circonda, per colmare un'esigenza di molti. A seconda dei casi, il progetto sarà più o meno grande e impegnativo, e quindi poco adatto ad essere realizzato in solitaria.

La mia "idea"

Passare ore, giorni o mesi a seguire manuali e tutorial per vedere come si fa il classico blog o il clone povero di Twitter può essere utile per imparare un linguaggio, l'interazione con il database, per capire come implementare l'autenticazione degli utenti, come fare in modo di inviare email direttamente dall'applicazione, ecc. ecc., ma non risolve nessun nuovo problema e non insegna nulla di nuovo.

La mia idea, assolutamente modesta e per niente originale, consiste in una piccola applcazione web per mantenere delle cosiddette "External dynamic lists" che posso essere usate, per esempio, da un firewall (oggi si chiamano next-generation firewalls) per bloccare o consentire l'accesso a determinati IP o URL, oppure da un SIEM per individuare particolari IoC (Indicator of Compromise) e allertare l'amministratore della rete. Sono soltanto un paio di esempi, ma molto concreti e che fanno parte del mio ambito di lavoro.

Quale problema risolve?

Invece di estrarre manualmente delle liste di IP, di URL o di IoC da un file, formattarle adeguatamente, caricarle su un sito web statico e poi inserire la URL della lista nel mio firewall, potrei dare il file in pasto ad un'applicazione che lo elabora, produce la lista e la rende consultabile tramite una URL. Nel farlo, verrebbero automaticamente rimossi eventuali duplicati, le entry verrebbero inserite in un database in modo da essere ricercabili, e a ciascuna entry si potrebbe dare una descrizione e una eventuale scadenza, oltre la quale verrebbe rimossa dalla lista senza la necessità di intervenire manualmente.

Lo so, dalla descrizione si capisce subito che come applicazione non è particolarmente "eccitante", tuttavia potrebbe avere un impiego concreto nel mio lavoro e poi, magari, evolvere in qualcosa di più complesso.

L'idea tra l'altro non è affatto originale, perché qualcosa di simile ma estremamente più complesso ed elaborato è stato già fatto in passato ed ha ricevuto anche una certa attenzione in ambiene enterprise.

L'applicazione si chiamava MineMeld, era stata inizialmente sviluppata (mi pare) da un programmatore italiano e poi in qualche modo acquisita/sponsorizzata da Palo Alto Networks. Pochi anni dopo, tuttavia, il supporto del colosso di Santa Clara è terminato e lo sviluppo si è interrotto, al punto che per installare nativamente l'applicazione oggi bisogna ricorrere a software obsoleto oppure eseguire macchine virtuali basate su Ubuntu 14.04 o, al più, 16.04.

L'implementazione

Come detto all'inizio del post, non sono un programmatore e sono anche piuttosto pigro e discontinuo quando si tratta di imparare cose che non hanno un'utilità immediata nel mio lavoro. Partire in tromba a scrivere codice che poi abbandonerò nel giro di poche settimane sarebbe solo l'ennesima perdita di tempo.

Allora ho pensato di fare questa specie di sfida: scrivere almeno una riga di codice al giorno, che sia un'istruzione di una funzione, una riga di un template, e così via. Ogni giorno, con le dovute ed inevitabili eccezioni, dovrà esserci un commit al repository dell'applicazione.

Per la realizzazione dell'applicazione ho scelto il framework Flask, che al momento è quello che mi pare più semplice e adatto allo scopo.

Su questo blog proverò a seguire e descrivere lo sviluppo ogni volta che avrò completato qualche porzione significativa di codice.

È una "sfida", e in quanto tale anche la sconfitta e la rinuncia fanno parte delle possibilità.