Cómo ser feliz en el trabajo y en la vida

Actualmente vivimos en un mundo que corre raudo y veloz hacia ninguna parte. Cada uno tiene su experiencia que le lleva por su propio camino pero ese camino debería, cuanto menos, ser un camino feliz.

Me preocupa mucho que en las últimas semanas varias personas se hayan sorprendido porque ante su pregunta de «¿qué tal?» les haya contestado con un «muy feliz», acompañado de una gran sonrisa y de ningún «pero».

No soy psicólogo, ni coach, ni creo estar en posesión de la verdad universal. Sin embargo, supongo que en base a mi experiencia, he llegado en mi camino a un punto en el que me veo capaz de decir que soy y estoy feliz sin ruborizarme y es gracias a un truco que aprendí trabajando y que tiene una «fácil» aplicación a cualquier faceta de la vida.

Photo by Josh Felise

Vivimos rodeados de lo que algunos llaman «pornografía del éxito«.

Todos publicamos nuestros aciertos, las metas que hemos logrado, publicitamos los grandes momentos sin ningún tipo de pudor.

¿Quién no tiene en Facebook o Instagram a quien publica fotos de ensueño con su pareja? Aunque cambie de pareja cada mes.

¿Quién no sigue en Twitter o LinkedIn a alguna empresa o emprendedor que cuenta incesantemente cada pasito exitoso? Y puede que para ese bueno haya dado antes mil traspiés.

Es más difícil, sin embargo, ver a gente contando que ha fallado, que las cosas no han salido bien, o al menos no tan bien como cabía esperaba. Que no se ha hecho cima.

Esto no es una denuncia, es normal cuando se quiere parecer cool o vender. Es como con el chiste de aquel que tenía un caballo genial: le hacía el desayuno, llevaba los niños al cole, limpiaba, … Cuando por fin lo vende, el comprador le dice que todo eso no era verdad, que el caballo no hace nada más que comer y tirarse pedos, con lo que el vendedor le responde: tú sigue hablando así del caballo y verás a quién se lo vendes.

Sabiendo que es lo habitual, que la gente intenta vender, todos deberíamos ser conscientes de que no siempre lo que se cuenta representa del todo la realidad, de que tal vez esa llegada a la cima tenga algo de artificial. Sabiendo esto no deberíamos de fijarnos en sus éxitos a la hora de poner nuestras metas. No deberíamos esperar que como a ellos «todo nos salga genial», o precisamente que como a ellos «todo nos salga genial» sin ser así del todo.

Photo by Alexander Mils instagram.com/alexandermils

Y de esperar va el asunto, porque la mayor fuente de frustración e infelicidad que me he encontrado siempre en el desarrollo de proyectos, es una mala gestión de las expectativas.

Las expectativas son algo muy de cada uno, por eso es importante verbalizarlas al comienzo de los trabajos, para que todo el mundo espere los mismos resultados. Una cosa es comenzar a andar hacia arriba y otra esperar llegar al refugio con chimenea, al lago que queda a mitad de camino o a la cima.

Además, las expectativas son cambiantes. Cuando comenzamos a subir una montaña no sabemos si el tiempo cambiará, si nos torceremos un tobillo o si nos encontraremos un río que seremos incapaces de cruzar. Por esto es muy importante que ante cualquier eventualidad actualicemos las expectativas que tienen todos los implicados.

Y así con todo, las expectativas no siempre se cumplen pues cuando las establecemos y las actualizamos tendemos a ser ambiciosos, a buscar el máximo de lo que nos gustaría conseguir, por lo que no es nada malo dividirlas entre dos para tener una meta intermedia, un hito en el camino para que si sólo hemos llegado hasta él no nos sintamos tan frustrados y nos demos cuenta de que realmente hemos tenido éxito.

Photo by Jared Erondu

