Archivo

Posts Tagged ‘ingeniería social’

Procesamiento del lenguaje natural con NLTK para Ingeniería social automatizada

febrero 17, 2015 7 comentarios

En una entrada anterior os hablaba de un proyecto que llevo estudiando desde hace algún tiempo para el análisis de emociones, dicho proyecto es “wefeelfine” y tal como os comentaba, cuenta con una API Rest que permite realizar varios tipos de consultas para obtener un listado de sentimientos recolectados en Internet. La recolección de datos que realiza dicha plataforma se basa en la ejecución de varios procesos de crawling para extraer y almacenar información de múltiples sitios en Internet, sin embargo, una de las cosas que más me ha llamado la atención es el procesamiento de los textos y las funciones utilizadas para determinar la polaridad de dichas palabras. La complejidad de un proceso de “stemming” (derivación y combinaciones de palabras) sobre el lenguaje natural no es una tarea sencilla, especialmente cuando hablamos de las características propias de cada lenguaje, al final ocurre que solamente nos podemos centrar en un conjunto limitado de lenguajes, tal como ocurre en “wefeelfine” que solo procesa los textos escritos en ingles y en castellano, aunque este último con bastantes deficiencias. Si estás pensando en desarrollar un proceso de minería de datos sobre alguna red social como Twitter, Facebook o cualquier otro sitio web en Internet, lo más probable es que te interese también extraer información útil a la que posteriormente le puedas aplicar algún tipo de análisis estadístico sobre marcas, tendencias o de carácter histórico/evolutivo. En cualquier caso, es necesario aplicar técnicas de “Procesamiento del lenguaje Natural” o NLP (Natural Lenguage Processing) por sus siglas en ingles, las cuales permiten aplicar patrones a un texto concreto y extraer información de interés (no confundir con NLP: Neuro-Linguistic Programming). Antes de continuar, viene bien explicar en qué consiste NLP y cómo se puede utilizar la librería NLTK en Python.

¿Qué es NLP?

Se trata de un conjunto de técnicas que permiten el análisis y manipulación del lenguaje natural. Dada la complejidad intrínseca que acompaña cualquier proceso de NLP, muchas de las técnicas automatizadas están relacionadas con el uso de la IA (Inteligencia Artificial) y las ciencias cognitivas. Para aplicar las técnicas más comunes en NLP, la librería NLTK (Natural Language Tool Kit) permite que cualquier programa escrito en lenguaje Python pueda invocar a un amplio conjunto de algoritmos que sustentan las principales técnicas de NLP para la generación de métricas, frecuencia de términos, polaridad negativa/positiva de frases y textos, entre otras muchas técnicas.
Existen algunos
términos comunes en NLP que se deben comprender antes de poder aplicar cualquier técnica y entender los resultados que arrojan, dichos términos resultarán de lo más lógicos, pero si no se tienen en cuenta a la hora de programar, pueden resultar confusas las funciones y resultados arrojados por NLTK.

Token: Se trata de la unidad más simple de procesamiento y representa una palabra en el texto.
Sentencia: Secuencia ordenada de tokens.
Tokenización: Se trata del proceso de segmentar una sentencia en cada uno de los tokens que la componen. Aunque puede ser un proceso simple para textos escritos en algunas lenguas, especialmente en el caso de las románicas cuyo token separador es un espacio, en otras lenguas como las altaicas, extraer los tokens de una sentencia es un proceso mucho más complejo debido a la sintaxis y semántica de los escritos en dichas lenguas.
Corpus: Cuerpo del mensaje que se encuentra compuesto por un conjunto de sentencias.
Part-of-speech (POS): Dependiendo de la semántica del lenguaje, cada token que compone una sentencia puede ser un verbo, un adjetivo, un pronombre, un articulo, etc. Un POS es simplemente una clasificación para cada token dentro de una sentencia, de esta forma es posible identificar el significado de cada token y las partes clave de cada sentencia.
Árbol: Todos los textos están compuestos por varias sentencias y cada sentencia tiene varios tokens con sus respectivos POS. Un árbol parseado incluye cada una de las dependencias de las sentencias y cada parte del texto. Es una forma de ordenar cada uno de los elementos del “corpus” de una forma que sea fácil de consultar.

Ahora que se ha expuesto la terminología básica, lo siguiente es conocer las principales técnicas definidas en un proceso NLP.

Etiquetado de POS: Una de las principales labores en un proceso de NLP, es identificar cada una una de las sentencias de un texto y clasificar cada uno de los tokens con sus correspondientes POS. Un “POS Tagger” es una rutina que se encarga de crear un diccionario con cada uno de dichos tokens y sus correspondientes POS. Por ejemplo, si la sentencia “El coche es rojo” es procesada por un POS Tagger el resultado es el siguiente: {“El” : AT , “coche” : NN , “es” : VB, “rojo” : JJ}
Donde cada POS asume los siguientes valores:
AT : Artículo
NN : Sustantivo
VB: Verbo
JJ: Adjetivo.

Parsers:
Un parser se encarga de producir un árbol de tokens con sus correspondientes POS partiendo de una sentencia determinada. Muchos de estos parsers depende un POS Tagger antes de poder generar un árbol.

