Como detectar un verdadero programador senior

Este tema es un poco rebuscado, ya que muchos de los que trabajan en el ambiente de contratar personal desconocen los aspectos técnicos y es por ello que se crea la problemática de no poder diferenciar un programador experto tan fácilmente.

guagua

Yo soy de los que tienen la idea que un currículum es una carta de mentiras donde uno puede ser un súper héroe pero existen puntos clave que te sugiero puedas tomar en cuenta para detectar si un programador es senior o no:

  1. El currículum: el currículum es un medio que presta a la persona a cometer mitomanía pero igual puede la persona misma ahorcarse sola por medio de este. Un currículum lleno de lenguajes de programación es la primera señal de que la persona no tiene nada de senior, así de simple.Es más factible un currículum lleno de herramientas, frameworks o librerías que se engloben a 2 o 3 lenguajes de programación, que todo un libro de colección de lenguajes de programación que no lo hace un experto solo un mentirosillo.
  2. El trabajar en equipo: es poco común que una persona indique en una entrevista de trabajo, cuanto y como ha trabajado en equipo. El trabajar en equipo es de las cosas primordiales, la mayoría de desarrollos son en equipo, y si la persona demuestra que ha trabajado con equipos en lugar de ser un programador solitario (esos programadores que se sienten estrellas) es otro punto extra para demostrar que es un programador senior, un programador senior no es un súper hombre es solo una persona que sabe hacer las cosas bien.
  3. Arquitectura de Software: el conocer conceptos fundamentales de la arquitectura de software, desde básicos como el UML, tipos de arquitecturas, patrones de diseño es tan importante como el saber programar, y a un nivel de senior es algo que debe conocerse por ley.
  4. Base de datos: un senior sabe diseñar una base de datos de cero, también sabe utilizar procedimientos, triggers y funciones en un lenguaje relacional, eso es básico, no digo que sea un DBA pero si tener el nivel de diseñar bien la estructura de la base de datos. Si no sabe hacer esto, esta lejísimos de ser un senior.
  5. Tipos de sistemas: las personas pueden ser senior cuando han resuelto distintos tipos de sistemas, si una persona se la ha pasado haciendo puntos de venta que siempre es lo mismo, el mismo tipo de problema, eso lo aleja demasiado a ser un senior. Un programador senior ha creado sistemas distintos, viéndose en la problemática de diferentes escenarios a los cuales pudo resolver.
  6. Modelo de procesos: si la persona no conoce un modelo de procesos ya sea CMMI, MoProSoft u otro, es probable que no realice software de calidad (es probable porque he conocido personas que no utilizan nada de esto pero crean su propio modelo de procesos sin saberlo y su software es bueno, no excelente pero si es bueno). El no separar el desarrollo del software en procesos indica un sinónimo de ser novato.
  7. Control de versiones: un senior sabe y conoce distintos programas o herramientas de control de versiones de código, si la persona en su vida ha utilizado esto, está lejos de ser un senior. También está lejos de ser un senior una persona que conoce programas de control de versiones pero no le sirve de mucho, nunca sube sus avances (he conocido muchos así y que han perdido hasta 3 semanas de trabajo porque se descompuso su computadora).
  8. Documentar: las personas que no documentan no respetan su trabajo, por lo tanto no son senior (abre un software creado por ti sin documentar hace 2 años, y veras a que me refiero). Documentar el software es tan importante como codificar (esto incluye los comentarios en el código), no documentar el software es crear algo que más tarde nadie sabrá cómo se realizó y se deberá invertir tiempo en ingeniería inversa (como los platillos de marcianos de Roswell).
  9. Honestidad: la honestidad de decir: “No, ese tiempo de entrega es imposible”, la honestidad de decirle al líder de proyecto o al cliente: “eso no está dentro del presupuesto”. La honestidad de saber las limitaciones personales representadas al tiempo del desarrollo son más benéficas que decir si a todo, se beneficia el cliente por no esperar algo que no se le dará, se beneficia el equipo de desarrollo por no involucrarse en tareas imposibles respecto al tiempo, y se beneficia la empresa ya que no quedara mal con nadie. Un senior es honesto en este aspecto.

