Confessioni di un consulente IT

Allucinazioni

Pubblicato in Domande da pigreco314 il 3 Giugno, 2009

Guardo un tizio che parla con un amico a qualche metro da me.

Il rumore del traffico mi consente di percepire solo frammenti di conversazione.

Mi fisso sul viso della persona che sta parlando in questo momento.

A poco a poco quel viso diventa un accostamento di occhi, naso, bocca, zigomi, fronte: un insieme di parti che incidentalmente si trovano in prossimità l’una dell’altra.

E il viso come tutt’uno scompare, il riduzionismo ha la meglio sull’olismo.

Rabbrividisco immaginando che probabilmente un alieno ci percepirebbe così.

Un po’ come vedere i segni che compongono una parola scritta nella propria lingua o udirne la pronuncia ma bloccare l’emergere automatico e inesorabile del suo significato all’interno della mente.

Sarà grave?

E in che categoria lo colloco questo post?

Che nervi questa attesa…

Pianificazione

Pubblicato in Project Management da pigreco314 il 30 Maggio, 2009

Il Tour Production Manager dei Radiohead, Richard Young, parla in un breve articolo dei problemi logistici che deve affrontare per la pianificazione del prossimo tour della band.

I Radiohead hanno deciso infatti di limitare al massimo l’emissione di anidride carbonica coinvolta nello svolgimento del tour e ha posto il vincolo che l’equipaggiamento utilizzato negli spettacoli (strumenti, sistema di luci, ecc.) non deve essere trasportato per via aerea.

Che fareste voi per limitare i costi, rispettare le date e assicurarvi che la band disponga dei propri rarissimi microfoni in ogni data del tour?

Mentre ci pensate su, potete godervi la musica e le immagini di “Pyramid Song” dall’album Amnesiac.

Alla rovescia

Pubblicato in Consulenti, G.M., Progetti da pigreco314 il 20 Maggio, 2009
 Relax © by ailatan

Relax © by ailatan

Forse ci siamo, forse incrociando dita, falangi, falangine, falangette e polpastrelli riusciamo a chiudere il dannatissimo progetto K**, difficilissimo Cliente di L*, Germania.

La firma che ci avrebbe permesso di fatturare il residuo sarebbe dovuta arrivare due , quattro no aspetta, sette… un numero imprecisato di mesi fa e invece probabilmente arriverà domani, dopodomani… insomma un giorno della prossima settimana sicuramente.

Avrete capito che trattasi di progetto travagliato, che ha visto coinvolte un discreto numero di persone impegnate a portare a casa un risultato utile, tra cui, in veste di protagonista, l’ormai mitico G.M. Di recente si è aggiunto anche il nuovo acquisto in casa Sales, il promettente A.D., come “supportante” Account Manager.

Negli ultimi 5 mesi con questo Cliente non si è fatto altro che negoziare al mercato delle “issues”: “no questo non è un problema causato dal nostro software bensì dalla vostra infrastruttura di rete”, “questo non l’avevate chiesto e quindi non ve lo sistemiamo a meno che non ci paghiate l’intervento”, “no questo non lo firmo perché non c’è il sotto-vice-assistente-precario del responsabile” (cliente pubblico) ecc.

Suona quindi strano che  presso un Cliente così problematico in una fase così delicata del progetto si organizzi una dimostrazione di un modulo software di analisi statistica e reportistica avanzata per il quale quelli di K** hanno manifestato un notevole interesse. Organizzatori: G.M. e A.D., il dinamico duo.

Della serie: prima risolviamo la faccenduola relativa alla chiusura del progetto e poi vi facciamo vedere tutto quello che volete, vi contiamo in diretta anche i pixel dell’interfaccia grafica utente se volete. Dopo però.

Saltiamo qualche passaggio e diciamo che stando ai resoconti del dinamico duo il Cliente firmerà la chiusura del progetto, consentendoci di fatturare il residuo e pure ordinando un giorno di consulenza per una micro attività aggiuntiva.

Curioso il modo in cui A.D. riporta la notizia, al termine della riunione di ieri:

Vi informo che siamo riusciti nel nostro intento di generare interesse presso K** circa i software X e Y, cosa che era l’obiettivo primario (sic!) della riunione. Tra le altre cose, abbiamo poi stabilito una relazione col Cliente (questa non l’ho capita bene) il quale ha accennato al fatto che firmerà la chiusura del progetto blah blah…