Morfología:
Consiste en el proceso de catalogar cada token de una sentencia y extraer sus “morfemas” y “
raíces” para posterior análisis. Para comprender lo anterior, es necesario saber que cada token tiene una morfología que determina la estructura interna de la palabra. La morfología de una palabra puede dar lugar a nuevas palabras a partir de su morfema base y en todo caso, es importante diferenciar la morfología de la sintaxis de una palabra, ya que la morfología intenta determinar la estructura interna de las palabras, mientras que la sintaxis explica las normas para crear oraciones y textos.

Traductor:
Se trata de unas las principales aplicaciones de NLP, en la que partiendo de un texto escrito en un lenguaje determinado, es posible conseguir su traducción en otro lenguaje. Es una tarea compleja y requiere que el texto origen se encuentre correctamente
construido y cada bloque semántico del “corpus” se encuentre perfectamente redactado para conseguir una traducción legible en otro lenguaje. Google Traductor es uno de los servicios más completos y mejor implementados (que conozco) que utiliza parsers y POS Taggers avanzados para conseguir la traducción más exacta posible.

Instalación y uso básico de NLTK

La instalación del proyecto NLTK puede realizarse fácilmente utilizando PIP o easy_install.

sudo pip install -U nltk

Una dependencia opcional que también puede instalarse con PIP es numpy. Para verificar que ha quedado correctamente instalada, basta con importar el módulo ntlk y si no se aprecia ningún error, se puede asumir que el proceso de instalación ha ido bien.

Por otro lado, además de la librería también es necesario instalar una serie de ficheros y diccionarios con patrones para varios tipos de estructuras gramaticales llamados “corporas”, dichos ficheros se instalan de forma independiente por medio de un gestor de descargas que puede iniciarse utilizando el modulo nltk

>python
>>>import nltk
>>>nltk.download()