Gestionar las expectativas es algo que he ido aprendiendo proyecto tras proyecto, cliente tras cliente y equipo tras equipo. Unas veces ha salido mejor que otras y aún a día de hoy sigo aprendiendo matices y mejorando poco a poco. Pero es algo que tiene una aplicación sencilla en el día a día, ya sea cuando vamos a practicar un deporte, cuando conocemos a gente o cuando organizamos un cumpleaños sorpresa.

Aun así, tal vez no sea infalible. Hay quien dice que el propio hecho de «ser feliz» es una meta, y que a lo mejor nos deberíamos preocupar de estar bien, de ser un poco más felices… pero en cualquier caso, una buena gestión de las expectativas en el trabajo y en la vida nos hará más felices a nosotros y a todos los que nos rodean.

De mujeres en los premios Turing

Hace unos días, por casualidad observé un dato curioso a la vez que preocupante. El número de mujeres en los premios Turing es lamentablemente bajo, y lo volqué en Twitter en un hilo con un impacto completamente nulo. Por tanto, haré caso a las palabras del sabio Juan Hernando y cumpliré con eso de (parafraseando) si crees que algo es importante y quieres que perdure, escríbelo en tu blog.

Los premios Turing son unos premios que se dan a informáticos. Generalmente a quienes trabajan en algoritmia, protocolos, estructuras de datos, etc. en reconocimieto a su trabajo.

Aunque no viene al caso, los premios se llaman así en honor a Alan Turing quien os sonará por ejemplo por el famoso test de Turing que sirve para identificar si una inteligencia artificial es suficientemente avanzada.

Estos premios, se empezaron a dar en el año 66, y desde entonces se han dado a 54 personas. De estas, sólo 3 eran mujeres:

La primera mujer en recibir el premio fue Frances Elizabeth Allen por su trabajo en la optimización de compiladores. Además fue la primera mujer en llegar a ser socia de IBM y trabajó para la NSA.

Dos años después se lo dieron a Barbara Liskov por su trabajo en áreas como la abstracción de datos o enfrentarse al teorema CAP en sistemas distribuidos. Ahora está en el MIT y ha ganado otros premios notables.

En 2012 se lo dieron a la última, Shafrira Goldwasser, en un premio que le otorgaron junto a Silvio Micali. Se lo dieron por sus trabajos en criptografía y en complejidad (lo de los problemas NP).

No digo que la ACM (Asociación para la maquinaria computacional), que son quienes otorgan estos premios, discriminen a las mujeres de manera consciente. Sin embargo, hay muchas y muy buenas mujeres trabajando en tecnología desde siempre, de hecho la primera persona en la historia a la que se considera programadora es Ada Lovelace (una mujer), por lo que es claro que aunque sea de manera involuntaria esos números llevan a que hay alguna discriminación.

Además, resulta curioso que haya discriminación en unos premios que llevan el nombre de una persona discriminada, pues Alan Turing fue procesado y condenado por homosexualidad, lo que hizo que su carrera y su vida acabaran.

Recompensas para desarrolladores

Hablamos hace tiempo de distintos sitios en los que podías aprender a programar mientras jugabas. Hoy vamos a ver algunos sitios en los que para gamificar el desarrollo con sus tecnologías, te dan recompensas físicas a ciertos logros. A veces son unas simples (pero muy chulas) pegatinas, y a veces son cacharros con los que podrás jugar mucho más.

devRant duck