Ovviamente sono sicuro del fatto che l’entusiasmo del dinamico duo è ben motivato e che tra poco vedrò materializzare nella mia inbox (o nel mio GTalk, veggasi articoli sul bot) il pezzo di carta firmato, tuttavia la differenza di prospettiva rispetto a cosa sia veramente importante in una situazione è cosa che colpisce.

PS: alla fine della giornata di lavoro di oggi (20/05), nessuna traccia del pezzo di carta. Seguiranno aggiornamenti.

PPS: nulla nemmeno a tutto il 25/05

PPPS: 28 maggio, giornata storica il sign-off è arrivato!!!!!

PPPPS: non ci credo: abbiamo chiuso il progetto e fatturato il 29 maggio 2009

Progetto GTalk Bot #3

Pubblicato in Geek corner, Programmazione da pigreco314 il 20 Maggio, 2009

Nell’ultimo mese il progetto GTalk Bot è proseguito seguendo ramificazioni inattese ma assai feconde.GTalk Bot

Quei quattro lettori che mi seguono sapranno senz’altro di che progetto sto parlando. Per gli ospiti di passaggio è disponibile la serie delle due puntate precedenti (parte #1 e parte #2)

Nella versione attuale (ancora piuttosto alfa) il bot ha migliorato il supporto LDAP e ora accetta anche query complesse, permettendo amenità varie come estrarre la lista di tutti i riporti di un determinato manager con un comando del tipo:

d -q "manager=Mario Rossi"

Vi ricordo che la sintassi è totalmente arbitraria (il "dir" del post precedente si è contratto in "d" per comodità di digitazione sui dispositivi mobili)

Visto che un pezzo della Corporation sta su Active Directory ho dovuto estendere il supporto delle query LDAP su un secondo server, cosa che, con l’aiuto di uno dei tanti tool di esplorazione LDAP, è risultata particolarmente semplice in quanto l’unica modifica ha riguardato la modalità di autenticazione e il “base dn”.

Ma la cosa di cui vado particolarmente fiero è l’interfaccia con Outlook 2007 (o meglio Exchange 2007) implementata tramite invocazione dei web services di Exchange su protocollo SOAP, risultato che mi è costato qualche notte insonne e un cambio abbastanza radicale in termini di design.

Python e SOAP

L’idea iniziale di utilizzare una soluzione basata su weboutlook si è rivelata poco praticabile e un po’ troppo rozza (sostanzialmente effettua un parsing della pagina web di Outlook Web Access).

I web services di Exchange di 2007 sono invece splendidamente documentati. Il problema quindi si “riduceva” a implementare in Python (il linguaggio con cui avevo iniziato a sviluppare il bot) le chiamate SOAP ai servizi di Exchange.

Seguendo l’eccellente introduzione di Dive Into Python ho cominciato a sperimentare SOAP su python. Dopo aver appreso le basi, ho tentato di attaccare i web services di Exchange con scarsi e snervanti risultati. Purtroppo il debugging di una applicazione SOAP non è per niente banale. Le librerie SOAP di Python che vanno per la maggiore sono due:

  • SOAPpy: abbastanza semplice da usare scarsamente documentata e credo non più sviluppata
  • ZSI: ben documentata (ma vi serve qualche base di SOAP) e attivamente sviluppata

Quando dal debugging della mia applicazione sono passato al debugging delle librerie medesime per risalire alla causa di certi errori (anche il passaggio dei tipi di variable complessi via SOAP può diventare un incubo) ho pensato che forse il supporto SOAP di Python non era sufficientemente maturo per i miei scopi.

Php

L’articolo Talking SOAP with Exchange ha attirato la mia attenzione su Php che già conoscevo come linguaggio di scripting per applicazioni web.

Vi si descrive più o meno quello che mi serviva, ossia implementare un client SOAP per servizi Exchange 2007. Il ché mi ha indotto a considerare l’ipotesi di scrivere in Php un front-end semplificato per i servizi di Exchange e fare in modo che il bot Gtalk scritto in Python consumasse questi web services surrogati invece degli originali più complessi.

In realtà Php, dalla versione 4.3.0, può essere utilizzato anche per realizzare script eseguibili dalla linea di comando senza necessariamente utilizzarlo all’interno di un web server, assumendo così dignità di linguaggio di scripting di sistema alla pari di python, perl ecc.

Mi sono pertanto chiesto se per caso qualche anima pia non avesse anche provveduto a sviluppare un supporto Php per XMPP/Jabber, il protocollo di Google Talk.

Si dà il caso che grazie al lavoro Nathan Fritz (per sempre grato,Nat!), Php supporti il protocollo XMPP/Jabber.

A quel punto, l’idea di scrivere il GTalk Bot in Php ha preso forma.

Mi spiaceva un po’ abbandonare l’approccio di python-jabberbot e il suo elegante meccanismo di funzioni callback e quindi, come prima cosa, ho riscritto jabberbot in Php (a breve penso di pubblicarlo su Google Code).

Con il php-jabberbot, creare un bot Google Talk che ritorni lo user Id del proprio interlocutore e dica che ore sono è semplice come scrivere:

<?php

include "jabberbot.php";

class GtalkBot extends JabberBot {

public function bot_hello($msg,$args) {

list($jid,$client)=split("/",$msg['from']);

return "Hello $jid , it is now ".strftime("%H:%M:%S %d/%b/%Y");

}

}

$gtb = new GtalkBot(<username_gtalk>,<password_gtalk>');

$gtb->serve_forever();

?>

Collegandosi a Google Talk con un secondo account e aprendo una chat con l’utente fittizio utilizzato dal bot, digitando il messaggio “hello”, il nostro amico risponderà salutandovi cortesemente e ragguagliandovi circa ora e data in uso sul proprio server.

Se avete urgenza di mettere le mani sul codice di php-jabberbot è sufficiente che lasciate un commento a questo post.

Php e NuSOAP

Torniamo a SOAP ed Exchange. L’articolo Talking SOAP with Exchange sopracitato è un ottima introduzione al tema ma ha il difetto di basarsi sull’estensione SOAP di PHP 5 che non supporta l’autenticazione NTLM richiesta da Exchange (l’articolo fornisce anche la soluzione a questo problema).

In realtà, di librerie SOAP per Php ve ne sono almeno tre:

  • la già citata estensione SOAP di PHP 5 (su Windows è la dll php_soap.dll)
  • il package PEAR:Soap
  • la libreria NuSOAP (la versione che ho scaricato dal repository reca numero 0.7.3)

La terza è quella con cui mi sono trovato meglio: buona documentazione, supporto autenticazione NTLM nonché Basic HTTP e sufficiente diagnostica per il debugging.

Ho quindi iniziato a sperimentare NuSOAP con alcuni web services disponibili in rete (per esempio XMethods.net).

Php, NuSOAP e Exchange 2007

Rinfrancato dai primi successi, sono passato a studiare la documentazione disponibile e a fare qualche esperimento infastidendo il nostro server Exchange 2007.

La faccio breve e vi presento qui sotto un esempio di come sia possibile usare NuSOAP per interrogare Exchange e ottenere informazioni sui messaggi non letti presenti nella vostra casella di posta elettronica.

Personalmente ho trovato l’introduzione a SOAP di Dive Into Python (anche se centrata su Python) più che sufficiente per i miei scopi. Qualunque altra introduzione all’argomento va bene. I concetti che vi servono sono il meccanismo Request/Response di SOAP, il modo in cui i messaggi vengono formattati in XML e i descrittori di webservices WSDL.

Le interrogazioni di questo esempio useranno l’approccio WSDL.

Gli ingredienti:

  • un server Exchange 2007 (es. https://exchange.example.com) e relativo account; inoltre dovrete farvi dire quale tipo di autenticazione è configurata sul server (nel mio caso Basic HTTP, altra possibile opzione è NTML)
  • PHP 5
  • NuSOAP 0.7.x: io sto usando la 0.7.3
  • Php_curl: l’unica dipendenza richiesta da NuSOAP

Anche se il bot verrà messo in produzione su Linux, in fase di test opero in ambiente Windows:  I love  scripting languages!

Cominciate a procurarvi i seguenti file dal vostro server Exchange. Dovrebbero essere reperibili agli indirizzi indicati qui sotto:

  • Services.wsdl: https://exchange.esempio.com/EWS/Services.wsdl.
  • messages.xsd: https://exchange.esempio.com/EWS/messages.xsd
  • types.xsd:https://exchange.esempio.com/EWS/types.xsd

Salvateli in una directory locale nel vostro ambiente di sviluppo. Questi file XML contengono le specifiche dei web services esposti da Exchange. Teoricamente non è necessario utilizzarli localmente, tuttavia, secondoTalking SOAP with Exchange, il wsdl di Exchange 2007 è malformato (!) in quanto mancante di una dichiarazione senza la quale non si ha conformità con le specifiche SOAP. In effetti, se provate a usare il file così com’è, le interrogazioni SOAP falliscono. La soluzione più semplice, una volta salvato il file in locale, è aggiungervi in coda la parte mancante come riportato qui sotto e nell’articolo (sostituite ovviamente il nome del server con quello reale):

<wsdl:service name="ExchangeServices">

<wsdl:port name="ExchangeServicePort" binding="tns:ExchangeServiceBinding">

<soap:address location=

"https://exchange.esempio.com/EWS/Exchange.asmx"/>

</wsdl:port>

</wsdl:service>

<!-- la riga successiva dovrebbe già essere nel vostro file WSDL -->

</wsdl:definitions>

Autenticazione

Nel frammento qui sotto, si spiega come usare NuSOAP per autenticarsi in Basic HTTP sul server Exchange:

require_once('nusoap.php');

//percorso dove avete salvato il file wsdl, i file .xsd verranno cercati nella medesima directory:

$client = new nusoap_client('file://c:/Temp/Services.wsdl',true);
$err = $client->getError();
if ($err) {
print "\nClient error". $err . ".\n";
}

//basic HTTP autentication:

$client->setCredentials ('username','password','basic');

Il client è pronto per inviare interrogazioni al server Exchange.

“Request

Esaminando la documentazione dei web services di Exchange scopriamo che la operation FindItem, ritorna i messaggi contenuti in un determinato folder Outlook.

La richiesta deve rispettare questa struttura:

<FindItem Traversal="Shallow">

<ItemShape>

<t:BaseShape>Default</t:BaseShape>

</ItemShape>

<!-apre la dichiarazione per una condizione di ricerca -->
<Restriction>
<!-apre una clausola di euguaglianza -->

<t:IsEqualTo>

<FieldURI FieldURI="message:isRead"/>

<!-message:isRead deve essere zero,ovvero messaggio non letto-->

<FieldURIOrConstant><Constant Value="0"/>

</FieldURIOrConstant>

</t:IsEqualTo>

</Restriction>

<ParentFolderIds>

<!-identifica il folder-->

<t:DistinguishedFolderId Id="inbox"/>

</ParentFolderIds>

</FindItem>

Con NuSOAP, la “request” qui sopra si può costruire creando diversi oggetti soapval innestati, partendo da quelli più interni:

$BaseShape = new soapval(

// nome dell'oggetto come da struttura sopra:

'BaseShape',

// nome del tipo: si ricava dalla documentazione Microsoft:

'DefaultShapeNamesType',

// valore: si ricava dalla documentazione Microsoft

'AllProperties',

// namespace del tipo:si ricava dalla documentazione Microsoft
// ho riscontrato che l'interrogazione fallisce se non
// viene specificato

'http://schemas.microsoft.com/exchange/services/2006/types',

// namespace dell'elemento (opzionale):si ricava dalla
// documentazione Microsoft

false,

// eventuali attributi dell'elemento

false);

$ItemShape = new soapval ('ItemShape',

'ItemResponseShapeType',

// ItemShape contiene BaseShape come valore:

$BaseShape,

'http://schemas.microsoft.com/exchange/services/2006/messages',

false,

false);


$FieldURI = new soapval('FieldURI',

'PathToUnindexedFieldType',

// l'elemento FieldURI non ha valore bensì un attributo (vedi sotto)

'',

'http://schemas.microsoft.com/exchange/services/2006/types',

false,

// attributo FieldURI dell'elemento FieldURI
// incidentalmente hanno lo stesso nome
// per la dichiarazione si usa il formato chiave=>valore: 

array('FieldURI'=>'message:IsRead'));

$Constant = new soapval('Constant',

'ConstantValueType',

'',

'http://schemas.microsoft.com/exchange/services/2006/types',

false,

array('Value'=>'0'));

$FieldURIOrConstant = new soapval('FieldURIOrConstant',

'FieldURIOrConstantType',

$Constant,

'http://schemas.microsoft.com/exchange/services/2006/types',

false,

false );

$IsEqualTo = new soapval('IsEqualTo',

'IsEqualToType',

array($FieldURI,$FieldURIOrConstant),

'http://schemas.microsoft.com/exchange/services/2006/types',

false,

false);

$Restriction = new soapval('Restriction',

'RestrictionType',

$IsEqualTo,

'http://schemas.microsoft.com/exchange/services/2006/messages',

false,

false);

$DistinguishedFolderId = new soapval('DistinguishedFolderId',

'DistinguishedFolderIdType',

'',

'http://schemas.microsoft.com/exchange/services/2006/types',

false,

array('Id'=>'inbox'));

$ParentFolderIds = new soapval('ParentFolderIds',

'NonEmptyArrayOfBaseFolderIdsType',

$DistinguishedFolderId,

'http://schemas.microsoft.com/exchange/services/2006/messages',

false,

false);

$FindItem = new soapval('FindItem',

'FindItemType',

// quando l'elemento contiene più sottoelementi,
// questi vengono combinati in un array:

array($ItemShape,$Restriction,$ParentFolderIds),

'http://schemas.microsoft.com/exchange/services/2006/messages',

false,

array('Traversal'=>'Shallow'));

A questo punto la variabile $FindItem contiene la nostra richiesta. Rimane solo da inviarla al server. Ecco come fare:

$xmlout = $FindItem->serialize('literal');

$items=$client->call('FindItem',$xmlout);

$err = $client->getError();

if ($err) {

print "\nMethod error". $err . ".\n";

}

// nel caso vogliate esaminare la struttura della risposta del server:

//print_r($items);

“Response

La documentazione di Microsoft riporta anche le specifiche dettagliate delle risposte del server.

Queste vengono astratte da NuSOAP sotto forma di array innestati. Vi rimando alla documentazione o alle prove sul campo per i dettagli.

Mi limito qui a riportare il codice che potete utilizzare per stampare le informazioni relative ai messaggi non letti presenti nella inbox e ritornati nella variabile $items di cui sopra:

// numero di messaggi trovati

$num_items =  $items['ResponseMessages']['FindItemResponseMessage']['RootFolder']['!TotalItemsInView'];

// loop sui messaggi: attenzione, questo loop
// funziona solo se $num_items > 1.
// occorre gestire il caso 0 o 1 messaggio separatamente

foreach ($items['ResponseMessages']['FindItemResponseMessage']['RootFolder']['Items']['Message'] as $message) {

print "Subject: ". $message['Subject']. "\n" .

"From: ". $message['From']['Mailbox']['Name']. "\n" .

"Size: ". $message['Size']. "\n" .

"Date Sent: ". $message['DateTimeSent']. "\n" .

"Date Created: ". $message['DateTimeCreated']. "\n" .

}

Oltre

Ricapitoliamo.

Con questa soluzione posso accedere via instant messaging di GTalk a una serie di servizi disponibili normalmente solo all’interno della nostra rete aziendale, come info LDAP e posta.

In realtà, la recente migrazione ad Outlook 2007 (un altro pianeta rispetto a Lotus Notes) ha reso questa necessità meno impellente  in quanto finalmente, dopo anni, possiamo accedere alla nostra posta via Web fuori dalla VPN grazie a Outlook Web Access su https. Ho già sperimentato l’interfaccia utente su iPod Touch (dal Nokia E65 ho un problema di cookie).

L’interrogazione via instant messaging può però in diversi casi essere più agevole e immediata e consentire anche interessanti estensioni che coinvolgano il servizio Twitter. Il bot potrebbe infatti mettersi in ascolto di un account twitter fittizio al quale inviare messaggi via SMS. Questi messaggi verrebbero in realtà interpretati come comandi da eseguire esattamente come se l’interazione avvenisse via IM. Come gestire l’invio delle risposte in questo caso? Ovviamente sempre via SMS, usando una SIM dedicata collegata al server su cui gira il bot o un interessante side effect di Google Calendar.

Ma questo è materiale per il prossimo articolo.

Progetto GTalk Bot #2

Pubblicato in Geek corner, Programmazione da pigreco314 il 29 Aprile, 2009

Dopo aver migrato il sistema operativo della linux box adibita a server ftp (che spreco!) da Slackware a Ubuntu 8.1 sono ritornato sul vecchio progetto di realizzare un bot GTalk che mi consenta di accedere da qualunque client google talk a informazioni disponibili sollo dall’interno della nostra rete aziendale (posta, informazioni anagrafiche, numeri di telefono, ecc.).

E così, lo scorso fine settimana ho sviluppato un prima versione del bot che, collegandosi a Google Talk con un account opportunamente creato, aspetta che il suo padrone gli invii i comandi ai quali è stato addestrato a rispondere.

Uno di questi comandi, che ho chiamato dir, fa sì che il bot acceda al server aziendale LDAP e restituisca informazioni pubbliche relative dipendenti. La sintassi è:

dir keyword [attribute]

dove keyword identifica la chiave di ricerca nella directory (per esempio il nome e cognome di un utente aziendale o una sua sottostringa) e [attribute] è l’attributo cercato (manager,mobile, location, title, ecc.)

Per esempio, se voglio conoscere il numero di cellulare del collega Mario Rossi, è sufficiente che chieda al mio fido assistente:

dir "Mario Rossi" mobile

Nel caso voglia reperire tutte le informazioni pubbliche di Mario Rossi, basterà invece digitare:

dir "Mario Rossi"

Ovviamente questa piccola magia funziona su qualunque dispositivo che supporti Jabber (il protocollo di IM su cui Google Talk è basato) e io ho potuto provarlo su un iPod Touch (sul quale GTalk gira in modo nativo) e un Nokia E65 con Fring installato.

Dopo essermi baloccato un paio d’ore con pygtalkrobot che ho avuto qualche problema a usare mi sono imbattuto nel progetto python-jabberbot che fornisce praticamente tutto quello che serve.

Il modulo jabberbot.py fornisce una classe JabberBot di cui ho modificato il costruttore per consentire di passare come parametri il server Jabber e la porta di connessione. Nel caso di Google Talk il server è talk.google.com. Dato che dall’interno della nostra rete la connessione con il server gtalk funziona solo attraverso la porta 443 (e non la 5222) e non essendo riuscito a forzare l’uso di questa porta nelle istanze della classe JabberBot ho tagliato corto e consentito di specificarne il valore come parametro.

La classe JabberBot fornisce le primitive per connettersi al server nonché ricevere e inviare messaggi. Il vostro bot deve essere definito come classe ereditata da JabberBot ed esporre metodi aggiuntivi per il trattamento dei messaggi. Il nome del metodo deve essere denominato come bot_<parola_chiave> (bot_ è il prefisso comune a tutti i metodi).

Quando il bot riceve un messaggio in cui la prima parola è <parola_chiave> invocherà il metodo corrispondente per il trattamento del messaggio.  Per esempio, per implementare un comando che restituisca il timestamp del server si può usare qualcosa del tipo:

def bot_time( self, mess, args):
"""Displays current server time"""
return str(datetime.datetime.now())

che verrà invocato digitando “time” nella chat con il vostro bot.

Pygtalkrobot usa un approccio simile ma i comandi sono definiti come espressioni regolari. In linea di principio questo approccio è più potente e flessibile ma per i miei scopi l’ho trovato inutilmente complicato.

Per accedere a LDAP ho usato la relativa libreria python-ldap e qualche esempio di query reperito in rete.

Le due revisioni successive dovranno implementare due importanti aggiunte:

  • l’interrogazione del mio file di posta tramite l’interfaccia WebOutlook, gentilmente resa disponibile dopo la migrazione della nostra infrastruttura da Lotus Notes a Outlook. Per questo utilizzerò un altro progetto python: weboutlook che va modificato per supportare la Basic HTTP Authentication usata dall’interfaccia web del nostro nuovo server Exchange
  • l’esecuzione del bot come demone. Di nuovo mi appoggio sulle spalle dei giganti e mi servo della Chris’ Python Page

Ad maiora!

Citazione

Pubblicato in Zeitgeist da pigreco314 il 23 Aprile, 2009

Sto leggendo “Il Mondo è Piatto” di Thomas Friedman.

A pagina 283 della mia edizione c’è una frase che mi ha molto colpito. L’autore immagina di rivolgersi così alle sue figlie:

Ragazze, quando ero piccolo i miei genitori mi dicevano: “Tom, finisci quello che hai nel piatto; in Cina e in India la gente muore di fame”. A voi io dico: “Ragazze, finite i vostri compiti, perché in Cina e in India la gente è affamata dei vostri posti di lavoro”.

E in un mondo piatto possono benissimo accaparrarseli, perché lì non esiste più una cosa chiamata “lavoro americano”. Esiste semplicemente il lavoro, e nella stragrande maggioranza dei casi lo conquisterà chi è più bravo, più intelligente, più produttivo o più economico, in qualsiasi angolo del pianeta si trovi.

Non sono sicuro che la Gelmini (così come coloro che l’hanno preceduta) si renda ben conto di questa realtà.

Scrivere un executive summary

Pubblicato in Management da pigreco314 il 20 Aprile, 2009

Oggi ho chiesto a un paio dei miei di compilare un executive summary riguardo il tal progetto che da poco iniziato già sta andando in vacca.

Ovviamente la scena si svolge in Olanda dove a quanto pare occorrerà rivolgersi alla Human Resources per risolvere tensioni all’interno del team che stanno cominciando ad avere impatto negativo anche sulle performance nei progetti e le relazioni con i Clienti.

Oramai è chiaro che lassù non hanno alcuna capacità di agire come team: mi domando quanto questo atteggiamento sia legato a questioni culturali e storiche della civiltà olandese. Quel che è certo (almeno secondo Wikipedia) è che come nazionale di calcio, nonostante la quantità di talenti che sono stati capaci di mettere in campo, non hanno mai vinto un cacchio tranne un campionato europeo nel 1988.

Appena tornato da una settimana di ferie mi vedo quindi impegnato in una piccola sessione di coaching, andando a rispolverare un vecchio executive summary del 2005 con il quale informavo il management (R.C. e H.G., se ci ripenso…) della delicata situazione in cui versavano 7 progetti presso Clienti a cui avevamo avuto l’ardire di vendere il parto della mente malata del Product Dept. di allora. Un cosiddetto software in cui sono state convogliati 20M$ di ricerca e sviluppo per poi tirare la catena e ammirare il tutto finire giù per lo scarico. Nel tour svolto presso ciascuno di quegli sventurati Clienti fui coinvolto insieme al collega L.C. di cui parlai già qui.

Insomma, ho girato il documento ai cari P. e J. accompagnando il messaggio con alcune regole da seguire quando si scrive un executive summary, che, non dimentichiamolo, si presuppone venga letto da manager appartenenti al livello “director” o superiore ovvero con poco tempo da perdere, allergici ai dettagli, iper-impegnati, interessati solo al nocciolo della questione blah blah.

Eccole:

  • fate un bel respiro e tenete a bada le emozioni
  • adottate una struttura semplice, logica e sequenziale. Per esempio: Introduzione, Background, Stato Attuale, Raccomandazioni/Opzioni
  • rimanete ancorati ai fatti, presentando solo quelli rilevanti per il caso che state presentando
  • evidenziate rischi e le opportunità legate al dominio decisionale dell’executive manager. Per esempio: budget, margini di guadagno, disponibilità delle risorse, impatti organizzativi, strategia
  • evitate i particolarismi e le affermazioni che possano rivelare conflitti personali. Caso tipico: la dialettica venditore / tecnico
  • se presentate cifre usate tabelle semplici con al massimo 3-4 colonne, evidenziando il KPI di interesse per l’executive manager
  • usate il controllore grammaticale
  • fate stare tutto in una o al massimo due pagine A4

Che ne è stato del mio Executive Summary del 2005?

Ah, saperlo! Il dato di fatto è che di quei sette progetti ne sopravvisse solo uno e ancora mi domando come potemmo sopravvivere noi.

BABOK v2.0

Pubblicato in Business Analysis da pigreco314 il 4 Aprile, 2009

Il 31 Marzo 2009 è stata rilasciata la BABOK (Business Analysis Book Of Knowledge) v2.0. I membri della IIBA la possono scaricare gratuitamente dal sito dell’associazione mentre i non iscritti possono acquistarla per 29.95 USD.

iiba_member1L’esame per la certificazione CBAP (Certified Business Analyst Professional) continuerà a essere basato sulla BABOK v1.6 fino al 31 Luglio 2009, dopodiché seguirà la versione 2.0.

La presentazione SlideShare qui sotto vi spiega quali sono i passaggi necessari per candidarsi all’esame CBAP.

Un trimestre disastroso

Pubblicato in Azienda, Progetti da pigreco314 il 3 Aprile, 2009
Fire: Disaster in the city © millzero.com

Fire: Disaster in the city © millzero.com

Il primo trimestre fiscale dell’anno si è chiuso l’altro giorno in modo disastroso con risultati che definirei estivi, anzi balneari: nel senso che di solito fatturiamo queste cifre tra luglio e settembre quando molti dei nostri clienti chiudono per ferie, i consulenti sono in vacanza ecc.

Quasi quasi inauguro la nuova categoria del “Perché mi rattristro” per i post.

Pur nell’ecatombe finanziaria che abbiamo sperimentato possiamo tuttavia trovare qualche motivo di consolazione. Infatti, le cause del tracollo sono essenzialmente legate ai mancati introiti di due soli progetti che se avessimo potuto fatturare ci avrebbero portato molto vicino al piano finanziario del trimestre.

La storia di uno di questo due progetti era nota da circa due mesi, quando un impedimento circa le condizioni contrattuali che stavamo negoziando (mentre il progetto, per accelerare i tempi e adempiere alle necessità del Cliente, era già iniziato) ci ha fatto realizzare che non avremmo visto i soldi derivanti dalle attività di consulenza fino a Giugno 2009: stornati circa 200K dal forecast. Boom.

Come definireste la decisione di mantenere le risorse impegnate su questo progetto anche a fronte di un deferimento imprevisto dei pagamenti? Probabilmente in molti modi: uno di questi è che si è trattato di una decisione strategica motivata dalla necessità di accontentare un Cliente chiave per il nostro business e non solo. Ok. Sottoscrivo.

Il secondo progetto (un grosso Cliente petrolchimico) attendeva di vedere riconosciute attività eseguite sin dal 2008 che per una storia iper-contorta di allocazione di budget, riduzione e storno del medesimo, stato confusionale di alcuni decision makers erano state svolte senza la copertura di un ordine. L’obiettivo era quindi di far emettere l’ordine da parte del Cliente, registrarlo  e immediatamente richiedere la firma per approvazione delle attività pregresse in modo da fatturare subito dopo.

Cosa è andato storto in questo caso?

Come si sia potuti arrivare al 30 Marzo 2009 senza avere l’emissione di un ordine che mancava dal 2008 è cosa che trascende le mie facoltà intellettive.La cosa divertente qui è che giustappunto il 30 Marzo l’ordine siamo riusciti ad ottenerlo, dopo averlo quasi prelevato fisicamente all’ufficio acquisti. Ci restava quindi un giorno per poter conseguire le firme sulle attività svolte. Peccato che la persona preposta alla firma, il 31 Marzo era irreperibile, in trasferta da qualche parte in Liguria. Anche in questa situazione abbiamo deciso scientemente di svolgere un discreto volume di attività (80K circa) senza avere l’ordine da parte del cliente, pur contando di ottenerlo prima della fine del trimestre. Il fatto che alla fine non si arrivato ha avuto quindi un impatto piuttosto pesante e imprevisto sul forecast.

Imprevisto.

Se l’ordine fosse arrivato due mesi prima, un mese prima, due settimane prima della fine del trimestre, la mancata fatturazione si sarebbe potuta considerare uno spiacevole imprevisto. Ma se ci trastulliamo con il dannato ordine fino a quasi l’ultimo giorno utile concedendo solo 8 ore lavorative per le restanti formalità necessarie a fatturare, un esito positivo della vicenda avrebbe quasi del miracoloso.

Insomma: in entrambe le situazioni che hanno fatto la differenza tra il successo e il tracollo di questo trimestre, direi che poco ha a che fare con l’inaspettato o l’accidentale e molto con la decisione strategica di consentire, dato il tipo di relazione che vogliamo mantenere e sviluppare con il Cliente, l’esecuzione di attività di consulenza sapendo che la fatturazione sarebbe stata a rischio. Decisione che come ho detto posso anche sottoscrivere.

Ecco perché il giorno 31 Marzo 2009 poco prima di mezzogiorno, quando tre dei quattro responsabili del business europeo si ritrovano in una stanza a discutere su come presentare la situazione al Senior Management e uno dei tre se ne esce con una roba del tipo: “Dirò che non sono arrivati alcuni sign-off dei progetti”, mi incazzo.

Alcuni sign-off?!

Perché cercare ancora di nascondere la polvere sotto il tappeto? Perché non spiegare che questi risultati derivano da decisioni dolorose ma consapevoli che non pregiudicano il nostro livello di controllo del business?

Una posizione del genere la sottoscrivo. La solita scusa del bambino che ha fatto la marachella, no.

Pensavo che questi retaggi dell’era R.C. ce li fossimo lasciati alle spalle e invece vedo che c’è ancora il complesso della stanza dei bottoni e della solitudine della leadership.

Probabilmente è la nostra Azienda che non ha mai instillato nei manager una cultura della collegialità e delle decisioni condivise.

La vera notizia in realtà è un’altra: il silenzio assordante del mio capo che a quanto pare è poco interessato a temi così aridi come i risultati finanziari.

Last.fm #3

Pubblicato in Last.fm da pigreco314 il 1 Aprile, 2009
a r t i s t a  -  b r a n o  -  a l b u m

Loquat – Swingset Chain -  It’s Yours To Keep (2004): una delle più belle canzoni che mi sia capitato di ascoltare di recente

Pelle Carlberg – Riverbank – Everything. Now! (2005)

Lucky Soul – One Kiss Don’t Make A Summer -The Great Unwanted (2007)

Voxtrot – Long Haul – Raised By The Wolves (2005)

Airliner – Everything That’s You – The Last Days Of August (2002)