Invocando a “download” se abre una ventana en la que se pueden gestionar todos los ficheros “corpora” en diferentes
categorías. Si es la primera vez que se utiliza nltk, se realizará la descarga de dichos ficheros.
Los corpus principal
es que se suelen utilizar en el procesamiento de texto son conocidos como “gutenberg”, el cual incluye una selección de 18 textos del proyecto Gutenberg (http://www.gutenberg.org/) y contiene más de 1.5 millones de palabras. Para consultar los textos de gutenberg incluidos en el corpus de NLTK, se pueden ejecutar las siguientes instrucciones.

>>>from nltk.corpus import gutenberg

>>>print gutenberg.fileids()

['austen-emma.txt',

'austen-persuasion.txt',

'austen-sense.txt',

'bible-kjv.txt',

'blake-poems.txt',

'bryant-stories.txt',

'burgess-busterbrown.txt',

'carroll-alice.txt',

'chesterton-ball.txt',

'chesterton-brown.txt',

'chesterton-thursday.txt',

'edgeworth-parents.txt',

'melville-moby_dick.txt',

'milton-paradise.txt',

'shakespeare-caesar.txt',

'shakespeare-hamlet.txt',

'shakespeare-macbeth.txt',

'whitman-leaves.txt']

Ahora es el momento de comenzar a utilizar la librería y para ello, se puede utilizar el siguiente script, el cual se encarga de pintar por pantalla cada uno de los textos del proyecto gutenberg, el número de caracteres, el número de tokens, el número de sentencias y el número de veces que un item del vocabulario aparece en una sentencia.

from nltk.corpus import gutenberg
for fileid in gutenberg.fileids():
    num_chars = len(gutenberg.raw(fileid))
    num_tokens = len(gutenberg.words(fileid))
    num_sents = len(gutenberg.sents(fileid))
    num_vocab = len(set(w.lower() for w in gutenberg.words(fileid)))
    print str(num_chars) + " - " + str(num_tokens) + " - " + str(num_sents) + " - " + str(num_vocab)

Aunque se ha utilizado un corpus que se encuentra implementado en NLTK, también es posible utilizar uno propio y de hecho, es lo más común para realizar diferentes tipos de análisis sobre los datos de un texto. Para ello se pueden utilizar las clases PlaintextCorpusReader o BracketParseCorpusReader.

from nltk.corpus import PlaintextCorpusReader
import nltk
wordlists = PlaintextCorpusReader("/home/adastra/Escritorio/textos", '.*')
wordlists.words('prueba.txt')
print "Sentences: "+str(len(wordlists.sents()))
for sentence in wordlists.sents():
    tokens = nltk.word_tokenize(str(sentence))
    tagged_tokens = nltk.pos_tag(tokens)
    verbs = 0
    for tagged in tagged_tokens:
        token, tag = tagged
        if tag == 'VBP' or tag == 'VB':
            verbs += 1
    print "Tokens: "+str(len(tokens)) + " - Verbs: "+str(verbs)</td>

El script anterior lee el fichero “prueba.txt” que se encuentra en el directorio “/home/adastra/Escritorio/textos” y se encarga de contar el número de sentencias, el número de tokens por sentencia y los verbos de cada sentencia, los cuales están marcados con el tag “VBP” o “VB”.

Estas son solamente algunas de las características incluidas en NLTK y me dejo muchas, muchísimas cosas que se pueden hacer con esta librería y que entran en el campo de la lingüística y el análisis de datos.
Antes de terminar con este articulo, os indico brevemente un proyecto que utilizan NLTK y que cuenta con algunos servicios que pueden utilizarse por medio de peticiones HTTP planas. Dicho proyecto es “text-processing”. Desde la URL http://text-processing.com/demo/ pueden apreciarse 4 ejemplos del procesamiento de texto en lenguaje natural, siendo el más interesante, desde mi punto de vista, el que corresponde con el análisis de sentimientos. Como comentaba antes, dicho servicio se puede invocar directamente por medio de una petición HTTP utilizando el método POST, algo que se puede hacer con cualquier lenguaje de programación e infinidad de herramientas, entre las que se incluyen wget y curl.

>curl -d “text=spain is different” http://text-processing.com/api/sentiment/

{“probability”: {“neg”: 0.38781650900239895, “neutral”: 0.59783687451926548, “pos”: 0.61218349099760105}, “label”: “neutral”}

Como se puede apreciar, el parámetro “text” es el que incluye el texto que la plataforma debe procesar y el resultado es una estructura JSON con el porcentaje que indica qué tan “negativa”, “positiva” o “neutral” es la frase. En este caso, se ha enviado el texto “spain is different” y como se puede apreciar en el resultado, la plataforma determina que el texto es neutral, aunque el porcentaje de “positivismo” es del 61% frente a un 38% de “negatividad”. Al parecer, ni la plataforma, ni NLTK son capaces de distinguir la ironía.

Todo esto puede ser muy interesante para procesos automatizados de ingeniería social que permitan recolectar información de sitios en internet como Twitter o Facebook y determinen la polaridad de los mensajes de ciertas cuentas y además, determinar si las condiciones climáticas en la hora y lugar desde donde se publico el tweet han podido tener algún tipo de influencia.
Esta y otras ideas, se desarrollarán en mayor detalle en próximos artículos.

Un saludo y Happy Hack!
Adastra.

Registro y análisis de emociones con Wefeelfine – Ingeniería social automatizada

diciembre 9, 2014 3 comentarios

El campo de la psicología y todo lo relacionado con los fenómenos socio-culturales siempre me han parecido muy interesantes en los que creo que hay mucho por hacer, especialmente desde el punto de vista de la informática, ya que estamos hablando de un campo del conocimiento que aun no ha alcanzado el grado madurez que tienen otros campos del conocimiento humano. No obstante, existen muchos documentos y herramientas que permiten comprender mejor la naturaleza de las emociones humanas y la forma en la que pueden afectar el comportamiento de una persona. La ingeniería social es una de dichas herramientas y se basa en una serie de principios generales que son transculturales y que suelen aplicar a un porcentaje de la población bastante alto, sin embargo su enfoque, como seguramente ya lo sabes, consiste principalmente en detectar las vulnerabilidades que pueda tener una persona en varios niveles, así como también para la detección del engaño. Los ingenieros sociales suelen conocer bastante bien los principales rasgos psicológicos y culturales de las personas con las que tratan, tal es su conocimiento sobre el comportamiento y la psique humana que son capaces de “cambiar” su modo de hablar, de expresarse y de transmitir ideas a las personas con las que se comunican con el fin de generar un sentimiento de confianza y conexión a su interlocutor. Se trata de una habilidad que en muchas ocasiones es innata en una persona, es simplemente su forma de ser y suelen generar un ambiente amigable y jovial allí donde vayan. Muchas personas son así por naturaleza, inmediatamente nos generan sentimientos agradables y nos sentimos más relajados y dispuestos a transmitir información. Los mejores ingenieros sociales son aquellos no fuerzan las cosas y que con una habilidad asombrosa controlan el flujo de los acontecimientos y las conversaciones, dando lugar a situaciones que les resultan favorables y muy ventajosas. Si bien suelen ser habilidades que son innatas en la mayoría de ingenieros sociales, no significa que no puedan ser desarrolladas comprendiendo cada uno los puntos vitales del Social Engineering Framework, solamente hace falta practica y mucha paciencia, pero al hablar de practica, no me refiero a utilizar SET desde casa y crear el típico Applet malicioso, me refiero a hablar con la gente que te rodea y tratar de conocer su “mindset” o conjunto de habilidades, características y rasgos psicológicos.

Ahora bien, como resulta evidente, las emociones juegan un papel central cuando hablamos de relaciones humanas. Lo que sentimos por otras personas impactan directamente en nuestro comportamiento y además, con el tremendo auge de las redes sociales, parece ser que hoy en día todo el mundo se siente mucho más a gusto expresando lo que piensan o sienten en Facebook, Twitter o otro cualquier sitio en Internet como blogs o foros que hablando personalmente con la gente. Es algo que siempre me ha parecido de lo más curioso y desde hace varios años, aprovechando la abrumadora cantidad de frases cargadas con diferentes tipos de sentimientos de personas que escriben en Internet, se ha creado un proyecto que desde mi punto de vista es uno de los mejores proyectos informáticos relacionados con el estudio y categorización de las emociones humanas, se trata de wefeelfine.org

Wefeelfine es una plataforma muy completa que se encarga de analizar blogs, foros, redes sociales con perfiles públicos y otros tipos de espacios personales en los que las personas transmiten sus ideas y se expresan, se trata de una herramienta de exploración de emociones a escala global. Además de recolectar información, su plataforma puede ser consultada en cualquier momento y admite varios tipos de filtros relacionados con el genero de las personas, edad, ciudad, o incluso una serie de emociones muy concretas, tal como se puede apreciar en las siguientes imágenes.

feeling1

Nube de sentimientos recolectados por wefeelfine.org

feeling2

Aplicando los filtros: Sentimiento=tense, Genero=Femenino, Edad=Entre 30 y 39 años, Condiciones climáticas=Todas, País=España, Fechas=Todas

Por otro lado, cuenta con varias vistas que permiten visualizar la información de la forma en la que resulte más cómoda para el usuario, tal como se indica en el apartado “movements”: http://wefeelfine.org/movements.html

Personalmente, la característica que me parece más interesante de la plataforma son los servicios REST que se encuentran definidos para que cualquier desarrollador pueda consultarlos. La API para poder invocar a dichos servicios de forma correcta se encuentra definida en el siguiente enlace: http://www.wefeelfine.org/api.html y no requiere ningún tipo de autenticación y/o autorización, son servicios abiertos que cualquiera puede utilizar en un momento dado.

Tal como se aprecia en la siguiente imagen, es posible utilizar un navegador web para invocar a cualquiera de los servicios disponibles e inspeccionar la respuesta para ver los datos que ha devuelto.

feeling3

Invocación a la API de wefeelfine desde un navegador web

Ahora bien, lo más común es crear rutinas que invoquen a dichos servicios para automatizar el proceso de consulta y en ese sentido, es posible utilizar cualquier lenguaje de programación ya que solamente es necesario realizar una petición HTTP y parsear la respuesta. El siguiente script es un buen ejemplo del uso de Python para consultar y parsear algunos de los servicios disponibles en la API de wefeelfine.

import requests 
from bs4 import BeautifulSoup 
def search(api, text): 
    response = requests.get(api) 
    soup = BeautifulSoup(response.content, 'lxml') 
    feelings = soup.feelings.find_all("feeling") 
    print text 
    for feeling in feelings: 
        if feeling.has_key("feeling"): 
            print "[*] Sentimiento: %s " %(feeling['feeling']) 
        if feeling.has_key("sentence"): 
            print "[*] Sentencia: %s " %(feeling['sentence'])                
        if feeling.has_key("postdate"): 
            print "[*] Fecha: %s " %(feeling['postdate'])                
        if feeling.has_key("posturl"): 
            print "[*] URL Origen: %s " %(feeling['posturl'])                
        print "\n" 
search("http://api.wefeelfine.org:8080/ShowFeelings?display=xml&returnfields=imageid,feeling,sentence,posttime,postdate,posturl,gender,born,country,state,city,lat,lon,conditions&limit=10","[*] Consultando los ultimos 10 sentimientos registrados") 


search("http://api.wefeelfine.org:8080/ShowFeelings?display=xml&returnfields=imageid,feeling,sentence,posttime,postdate,posturl,gender,born,country,state,city,lat,lon,conditions&feeling=sad&city=madrid&limit=10&gender=female", "[*] Consultando los ultimos 10 sentimientos registrados de personas con genero 'femenino' que se sienten 'felices'") 

La función “search” es la que se encarga de utilizar la librería “requests” para ejecutar una petición HTTP contra el servicio REST indicado y parsear la respuesta utilizando la librería BeautifulSoup, la cual se encuentra en formato XML.

Es un script muy simple y que refleja la cantidad de información que se puede extraer de la plataforma. Aunque muchos de los sentimientos registrados se encuentran en ingles, los sentimientos expresados en castellano en blogs, redes sociales y cualquier otro sitio web en Internet, quedan prácticamente excluidos de la plataforma, ¿Acaso os estoy dando ideas para un próximo proyecto? ;-).
Es una plataforma muy interesante y el estudio realizado por los investigadores que han montado la plataforma es simplemente brillante y para aquellas personas a las que nos interesan los temas relacionados con la informática, el hacking y las ciencias humanas como la filosofía y la psicología, puede resultar muy entretenido. Os recomiendo su lectura: http://wefeelfine.org/wefeelfine.pdf