Por internet puedes encontrar algún recopilatorio e incluso hay alguna comunidad centrada en la obtención de recompensas (como codecuriosity y mulesoft), pero no conozco ninguno que tenga los premios o recompensas que se pueden conseguir específicamente en España, ya que algunas empresas distinguen entre países. Vamos a verlas:

  • En Codeship puedes conseguir merchan por usar su plataforma de integración continua.
  • En devRant puedes conseguir pegatinas o una bola anti-estrés si alguno de los mensajes que dejes en su comunidad de developers tiene más de 20 o 500 positivos. Si no quieres compartir nada, siempre puedes comprar en su tienda ¡y tienen patitos!
  • En Digital Ocean te dan unas pegatinas muy chulas de su mascota, sólo por rellenar una encuesta.
  • En Google Assistant te dan una camiseta si lanzas una aplicación, y te regalan uno de sus cacharros si consigues muchos usuarios, o si tus usuarios son recurrentes, o si pones tu aplicación en al menos dos idiomas.
  • En Product Hunt, si montas un evento o un hackathon, te mandan merchan para los asistentes.
  • En Hurricane Electric te dan una camiseta si te certificas como que sabes de IPV6.
  • En Scaleway te mandan una camiseta por usar su plataforma cloud.
  • En Datadog te mandan una camiseta por probar su plataforma de monitorización y análisis.

Estas son las que tengo fichadas ¿conocéis alguna otra?

All in one serverless solutions

There are a lot of platforms and applications that are providing serverless capabilities to our developments, avoiding us of thinking a lot about servers.

You can find services for serverless storage, serverless notifications, mailing, payments, forms, but it could be quite difficult integrate all of them into one single solution. What is the best way to have all possible functionalities in one only place and don’t do a lot of work?

all in one photo

Actually, you are able to use a lot of serverless functionalities from wide platforms like Google Cloud, AWS or Azure. Did you remember that article about Azure Serverless? That platform has a lot of high-level functionalities and services that can allow you don’t think about machines, operating systems, RAM, network, etc. when your app needs to scale. But the problem is almost the same, you have all those functionalities in a single platform but you have to do a lot of work to integrate them into one single solution.

There are some platforms that are ready to start working, providing you a lot of capabilities that are planned to work together. They could not be the best in performance or other facets, but they are really god to prototyping and to start working on your MVP accelerating your development. This is because they just work. Some of those are the following:

  • Firebase: Real-time database, authentication, hosting. A powerful platform for your mobile or web application.
  • Backendless: Real-time database, authentication, hosting.
  • Stamplay: «IFTTT For Back-End Development«.
  • Kinvey: Build your digital business faster with mobile Backend as a Service.
  • Syncano: An all-in-one platform to create real-time apps without a server.
  • Hoodie: Hoodie is a complete backend for your apps: develop your frontend code.
  • Para: Flexible and lightweight backend service for rapid prototyping, based on open source software.
  • Wolkenkit: It is a CQRS and event-sourcing framework for JavaScript and Node.js which fits perfectly with domain-driven design (DDD).

Did you know all of them? Look over them and be ready to run developing your next app, and if they are not complete enough for your needs, look for what you need. The Internet is full of serverless services.

¡El email marketing ha muerto! ¡Larga vida al email marketing!

Todos los que nos movemos en el negocio de la tecnología hemos tenido en algún momento alguna discusión sobre que el email marketing es un timo y que ya no funciona. ¿Es eso cierto? ¿Con qué se puede sustituir?

Es normal, que dados los porcentajes de apertura y de click en campañas de email, la gente sea reacia a invertir en ellas. La media es de 21.8% de apertura y 2.62% de click. A no ser que el precio sea muy bajo, menos de un 3% de click es para pensárselo muy mucho.

Sin embargo, puedo garantizar que hay casos en los que funciona y los porcentajes son mucho más altos. Lo sé porque lo he vivido.

Hace un par de semanas patrociné la Bonilista (el newsletter que escribe David Bonilla todos los domingos) para ofrecer mis servicios como autónomo. No tenía las espectativas muy altas (conociendo los porcentajes que veíamos antes), pero la verdad es que si conseguía un sólo cliente ya habría amortizado los 200€. El resultado no pudo ser más sorprendente.

