Come si può determinare se una persona è in grado di programmare?

Il problema è molto sentito da chi deve selezionare il personale in campo informatico (ma solo qui?) dove spesso i candidati millantano conoscenze ed esperienza che non hanno.

Con questo non voglio condannare chi prepara il proprio curriculum con tanto "ottimismo" ma suggerirei comunque di non esagerare troppo! Sono convinto che la bontà del programmatore dipenda molto dall'esperienza che si ottiene affrontando e risolvendo problemi diversi e so molto bene che chi è alle prime armi da qualche parte deve pur partire; mentire a chi ci commissiona un lavoro o ci vuole assumere però non può che portare a malintesi, delusioni e altre situazioni spiacevoli.

In rete si trovano diversi test utilizzati dai selezionatori nel corso dei propri colloqui: per farsene un'idea è sufficiente cercare "job interview questions" magari specificando il linguaggio o la tecnologia che ci interessa.

Tempo fa ho trovato un simpatico test, il "Fizz-Buzz", che sembra riesca a "filtrare" moltissimi dei candidati al ruolo di sviluppatore software.
Il testo è il seguente:

Scrivi un programma che stampa a video i numeri da 1 a 100. Per i numeri multipli di 3 stampa "Fizz" mentre per i multipli di 5 stampa "Buzz". Per i numeri che sono multipli sia di 3 che di 5 stampa "FizzBuzz".

La soluzione è molto semplice, in C la scriverei così:

int main( void )
{
 int i;

for(i=1;i<=100;i++)
  {
   if( ((i%3)==0) && ((i%5)==0) )
    printf( "FizzBuzz\n");
   else if((i%3)==0)
    printf( "Fizz\n");
   else if((i%5)==0)
    printf( "Buzz\n");
   else
    printf( "%d\n", i );
  }
getch();
  return 0;
}

In rete si trovano tantissime soluzioni, scritte in tantissimi linguaggi diversi; il mio piccolo contributo alla causa può essere quello di scrivere una versione che non fa uso dell'operatore modulo

int main( void )
{
 int i;
 int next3 = 3;
 int next5 = 5;

for(i=1;i<=100;i++)
  {
   if( (i==next3) && (i==next5) )
   {
    printf( "FizzBuzz\n");
    next3 += 3;
    next5 += 5;
   }
   else if (i==next3)
   {
    printf( "Fizz\n");
    next3 += 3;
   }
   else if (i==next5)
   {
    printf( "Buzz\n");
    next5 += 5;
   }
   else
    printf( "%d\n", i );
  }
getch();
  return 0;
}

Il punto, comunque, è che molti aspiranti programmatori non riescono a risolvere questo piccolo problema.
La mia ipotesi è che molti prediligano lo "studio" di un linguaggio di programmazione specifico, nella sua sintassi, e non tentino neanche di mettere in pratica le proprie conoscenze: un pò come studiare una lingua senza voler provare a fare una conversazione!

Personalmente quando mi trovo a dover utilizzare un nuovo linguaggio oltre allo studio dei costrutti di base (tramite lo studio di un libro) cerco subito di mettermi al lavoro traducendo gli algoritmi che ho scritto per risolvere i primi quiz di projecteuler o vado alla ricerca in rete di qualche esercizio da svolgere.

D'ora in poi, uno dei primi algoritmi che proverò a tradurre sarà d'obbligo il "Fizz-Buzz", subito dopo il classico "Hello World"!