Un Saludo y Happy Hack!

Lenguaje verbal y no verbal en las empresas

mayo 28, 2014 Deja un comentario

Las relaciones humanas son complejas. Los humanos somos seres cambiantes que respondemos a estímulos que activan determinadas zonas de nuestros cerebros y nos hacen comportarnos de formas que en muchos casos, no es posible medir con exactitud u objetivamente. No somos tan predecibles como cualquier ordenador, al que se le ingresan instrucciones y se ejecutan inmediatamente con muy poco margen a errores lógicos. Los vínculos que establecemos con otras personas, son mucho más intensos y permanentes que las conexiones que existen entre ordenadores y además, manejamos muchas más variables que influyen en nuestro comportamiento, tales como los factores ambientales y socio-culturales. Las relaciones humanas son las que realmente impulsan los movimientos y las causas más importantes que han provocado los progresos más impresionantes de los últimos años, no las máquinas. Imaginaros por un segundo, qué seria de la informática hoy en día si no existieran comunidades de usuarios y desarrolladores, imaginaros que el software privativo fuera la idea predominante y nadie compartiera lo que hace con sus colegas o amigos, ¿Qué seria de la informática? Sin duda, algo muy distinto a lo que conocemos hoy en día.
Los humanos somos una especie realmente interesante y sorprendente, tanto en su grandeza como en su bajeza y desde mi perspectiva; que no deja de ser la perspectiva de un informático, es especialmente interesante leer sobre los estudios de investigadores como Paul Ekman, Christopher Hadnagy o Daniel Goleman, así como entender los conceptos del “Social Engineering Framework” que a diferencia de lo que muchos opinan, no solamente se centra en engañar, estafar o ganar accesos no autorizados a zonas restringidas como en cualquier producción hollywoodense, sino que son principios que nos pueden ser útiles en nuestro día a día, nos ayudan a entender mejor a las personas que nos rodean y a nosotros mismos. Si aplicamos esos mismos principios psicológicos a nuestras relaciones personales, rápidamente podemos darnos cuenta que para establecer relaciones solidas, es necesario tiempo, dedicación, confianza y sobre todo, honestidad. Esto aplica para todo, no solamente en la vida personal, también en la vida profesional, pero es justo ahí donde nos encontramos un gran “pero”, una gran “excepción”.