Existen algunos otros puntos, pero estos para mi son lo primordial para identificar a un senior de un mentirosillo.

¿Cómo obtener los correos de una cuenta de Gmail con php? #imap

En php existe un módulo llamado imap dedicado a las conexiones a correos, este módulo contiene un conjunto de funciones que nos ayudan a realizar esta tarea fácilmente.

Pero antes tenemos que cambiar la siguiente configuración en nuestra cuenta de Gmail para permitir a una aplicación externa conectarse.

Primero(con sesión creada en gmail para hacer estos cambios claro) debemos activar la opción de permitir conexiones de aplicaciones externas en la siguiente liga:

https://www.google.com/settings/security/lesssecureapps

Seleccionamos Activar y Guardar.

La segunda configuración es  para que Gmail nos permita conectarnos por el protocolo IMAP. Basta con que vayamos a la configuración de Gmail y seleccionemos la siguiente opción y demos guardar.

configuracion imap

En el siguiente código, realizo la conexión a una cuenta de Gmail por medio del protocolo imap y a la vez obtengo los asuntos de los correos.

Clase

class ObtieneMails{

	//usuario de gmail, email a donde deseamos conectarnos
	var $user="[email protected]";
	//password de nuestro email
	var $password="tuPasswordDeGmail";
	//inforrmación necesaria para conectarnos al INBOX de gmail,
	//incluye el servidor, el puerto 993 que es para imap, e indicamos que no valide con ssl
	var $mailbox="{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX";

	var $fecha="01-MAR-2015"; //desde que fecha sincronizara

	//metodo que realiza todo el trabajo
	function obtenerAsuntosDelMails(){

		//realizamos la conexión por medio de nuestras credenciales
		 $inbox = imap_open($this->mailbox,$this->user,$this->password) or die('Cannot connect to Gmail: ' . imap_last_error());

		  //con la instrucción SINCE mas la fecha entre apostrofes ('')
		  //indicamos que deseamos los mails desde una fecha en especifico
		  //imap_search sirve para realizar un filtrado de los mails.
		 $emails=imap_search($inbox,'SINCE "'.$this->fecha.'"');

		 //comprbamos si existen mails con el la busqueda otorgada
		 	if($emails) {
				 //ahora recorremos los mails
				 foreach($emails as $email_number)
				{
					 //leemos las cabeceras de mail por mail enviando el inbox de nuestra conexión
					 //enviando el identificdor del mail
					$overview=imap_fetch_overview($inbox,$email_number);

					//ahora recorremos las cabeceras para obtener el asunto
					foreach($overview as $over){

						//comprobamos que exista el asunto (subject) en la cabecera
						//y si es asi continuamos
						if(isset($over->subject)){

							//aqui pasa algo curioso
							//el asunto vendra con caracteres raros
							//para ello anexo una función que lo limpia y lo muestra ya legible
							//en lenguaje mortal
							$asunto=$this->fix_text_subject($over->subject);

							//y aqui simplemente hacemos un echo para mostrar el asunto
							echo utf8_decode($asunto)."n";
						}
					}

				}
			}

	}

	//arregla texto de asunto
	function fix_text_subject($str)
	{
		$subject = '';
		$subject_array = imap_mime_header_decode($str);

		foreach ($subject_array AS $obj)
			$subject .= utf8_encode(rtrim($obj->text, "t"));

		return $subject;
	}

}

Ejecución

//creamos el objeto
$oObtieneMails= new ObtieneMails();

//ejecutamos el metodo
$oObtieneMails->obtenerAsuntosDelMails();

 la función imap_search contiene muchísimas variantes para realizar filtrados en los correos y todos los pueden ver dando clic aquí.

Realizar una petición Post con Php enviando Json como contenido del mensaje.