Tenía en ese momento 8.180 suscriptores. Entre domingo, lunes y martes tuve unos 900 visitantes más de lo habitual, que se aproxima al dato que me da el análisis de campañas de GA. Depende del analytics que mire entre un 8 y un 12% vienen de los twits posteriores que puso recordando que yo había patrocinado la publicación de ese día. Echad las cuentas, son datos muy por encima de las medias. De ahí han salido 5 visitas comerciales, y 10 leads que quieren contactar en el futuro. Ya me han aceptado los dos presupuestos que he lanzado tras esas visitas, y lo mejor es que son proyectos chulos de verdad.

Mailchimp bonilista

Podría parecer la excepción que confirma la regla, pero no es así.

Por ejemplo, cuando estaba en eldiario.es vi como hacían especiales con muchas ONGs. ¿Y que tiene que ver eldiario.es y las ONGs conmigo y la Bonilista? Por lo menos dos cosas:

  • Tanto eldiario.es como la Bonilista envían correos que la gente espera recibir y que saben que llevarán contenidos de su interés.
  • El público objetivo de las ONGs coincide con el que lee eldiario.es, así como mi publico objetivo coincide con los lectores de la Bonilista.

No es que la Bonilista sea la panacea, probablemente si se anunciase una sastrería de trajes a medida, no obtuviese un gran resultado, pero si tu publico son los trabajadores del metal y los CEOs de PYMEs tecnológicas, ese es tu sitio. Yo ya se lo he recomendado a un par de empresas con las que trabajo ayudándoles en el desarrollo de negocio, cuyo público es ese mismo.

Por tanto, no es que el email marketing sea una mierda, es que hay que encontrar el sitio adecuado donde tú encajas. ¿Conocéis algún otro sitio con ese tipo de publico? ¡Estoy deseando hacer email marketing con ellos!

Desarrollo seguro: OWASP

Recientemente, he estado repasando los cursos que hay online, en universidades y en otras entidades sobre desarrollo seguro, viendo que casi todos se centran en OWASP (Open Web Application Segurity Project), lo cual está muy bien, pero se quedan en hablar del Top 10 de vulnerabilidades, y en realidad hay mucho más.
security photo

Está muy bien saber cómo se puede originar un fuego, pero es mucho más importante saber cómo actuar en cada caso o cómo se puede evitar que el fuego llegue a iniciarse ¿no? Con la seguridad en el desarrollo pasa lo mismo.

En el PDF que resume las vulnerabilidades, se pueden ver unos anexos con las responsabilidades de cada perfil (manager, developer y tester), y una pequeña guía para que una organización sea  segura. Esos anexos son muy importantes, puesto que nos ayudarán a ver si estamos haciendo las cosas bien o no.

Y bien, sabiendo los problemas que pueden surgir y la responsabilidad de cada uno para tener una empresa que practique desarrollo seguro ¿qué hacemos? Llegamos al que para mi es uno de los compendios más importantes que realiza este proyecto: OWASP Proactive Controls. En él se resumen las buenas prácticas que hay que realizar para funcionar de un modo seguro y evitar la mayoría de los incendios. Este es su propio Top 10:

  1. Verificar la seguridad pronto y a menudo
  2. Parametrizar las queries
  3. Codificar los datos
  4. Validar todas las entradas
  5. Implementar controles de autenticación y de identidad
  6. Implementar controles de acceso apropiados
  7. Proteger los datos
  8. Implementar logging y detección de intrusos
  9. Aprovechar frameworks y librerías de seguridad
  10. Manejo de errores y excepciones

¿Pones todos esos puntos en práctica? Sé que puede parecer difícil, pero profundizando un poco más, podréis ver que tienen también guías específicas de cómo hacerlo con cada tecnología, porque no es lo mismo estar haciendo una app para Android, que una web en PHP, y siguiéndolas podréis de un modo sencillo aseguraros de que estáis poniendo todo de vuestra parte para que vuestros desarrollos sean seguros.

Get to the point with Solidity