Llevo casi 10 años trabajando en empresas de informática, he trabajado en varios sitios y siempre he desempeñado labores técnicas porque es lo que me interesa. En todos los sitios por los que he pasado me he encontrado con lo mismo (en mayor o menor medida): El lenguaje verbal casi nunca corresponde con el lenguaje no verbal y lo que realmente la gente quiere expresar, siempre se engalana con un lenguaje lleno de palabras cuidadosamente seleccionadas para no ofender ni cabrear a nadie. Evidentemente, lo que se esconde detrás de esa aparente educación y tacto a la hora de decir las cosas, es el miedo. Miedo a perder el empleo, miedo al “qué dirán”, miedo a que los demás no tengan una imagen “perfecta” de lo buenos que somos profesionalmente hablando, etc. Ese miedo se traduce posteriormente a un entorno completamente viciado, en el que todo el mundo se esfuerza por ocultar algo, por no enseñar a los demás lo que realmente piensan o sienten, por aparentar cosas que no son, en fin… la gente se esfuerza demasiado en disimular. En un entorno como ese todos pierden y la pregunta lógica es: ¿Por qué razón esto persiste y se ha vuelto una constante en las empresas? En mi opinión, se debe a los intereses de aquellos que solamente saben gestionar sus “chiringuitos” en base al miedo y no en base al conocimiento y las habilidades de sus empleados. Así de claro y así de simple.