Para realizar una petición Post enviando contenido Json en php, podemos utilizar la curl_init() la cual nos crea una sesión de tipo cURL con la cual podemos establecer conexión a una url.

Junto con la función curl_init(), debemos utilizar la función curl_setopt() en la cual enviaremos las opciones de nuestra petición y el contenido json. Y también utilizaremos la función curl_exec() que es la que se encarga de mandar el mensaje.

Y para dejar todo esto claro a continuación un código sencillo en el cual voy comentando paso a paso que se está realizando:


                //url de la petición
		$url = 'https://pato.com/login';

		//inicializamos el objeto CUrl
		$ch = curl_init($url);

		//el json simulamos una petición de un login
		$jsonData = array(
			'usuario' => 'pato', //código fijo
			'password' => 'pato123456'
		);

		//creamos el json a partir de nuestro arreglo
		$jsonDataEncoded = json_encode($jsonData);

		//Indicamos que nuestra petición sera Post
		curl_setopt($ch, CURLOPT_POST, 1);

		 //para que la peticion no imprima el resultado como un echo comun, y podamos manipularlo
		 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		//Adjuntamos el json a nuestra petición
		curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);

		//Agregamos los encabezados del contenido
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

		 //ignorar el certificado, servidor de desarrollo
                  //utilicen estas dos lineas si su petición es tipo https y estan en servidor de desarrollo
		 //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                 //curl_setopt($process, CURLOPT_SSL_VERIFYHOST, FALSE);

		//Ejecutamos la petición
		$result = curl_exec($ch);

Nota: La línea comentada: “curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE)” sirve para peticiones a servidores https desde un servidor de desarrollo el cual no tiene modo seguro.

¿Cómo animar el scroll del navegador al dar clic en una liga o menú? #jquery #javascript

Ver ejemplo.

Para realizar un movimiento del scroll en el navegador de forma animada, vamos a hacer uso de la función anímate de jquery(puedes visitar mi entrada donde hablo a fondo de esta función) y también haremos uso de la función offset para obtener el valor de nuestro elemento destino.

El siguiente código hace posible la animación del scroll de una manera rápida y fácil:

Html


<!-- menu para dar clic -->
    <div style="height:50%; width:120px; position:fixed; top:100px; font-size:20px; background:#000; color:#fff; opacity:.5; padding:10px;">
    	<a href="#opcion1"  class="scroll">Ir a opcion 1</a><br />
        <a href="#opcion2"  class="scroll">Ir a opcion 2</a><br />
        <a href="#opcion3"  class="scroll">Ir a opcion 3</a><br />
        <a href="#opcion4"  class="scroll">Ir a opcion 4</a><br />
        <a href="#opcion5"  class="scroll">Ir a opcion 5</a><br />
        <a href="#opcion6"  class="scroll">Ir a opcion 6</a><br />
    </div>

    <!-- los elementos destino -->
    <div style="height:500px; background:#fff;">
    	<p id="opcion1">Un pato</p>
    </div>
     <div style="height:500px; background:#eee;">
    	<p id="opcion2">Dos pato</p>
    </div>
     <div style="height:500px; background:#ddd;">
    	<p id="opcion3">Tres pato</p>
    </div>
     <div style="height:500px; background:#ccc;">
    	<p id="opcion4">Cuatro pato</p>
    </div>
     <div style="height:500px; background:#bbb;">
    	<p id="opcion5">Cinco pato</p>
    </div>
     <div style="height:500px; background:#aaa;">
    	<p id="opcion6">Seis pato</p>
    </div>

Javascript


$(document).ready(function(){	
  $(".scroll").click(function(event){					 
 //bloqueamos la función del anchor original					 
 event.preventDefault();					 
 //dirigimos de manera animada al id del anchor					 
 $('html,body').animate({											 
 //le indicamos al scroll vertical que se dirija al objeto con el id											 
 //guardado en el anchor a su posición top.											 
 scrollTop:$(this.hash).offset().top											 
 },1000);	
});
});

Ver ejemplo.