As I explained in my previous post about coding for Ethereum, there are a lot of ways to learn Solidity. However, most of them are really humdrum if you already know how to code, almost if you know javascript. So, let’s get to the point with Solidity looking the simplest structures you need to start coding.

ethereum photo

Solidity is based on javascript, but it also owns structures from other functional languages like Haskell and from object-oriented languages like Java. To do Dapps you need more than knowing the language because you need to know about patterns, security, how to compile and publish, and what actions cost more gas than others. Also, Solidity owns more reserved words than the explained below and more complex structures like inserting assembly inline, but with a little base of javascript and reading the following script (just 242 lines) you will be ready to start the backend of your very own distributed application over the Ethereum Virtual Machine.

pragma solidity ^0.4.19; //Version of the compiler

import "./otherContractsFile.sol";

contract ContractName { //Declaration of the basic unit of code
   /***Variables and funtions***/
   bool boolVariable;
   uint unsignedIntVariable;
   int intVariable;
   int intVariableWithValue = 10;
   uint16 unsigned16BitInt;
   uint256 unsignedIntVariable2;
   ufixed unsignedFixedVariable;
   fixed128x19 fixedVariableWith128bitsAnd19DecimalPoints;
   string stringVariable = "It can store any UTF-8 encoded string";
   address addressVariable; //addresses are used to store user accounts and contracts identifiers
   var aVariable = intVariableWithValue; //aVariable is defined as an int variable
   uint constant lustrum = 5 years;

   /*State variables are permanently stored in the EVM
    *between external function calls for this contract. 
    */
   uint stateVariable;

   function doSomething(uint uintParam) {
      /*Variables declared inside functions
       *are stored in memory and they are reset 
       *between different calls to the function.
       */
      uint functionVariable;
      
      functionVariable++;
      stateVariable = stateVariable + functionVariable;
      /*functionVariable = 1
       *stateVariable = 1 the first time this function is executed,
       *2 the second time this functions is executed, 3 the third, ...
       */
   }

   /***Collections and your own types***/
   uint[2] fixedArray;
   uint[] dynamicArray;
   mapping (address => uint) mapFromAddressToUint;

   enum EnumType {
      FirstValue,
      SecondValue,
      ThirdValue
   }

   struct StructType {
      uint uintField;
      string stringField;
   }
   StructType structVariable;
   StructType structVariableWithValue = StructType(10, "something");
   StructType[] structArray;

   function manageStructArrayByValue() {
      /*This variable is asigned by value (a copy is done)*/
      StructType memory myStruct = structArray[0]; 
      myStruct.uintField = 10; //structArray[0].uintField = 0;
   }

   function manageStructArrayByReference() {
      /*This variable is asigned by reference (a pointer is created)*/
      StructType storage myStruct = structArray[0]; 
      myStruct.uintField = 10; //structArray[0].uintField = 10;
   }

   uint[] public publicArray; //A public array is read-only publicly accessible by other contracts
   mapping (uint => string) public publicMap;

   function workWithArrays() private {
      uint[] myArray;
      myArray.push(1); //myArray = [1]
      myArray.push(2); //myArray = [1,2]
      uint newLenth = myArray.push(1); //newLenth = 3, myArray = [1,2,1] 
   }

   /*Functions are public by default, so you need to set them private
    *in order to keep your contract secure. In other case, functions
    *can be called (and executed) by other contracts.
    */
   function doSomethingPrivate(uint uintParam) private {
      //some code
   }

   /*Internal functions are functions that can be called from
    *contracts that inherit from this one.
    */
   function doSomethingInternal(uint uintParam) internal {
       //some code
   }

   /*Public functions can be called from anywhere.*/
   function do(uint param) public {
      //some code
      doSomethingPrivate(param);
      doSomethingInternal(unsignedIntVariable);
      doSomethingPrivate(10); //Can't call to doSomethingExternal
   }

   /*External functions can be called from external contracts
    *but not from inside this contract.
    */
   function doSomethingExternal(uint param) external {
      //some code
   }

   function ContractName() public { //this is a constructor but be carefull using them, they are not executed in some special cases
      //do something
   }

   function return10() returns (uint) {
      return 10;
   }

   function returnMultipleValues() returns (uint value1, uint value2) {
      value1 = 10;
      value2 = 20;
   }

   function returnMultipleValues2() returns (uint, uint) {
      return(10, 20);
   }

   function useMultipleValues() {
      uint value1;
      uint value2;
      (value1, value2) = returnMultipleValues();

      uint value4;
      (,value4) = returnMultpleValues2();
   }

   /*function throwsAnError(int a) private returns (int8) {
    *   return a + 1;
    *}
    */

   function addAndConvert(int a) private returns (int8) {
      return int8(a) + 1; //uses the 8 less significant bits of a
   }

   function addAndConvertIfIsInt8(uint a) private returns (uint8) {
      require(a <= 2 ** 8); //Throws an error if false
      return uint8(a) + 1;
   }

   /***Events***/
   event sthOccurred(uint param);

   function throwEvent() private {
      sthOcurred(10);
   }

   /***Modifiers***/
   //"view" can be used to identify functions that are not changing any data
   function returnInt() public view returns (int) {
      return intVariable;
   }

   //"pure" can be used to identify functions that do not access any data in the contract
   function add(int a, int b) public pure returns (int) {
      return a + b;
   }

   //"payable" is needed in order to receive Ether with a call
   function aFunctionThatCost() public payable {
      //this contract will own the ether sended at the end of the execution
   }

   modifier myModifier() {
      //some code to be executed before the function
      _; //this is a placeholder that indicates the point where the code of the function will be executed
      //some code to be executed after the function
   }

   function functionWithModifier() public myModifier {
      //some code to be executed in the place where the placeholder is set inside modifier's code
   }

   function otherFunctionsAndValues() private {
      keccak256("qwerty"); //returns a 256-bit hexadecimal with a SHA3 hash of the param
      //"qwerty" == "QWERTY"; Solidity can't compare strings. Instead you can do
      keccak256("qwerty") != keccak256("QWERTY");

      uint currentUnixTimestamp = now;
      1 minutes == 60;
      1 hours == 3600;
      //you also have available "days", "weeks" and "years" units

      address currentBlocMiner = block.coinbase;
      uint currentBlockDifficulty = block.difficulty;
      uint currentBlockGasLimit = block.gaslimit;
      uint currentBlockNumber = block.number; 
      uint currentBlockUnixTimestamp = block.timestamp;
      bytes32 theHash = block.blockhash(block.number); //only works for 256 most recent blocks excluding current
      bytes completeCallData = msg.data;
      uint remainingGas = msg.gas;
      address callerWhoInitiatesThisExecution = msg.sender;
      bytes4 firstFourBytesOfMsgData = msg.sig;
      uint numberOfWei = msg.value;
      uint gasPriceOfTheTransaction = tx.gasprice;
      uint senderOfTheTransaction = tx.origin;

      assert(1==2); //like require but for internal errors
      revert(); //abort and revert changes
   }

}

/***Inheritance and rehusability***/
contract A {
   function aFunction {}
}

contract B is A {
   function bFunction {
      aFunction();
   }
}

/*If you want to use an external contract, you need to define an
 *interface with the definition of the methods that you want to
 *use.
 */
contract InterfaceOfExternalContract {
   function functionExternalDefinition(uint param) external return (uint);

   function functionPublicDefinition(uint param) public return (uint);
}

contract ContractWichUsesTheExternalContract {
   address externalContractAddress = 0x...;
   InterfaceOfExternalContract externalContract = InterfaceOfExternalContract(externalContractAddress);

   function aFunction() {
      uint value = externalContract.functionExternalDefinition(1);
   }
}

And now, what are you starting to code?