Por ejemplo, veamos algunos casos comunes que he visto y desafortunadamente, sigo viendo en entornos empresariales. Cualquier parecido con la realidad de alguno, es pura coincidencia:

  1. Jefe solicitando un esfuerzo a su equipo.Lo que el lenguaje verbal dice:
    Jefe: El tiempo que teníamos disponible para entregar el proyecto se ha terminado y aun quedan muchos frentes abiertos que necesitamos cubrir entre todos. Tenemos un compromiso con el cliente que estamos obligados a cumplir. Sé perfectamente que todos y cada uno de vosotros lo habéis dado todo para llegar hasta donde hemos llegado, pero necesitamos hacer un esfuerzo extra para conseguir el objetivo de la entrega.
    Equipo: <resignación y caras largas>
    Lo que el lenguaje no verbal dice:

    Jefecillo de algo: Vamos a ver, os habéis estado tocando los huevos todo este tiempo y me han metido un jalón de orejas por no tener esta mierda terminada. Necesito que vosotros acabéis el trabajo que queda pendiente para que los amos no me aprieten más la corbata y pueda seguir viviendo tranquilamente, vamos… como he hecho todo este tiempo.
    Pues eso, a currar cabrones!! <Estremecedor sonido de un látigo rasgando pieles>
    Equipo: Ya estamos otra vez con las gilipolleces. Puta crisis! Cuando será que se acaba para mandarles a tomar por culo e irnos a otra empresa.

  2. Un Simple saludo en las mañanas.Lo que el lenguaje verbal dice:

    Compañero 1: Buenos días.
    Compañero 2: Buenos días.

    Lo que el lenguaje no verbal dice:

    Currito 1: Estoy hasta los huevos de tirarme todos los días más de 1 hora en transporte público para llegar hasta aquí. No me explico porque tenían que montar esta oficina en un extremo de la ciudad. Además, no he dormido bien, estoy cansado y francamente no me apetece estar aquí.

    Currito 2: ¿Me lo dices o me lo cuentas? Ayer me he tenido que quedar hasta las tantas; horas extra que por supuesto no me van a pagar y por si fuera poco, llego y lo primero que recibo es un correo de mi jefe con más curro que tengo que sacar para hoy.

  3. Comercial intentando ganar un proyecto o vender un producto:
    Lo que el lenguaje verbal dice:
    Comercial: Tenemos equipos con un alto perfil técnico y con una dilatada experiencia tanto en el área del desarrollo de software como en temas relacionados con auditoria de sistemas. Somos una empresa que se caracteriza por ser eficaz y eficiente en el desempeño de su actividad profesional y tenemos en nomina a los mejores profesionales que se dedican a crear proyectos de última tecnología con un énfasis especial en satisfacer las necesidades de nuestros clientes.
    Cliente: <Silencio absoluto, únicamente se escucha el eco de la voz del comercial> <Después de unos instantes de silencio> Muy bien, suena interesante pero tendremos que hablar detenidamente sobre las condiciones del acuerdo.Lo que el lenguaje no verbal dice:
    Vende-Motos: No tengo ni puta idea de cual es la diferencia entre un programa y una patata, ambos se comen, ¿no?. No se que es un equipo de desarrollo, ni mucho menos lo que es un sistema, pero me han dicho que el equipo que tenemos es muy bueno. ¿Nos contratas? Te invitamos a copas y lo que haga falta!
    Abusón: Hijo mío, ¿estas escuchando lo que nos estas contando?… Espera, ¿Has dicho copas y lo que haga falta? Mira, nos interesa lo que nos cuentas y el proyecto es tuyo si nos haces un descuento del 80%, que es que con la crisis todo anda muy mal.
  4. Definiendo el alcance de un proyecto.Lo que el lenguaje verbal dice:

    Cliente: Quiero que el sistema sea capaz de conectarse con todos los sistemas de mi organización y me genere reportes parametrizables, fáciles de manejar y con muchas gráficas que me muestren las rutas más criticas en términos de recursos, proveedores, insumos y tiempos de espera. Además, quiero que el sistema sea capaz de monitorizar todos los ordenadores de la organización y permita detectar el momento en el que un ordenador ha dejado de funcionar por un problema de hardware. Otra funcionalidad critica que también quiero que el sistema controle, es que sea capaz de conectarse a las máquinas de café de todas las plantas del edificio y permita saber cuál de todas tiene el mejor café, que no hay nada que me moleste más que un café con mal sabor a primeras horas de la mañana.

    Jefe de Proyecto: Creo que podemos cumplir con las necesidades del proyecto, ¿Qué opinas consultor experto de mi compañía?

    Consultor Experto: Estoy de acuerdo, pero creo que para cumplir íntegramente con todos los objetivos expuestos, tenemos que utilizar X tecnología (basada en Java o .Net, casi seguro), ya que es la arquitectura más eficiente, robusta, estable, eficaz, escalable, precisa y genial.

    Lo que el lenguaje no verbal dice:

    Niño escribiendo su carta a los reyes: Quiero que me lo hagáis todo hecho. Que haya un botón gordo que haga todo por mi. Si se me acaba la viagra, que sea capaz de ir a donde haga falta para comprármela, que cuando ataque el hambre, sea capaz preparar un bocadillo de jamón con queso y me consuele cuando me sienta triste.

    Jefecillo de algo: Esto se ve complicado… Eh tú, di algo que para eso te he traído, no podemos quedar mal!.

    Tecno-paleto haciéndose pasar por informático: No tengo ni puta idea de lo que me están hablando, de hecho, no tengo ni idea de cómo funciona un ordenador, pero claro, no puedo decir que no sé o quedarme callado, así que mi estrategia consistirá en despistar con palabrejas y haciéndoles creer que controlo mucho de tecnología. Total, el problema será para los desarrolladores, así que me da igual. Lo importante es venderme bien y tener un subidón de auto-estima viéndoles como admiran mis supuestos conocimientos. Si, lo sé. Soy patético.

  5. Empleado “quemado” pasando de su jefe.Lo que el lenguaje verbal dice:
    Jefe: ¿Has visto el correo? Nos han enviado una incidencia reportada por un usuario. Nos comenta que la escala de grises que tiene la pantalla principal le parece fea y quiere que la cambiemos por un “azul aguamarina” para que tenga la sensación de estar en una playa mientras navega por nuestra web. ¿Has podido echarle un vistazo?

    Soporte Técnico: No, he tenido mucho lío hoy y no he podido revisar tu correo.
    Jefe: Ok, échale un vistazo cuanto antes, es un tema que nos urge resolver.

    Lo que el lenguaje no verbal dice:

    Jefecillo de algo: Eh, ppissssstt pisstt, que he visto que tienes poco curro y me he buscado la gilipollez más rebuscada que hay para mantenerte ocupado, pero estoy notando con total asombro, que pasas completamente de mi y de mis deseos.
    Currito soportando idioteces: Pues si, paso de ti porque tengo cosas más importantes que hacer. Si estas aburrido, te sugiero que te dirijas al cuarto de baño con un libro de informática en mano y te quedes allí todo el día leyendo. Falta que te hace!

    Jefecillo de algo: Ah, ya veo. Pues, ahora quiero que dejes lo que sea que estés haciendo y te centres en hacer lo que te digo. Que aquí el que manda soy yo!

  6. Súper Jefe explicando a un desarrollador las bondades en un nuevo proyecto.
    Lo que el lenguaje verbal dice:Super Jefe: Tenemos un proyecto que creemos que se ajusta perfectamente a tu perfil y a tus necesidades profesionales. Es un proyecto en el que vas a aprender muchísimo y vas a poder afinar tus habilidades. Creemos que es el proyecto ideal para ti y queremos verte crecer profesionalmente en nuestra compañía.

    Desarrollador Novato: Claro, suena muy interesante y también creo que encaja con mis metas profesionales.

    Desarrollador Experimentado: <Silencio absoluto>

    Lo que el lenguaje no verbal dice:
    Gran Corbata: Tenemos un marrón de tres pares y quiero que te lo comas tú, pero eso si, con buen rollito. Me da igual lo que respondas, ahí vas a ir de cabeza te guste o no.

    Currito sin pelos en los huevos: Buah, mi jefe me valora un montón. Por fin alguien que aprecia mis habilidades como uno de los más grandes hackers de los últimos tiempos. Esto es solo el comienzo, lo siguiente será trabajar para la NSA o la NASA. Bueno, ya veremos quien me ofrece más dinero.

    Currito quemado: Otro marrón que me cae a mi. Puff… estoy cansado de proyectos que no me aportan nada interesante técnicamente y que encima, me venden como si fueran la hostia.

  7. Compañerismo en fechas de entregas.Lo que el lenguaje verbal dice:

    Técnico con problemas: Que tal tío, mira es que ahora estoy con la funcionalidad “B” que depende de “A”, que tengo entendido que la has hecho tú y resulta que me esta dando errores a la hora de utilizarla, con lo cual se me dificulta avanzar. ¿Me puedes echar un cable un momento a ver si a ti se te ocurre porque puede ser?

    Técnico ocupado: Hombre, cuando yo lo probé en mi local funcionaba perfectamente, fíjate en lo que sale en los logs de tu funcionalidad a ver si ves algo, porque la funcionalidad que yo desarrolle funcionaba cuando la subí al repositorio y si ahora falla es que alguien la ha tocado. Yo ahora estoy con otras cosas y no te puedo ayudar, pero si sigues atascado, me dices y lo vemos.

    Técnico con problemas: Ok, gracias!

    Técnico con problemas <10 minutos después>: Ya he visto el problema en la funcionalidad “A” que habías subido y lo he corregido, lo subo nuevamente al repositorio para que te actualices cuando puedas.

    Técnico ocupado: Ok, luego le echo un vistazo.

    Lo que el lenguaje no verbal dice:
    Compañero Jodido: Tío, lo que has hecho esta fallando y me impide continuar, ¿podrías revisarlo por si ves algo que te haya faltado por subir?. Sabes que tenemos que entregar para ayer y ahora mismo, estoy perjudicado porque no funciona lo que has hecho.

    Compañero Cabrón: La funcionalidad es perfecta en si misma. ¿Que cómo lo sé? Joder, la he hecho yo, así que por definición es perfecta. Lo que pasa es que eres un paquete que no sabe programar y claro, para ti es imposible entender la magnificencia de mi código.
    Compañero Jodido: Ok, gran señor programador, pues tendré que revisar lo que has hecho con detenimiento para ver en donde está el fallo.

    Compañero Jodido<10 minutos después>: Ya he visto lo que has hecho mal y lo he corregido con mis manitas. Te lo comento para que te duela un poquito el orgullo.

    Compañero Cabrón: No me lo creo, ahora mismo voy a ver lo que has subido! Como te has atrevido a profanar mi código perfecto con tu deficiente lógica! Que sepas que esto ha sido una afrenta contra mi profesionalidad y gran talento.

  8. Interacción entre pentester y cliente
    Lo que el lenguaje verbal dice:Pentester: En este documento indica que la auditoria cubrirá los casos “A” y “B”. Descubriremos cualquier vulnerabilidad en dichos contextos y te daremos un reporte, sin embargo, los casos “C” y “D” pueden ser igualmente críticos y se recomienda realizar pruebas sobre dichos casos también.

    Cliente: Nos interesa los casos “A” y “B”. Sobre los casos “C” y “D”, hablaremos más adelante.

    Pentester: De acuerdo, pero es importante puntualizar que son casos que pueden incluir vulnerabilidades criticas y que no se cubrirán en la auditoria que realizaremos en “X” fecha.

    Cliente: Tendremos en cuenta tus recomendaciones.

    <POCO TIEMPO DESPUÉS, UNA VULNERABILIDAD EN EL CASO “E” COMPROMETE INFORMACIÓN DE NEGOCIO CRITICA DEL CLIENTE>
    Cliente: La auditoria ha sido ineficaz y no se han reportado todas las vulnerabilidades que debería haber incluido.

    Pentester: La auditoria ha sido completa, pero tal como se ha indicado en su momento, no nos hacemos responsables por los entornos y casos de prueba que no se han pactado en el acuerdo firmado.

    Lo que el lenguaje no verbal dice:

    Currante de la seguridad: Vamos a ejecutar una auditoria completa sobre los casos “A” y “B”, pero en los casos “C” y “D” te puedes encontrar con un problema serio, que lo sepas.

    Cliente rácano: No creo, me interesan los casos “A” y “B”. Los demás casos no me preocupan. Voy a aflojar la pasta justa para tener un informe de seguridad que me permita dormir tranquilamente por las noches. Que si algo falla, es culpa tuya y te exigiré responsabilidades.

    Currante de la seguridad: Ok, como tu digas. Los demás casos no están cubiertos y si hay un problema, el marrón te lo comes tú. Recuerda que la información es tuya y no mía, así que tú mismo.

    Cliente rácano: Vale, vale… lo apunto en mi libreta invisible.

    <POCO TIEMPO DESPUÉS, UNA VULNERABILIDAD EN EL CASO “E” COMPROMETE INFORMACIÓN DE NEGOCIO CRITICA DEL CLIENTE>
    Cliente rácano cabreado: Pero que ha pasao!! ¿y tu eres un hacker ético profesional? Esto es el puto caos! Hasta nuestro competidor más pequeño se está mofando de nosotros en nuestra cara! y con la pasta que te he pagado y van y se nos meten hasta la cocina!. El informe que me has dado es una mierda, no ha servido para nada el esfuerzo y el dinero invertido. Que sepas que nos has jodido el negocio y te voy a exigir responsabilidades legales.

    Currante de la seguridad: Te lo dijimos en su momento, pero por andar racaneando te han jodido vivo. Te lo hemos advertido y está por escrito, así que ahora no vengas a echarnos la mierda encima que no cuela. La responsabilidad ha sido toda tuya.