Nota: la función offset nos sirve para obtener la posición de un elemento, en este caso el top de elemento respecto a la página.

¿Cómo utilizar prompt() de javascript? Mensaje de alerta con input text para escribir

La función prompt(), es una función de alerta de javascript, la cual tiene un comportamiento de mostrar un mensaje y a su vez un input text(caja de texto) en el cual el usuario puede capturar un texto. El texto capturado puede ser guardado en una variable y con esta realizar la acción deseada.

Se utiliza de la siguiente manera:


//El primer parametro es el texto a mostrar, el segundo es el texto por defecto en el input text
var texto = prompt("¿Cual es tu nombre?", "Texto por defecto");

//comparamos el texto obtenido, sea distinto a el texto por defecto
if(texto!="Texto por defecto")
  alert("Tu nombre es: "+texto)

¿Cómo utilizar confirm() de javascript? Alerta de confirmación

La función confirm() de javascript nos permite abrir una alerta en la cual tenemos la opción de confirmar o rechazar alguna pregunta, y dependiendo de la respuesta podemos hacer una acción u otra.

Se utiliza de la siguiente manera:


//la función confirm nos regresa true si es seleccionado si, sino nos regresa false.
if(confirm("¿Eres un pato?")){
alert("cua cua")
}else{
alert("no eres pato")
}

Crear un archivo de Excel en C# .Net sin utilizar las librerías de Office #SpreadsheetLight

Para crear un Excel sin utilizar los dlls de office podemos hacer uso de una librería OpenSource de nombre SpreadsheetLight que creó el MIT.

Primero podemos descargar la librería de la su página: http://spreadsheetlight.com/download/

O podemos descargarla mediante Nuget poniendo su nombre (SpreadsheetLight).

Esta librería tiene una dependencia y es importante agregar la librería DocumentFormat.OpenXml pero tiene que ser la versión 2.0 ya que la más nueva 2.5 no me corrió. Para eso pueden dar clic en este enlace http://www.microsoft.com/en-us/download/details.aspx?id=5124 y pueden descargar la versión 2.0. Ya instalado ese paquete ya solo van a la ruta donde se instaló que casi siempre es c:/Program Files/Open Xml SDK/V2.0/ y ya de ahí solo la agregan a sus referencias al proyecto.

A continuación pongo la siguiente clase como ejemplo con sus comentarios paso por paso.

using SpreadsheetLight;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CreacionDeExcelSinOffice
{
    class CreadorExcel
    {

        private string rutaArchivoCompleta = "";

        public CreadorExcel(string nombreArchivo)
        {
            //obtenemos la ruta de nuestro programa y concatenamos el nombre del archivo a crear
            rutaArchivoCompleta = AppDomain.CurrentDomain.BaseDirectory + "/" + nombreArchivo;

        }

        public void CrearExcel()
        {
            try
            {
                //creamos el objeto SLDocument el cual creara el excel
                SLDocument sl = new SLDocument();

                //creamos las celdas en diagonal
                //utilizando la función setcellvalue pueden navegar sobre el documento
                //primer parametro es la fila el segundo la columna y el tercero el dato de la celda
                for (int i = 1; i <= 10; ++i) sl.SetCellValue(i, i, "patito "+i);

                //Guardar como, y aqui ponemos la ruta de nuestro archivo
                sl.SaveAs(rutaArchivoCompleta);

            }catch(Exception ex){
                Console.WriteLine("Ocurrio una Excepción: "+ex.Message);
            }

        }

    }
}

Y de esta manera hacemos uso de la anterior clase.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CreacionDeExcelSinOffice
{
    class Program
    {
        static void Main(string[] args)
        {
            //creamos la clase enviandole el nombre del archivo que deseemos
            CreadorExcel oCreadorExcel = new CreadorExcel("patito.xlsx");
            //ejecutamos el metodo que crea el excel
            oCreadorExcel.CrearExcel();

            //Esto ultimo solo para verificar que todo fue bien.
            Console.WriteLine("Se creo el archivo, presiona una tecla para terminar");
            Console.ReadKey();
        }
    }
}

Con esta librería pueden hacer miles de cosas como poner imágenes, gráficos, colores etc. Pero para eso pueden ir directo a este enlace y ver los ejemplos que el mismo MIT da de ayuda.

¿Cómo obtener los datos de una conexión de base de datos guardada en app.config o web.config? c# csharp #visualstudio

Para obtener los datos de conexión a una base de datos que tenemos guardados en nuestro archivo app.config o web.config (dependiendo el tipo de proyecto), haremos uso de la clase ConnectionStringSettingsCollection y ConfigurationManager.

En nuestro archivo de configuración (app.config o web.config), se encuentra una sección en la cual estan guardadas las cadenas de conexión, por ejemplo:

<configuration>
  <configSections>
  </configSections>
  <connectionStrings>
     <add name="conexionPatito" connectionString="Data 
     Source=localhost;Initial Catalog=basededatosPatito;User 
     ID=pato;Password=patofeo" providerName="System.Data.SqlClient" />
   </connectionStrings>
</configuration>

Para acceder a esos datos y saber cual es el servidor o el nombre de la base de datos, a continuación escribo una clase comentada paso por paso:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace Pato {
    /// <summary>
    /// Clase encargada de la capa de datos del modulo de configuracion de conexion
    /// Héctor de León
    /// 07/01/2013
    /// </summary>
    class Conexion {
        //atributos
        public string servidor = "";
        public string usuario = "";
        public string password = "";
        public string baseDeDatos = "";

        //nombre de la conexión a modificar
        private string nombreConexion = "conexionPatito";

        /// <summary>
        /// obtiene los datos de la conexión para ser utilizados en el formulario
        /// </summary>
        /// <returns></returns>
        public bool getData() {
            bool exito = false;
            // se obtienen las conexiones
            System.Configuration.ConnectionStringSettingsCollection connections = ConfigurationManager.ConnectionStrings;

            //si existe por lo menos una conexión continuamos
            if (connections.Count != 0) {

                //Recorremos las conexiones existentes
                foreach(ConnectionStringSettings connection in connections) {
                    //asignamos el nombre
                    string name = connection.Name;
                    //obtenemos el proveedor, solo por demostración, no lo utilizaremos ni nada.
                    string provider = connection.ProviderName;
                    //obtenemos la cadena
                    string connectionString = connection.ConnectionString;

                    //comparamos el nombre al de nuestro atributo de la clase para verificar si es la cadena
                    //de conexión que modificaremos
                    if (name.Equals(nombreConexion)) {

                        //separamos la conexión en un arreglo tomando ; como separador
                        string[] sC = connectionString.Split(';');
                        foreach(String s in sC) {

                            //separamos por el simbolo = para obtener el campo y el valor
                            string[] spliter = s.Split('=');
                            //comparamos los valores
                            switch (spliter[0].ToUpper()) {

                                case "DATA SOURCE":
                                    servidor = spliter[1];
                                    break;
                                case "USER ID":
                                    usuario = spliter[1];
                                    break;
                                case "PASSWORD":
                                    password = spliter[1];
                                    break;
                                case "INITIAL CATALOG":
                                    baseDeDatos = spliter[1];
                                    break;

                            }
                        }

                    }
                }
            } else {
                Console.WriteLine("No existe la conexión");

            }

            return exito;
        }
    }
    

Ahora de esta manera la podemos utilizar:


//creamos nuestro objeto
Conexion oConexion = new Conexion();

//ejecutamos el metodo
oConexion.getData();

//imprimimos el resultado
Console.WriteLine("servidor " + oConexion.servidor + " base de datos: " + oConexion.baseDeDatos + " usuario: " + oConexion.usuario + " password: " + oConexion.password);

Nota: Recuerden agregar arriba: using System.Configuration;

Si tienen alguna duda en comentarios pueden preguntar.

Y como siempre el código es para explicar no es la manera formal de hacerlo (por los atributos públicos :().