En todos los casos faltan dos cosas primordiales: HONESTIDAD y PROFESIONALIDAD. Valores que desafortunadamente brillan por su ausencia en muchas empresas dedicadas a la informática. Han sido muchas las ocasiones en las que he hablado con compañeros sobre estas cosas y siempre hemos llegado a lo mismo: Lo mejor es pasar de todo eso, hacer tu trabajo de la mejor forma que te sea posible e intentar ser buena persona, que no es más que colaborar con tus compañeros y entender que haces parte de en un equipo de trabajo, que ellos también son personas como tú, que tienen problemas y que lo pasan mal, exactamente igual que tu, ese que se sienta a tu lado también sangra si le pinchas. Piénsalo de ese modo y te será más fácil ponerte en su lugar. Sin embargo, los problemas de algunos que conforman las “capas altas”, no tienen solución inmediata. ¿Qué solución habría ante un jefe que desconoce por completo el termino “informática” y que con total arrogancia se cree superior a los técnicos por estar en las posiciones altas de una jerarquía mediocre? ¿Qué solución habría para un “consultor” que no solamente no quiere aprender nada, sino que además se cree que lo sabe todo o se vende como un experto? ¿Qué solución habría ante clientes y empleadores que se aprovechan de la situación actual para bajar los precios a costa de la calidad de productos y servicios? No he encontrado respuesta para preguntas como esas, pero sinceramente espero que las nuevas generaciones desarrollen verdaderas capacidades para la gestión y que no tengan problemas en investigar y aprender cosas nuevas, que se centren más en hacer bien su trabajo y menos en la “política” para ascender o mantenerse en una empresa, que apuesten por su auto-formación y que admitan con total sinceridad cuando no tienen conocimientos sobre alguna tecnología o tema concreto.
Hay demasiados “jefecillos” que creen que ser jefe es sinónimo de “vivir bien” y hacer un “dispaching” de todo el trabajo, así como “consultores” que creen que la informática es simplemente aprender dos palabrejas y hacerse pasar por experto sin tener ni puta idea de nada. Aun los hay que son buenos, que gestionan bien sus equipos de trabajo, con profesionalidad y un juicio adecuado, los hay que son expertos de verdad, esos que no les da miedo meterse con configuraciones o analizar código, esos que no tienen miedo de meterse en “el fregao” aunque tengan puesto un traje impecable. He tenido la oportunidad de trabajar con profesionales como esos y además de ser excelentes compañeros y jefes, son excelentes personas, pero desafortunadamente han sido muy pocos y cada vez hay menos porque prefieren irse a trabajar fuera. Desde mi punto de vista, hacen falta más informáticos y gestores de verdad, hacen falta más profesionales y menos farsantes.

Conclusión: Hace falta un cambio de mentalidad. Aprender a ser más honestos en el trato con nuestros compañeros de trabajo y clientes, del mismo modo que lo intentamos en nuestras vidas personales; evidentemente separando ambos contextos, tanto el personal como el profesional. De esa forma, a lo mejor, se podrá mitigar un poco el malestar que muchos sienten en sus puestos de trabajo, así como intentar ser más productivos y eficientes por medio del esfuerzo y la dedicación, que al final de cuentas son las principales características de un buen informático.
Hay que dejar hacer el subnormal en la fauna empresarial y empezar a ver que lo realmente importante, no es el color de la corbata del jefe de turno, sus afiliaciones políticas o sus “capacidades” a la hora de hacerle la pelota a “los de arriba”.

Saludos y Happy Hack!

Categorías:Uncategorized Etiquetas:
A %d blogueros les gusta esto: