Archivo de la etiqueta: programador

Optimiza el uso de tu memoria (mental)

¿Cuantas cosas sabes hacer a la vez? ¿y hacerlas realmente bien? ¿Y además en un tiempo aceptable? Antes de responder a estas preguntas, me gustaría que conocieras cómo funciona nuestra mente.

El cerebro está compuesto de bloques de memoria de cortisimo plazo o de trabajo, de corto plazo y de largo plazo. Cuando realizamos un trabajo utilizamos una combinación de todos estos bloques a la vez. Por ejemplo, un desarrollador de software necesita tener en la mente el lenguaje de programación a usar, el diagrama conceptual del proyecto que está modificando, el objetivo de la funcionalidad que está desarrollando y en la zona de cortísimo plazo el algoritmo que se está escribiendo en ese momento. Un ingeniero de soporte puede tener el sistema del cliente, los detalles del problema en cuestión y el producto del cual está dando soporte. Un comercial puede tener detalles del producto que vende y detalles del cliente al que quiere vender.

Bloques de memoria de un desarrollador concentrado
Bloques de memoria de un desarrollador concentrado

Contínuamente tenemos que reemplazar estos bloques. Esto puede ser  por una interrupción que provoca un cambio de contexto y necesitas modificar tu memoria de más corto plazo. Pero también puede ser cuando cambias a desarrollar otro programa, otra historia de usuario u otra funcionalidad, incluso por un cambio de lenguaje de programación. Cada cambio requiere que uno o más bloques de memoria se reemplacen. Y ese reemplazo tarda tiempo. Si es memoria a corto plazo puede tardar incluso más de 15 minutos pero si es memoria de medio plazo como el lenguaje de programación se puede tardar días en sustituirlo completamente.

Cambio de tarea en otro lenguaje de programación
Cambio de tarea en otro lenguaje de programación

Hasta que un bloque es completamente sustituido, el bloque tiene una mezcla de distintos contenidos. Es el momento en el cual se toman decisiones incorrectas y se cometen fallos. Es cuando lo justificamos a que no estamos completamente concentrado y se producen frustraciones.

Para tomar mejores decisiones, realizar un trabajo de mejor calidad y más rápido hay que reducir el WIP. WIP significa trabajo en curso (Work In Progress) y hay que intentar que como máximo se tenga una tarea en la cabeza,  o una característica nueva a la vez por equipo, o una incidencia de soporte a la vez. Ya existen herramientas como Kanban, GTD y la Técnica Pomodoro para ayudarte a enfocarte en una tarea o con un mínimo de trabajo a la vez. Pero ninguna de estas técnicas ayuda a decidir con qué tareas ponerse o qué trabajo empezar una vez se ha terminado para minimizar el reemplazo de la memoria de trabajo.

Para ello propongo hacer una lista de los 5  elementos que más se tienen en cuenta a la hora de realizar una tarea . En el ejemplo del desarrollador de sofware, haríamos esta lista:

  • El tipo de tarea a hacer: desarrollo, administrativo (emails, imputar,…) , test, formación…
  • El lenguaje de desarrollo a usar
  • La estructura del programa a modificar
  • El framework o API que se usa: ASPNET MVC, Backbone, Angular,…
  • Las características del cliente que usará la funcionalidad

Para cada característica distinta a la de la tarea que se ha terminado se suma un punto. Si hacemos un tipo de tarea completamente distinta tendríamos 5 puntos porque seguramente necesita reemplazar todos los bloques de memoria. Si es del mismo programa pero hay que cambiar de lenguaje es un punto por el cambio de lenguaje y seguramente otro por el cambio de framework llegando a 2 puntos. Cada vez que se elige una nueva tarea hay que evaluar los puntos de lo que podemos empezar dentro de las que tengan igual prioridad. Idealmente se elegirá una tarea del mismo lenguajes, del mismo programa, con el mismo framework y para el mismo cliente. De este modo reducimos el número de bloques de memoria a reemplazar consiguiendo un resultado con mejor calidad, en menor tiempo y sin frustraciones.

 

¿Está TDD muerto? Resumen del videodebate

Mientras hacen subtitulos para el Hangout entre David Heinemeier Hansson, Kent Beck y Martin Fowler, voy a escribir un poco lo que han hablado para que los que no entiendan el inglés, o no tienen los 30 minutos para verlo entero, puedan quedarse con las claves. En mi anterior artículo hablo de los artículos y tweets que empezaron la discusión.

El link al video es éste.

Empieza David hablando de los 3 problemas que ve al TDD: la insistencia en que los tests tienen que correr en milisegundos, que termina creando un diseño feo y complejo y que el bucle de rojo-verde-refactor es poco natural para el programador.

Kent cuenta que el TDD le da la confianza que necesita a la hora de dar un desarrollo por completado y funcionando. Sin TDD, uno se va a casa sin la seguridad de que el código que ha escrito funcione bien. Además le ayuda a pensar primero en el problema. Cuando no se tienen especificaciones concretas TDD sirve para empezar de lo más concreto (ejemplos en los tests) a la implementación más genérica.

David entiende en que Kent piense en la seguridad como un factor de felicidad del programador. Él mismo dice que le da prioridad a la felicidad del programador cuando empezó Ruby on Rails. Sin embargo, la seguridad de que todo va a funcionar es sólo un factor de felicidad del programador pero hay otros. El tener que cambiar el flujo de pensamiento a pensar primero el test antes de empezar lo ve como una forma de confundir al programador y no dejarle crear del modo que le es más natural. Además dice que la seguridad de que el código funciona no debería venir unicamente del TDD

Ante un ejemplo reciente de Kent sobre un uso idoneo del TDD, David responde que en los desarrollos que él hace no es normal tener un código tan aislado como el que Kent comenta. Que para poder conseguir un codigo perfecto testeable típico de un input consigue un output tiene que separar capas y capas y crear muchos mocks. Que tiene que hacer un gran sacrificio para conseguir ese código perfecto para TDD.

Kent afirma que en todo esto tiene que haber un balance. Hay que tener en cuenta el coste de aislarlo todo para testearlo de manera independiente y su beneficio. Que no hace falta hacer mocks de todo. Si tienes unos tests de objetos que usan otros objetos reales o un sistema real y se es capaz de tener así la prueba de si va o no va, es suficiente. Cuenta que mucha gente se queja de que el Unit Test no le deja refactorizar. Esto ocurre porque sus tests complejos que tienen mocks que devuelven mocks y como fruto estos tests están muy acoplados a la implementación.

Segun David, el problema está en la definicion de TDD segun algunos sectores del desarrollo. Estos sectores afirman cosas como que cualquier test tiene que estar basado en mocks y que si no usas TDD no eres buen profesional. Incluso que si el diseño del programa no está dirigido por tests, no es buen diseño. Para David es al contrario, TDD fuerza a tener un diseño no natural.

Martin Fowler, quedandose un poco en medio y actuando un poco como arbitro del debate, también dando su opinión más pragmática. Dice que hay en la calle muchas definiciones de TDD. Algunas de ellas dicen que todo tiene que estar con mocks. Sin embargo la realidad es que si no usa mocks y el test es util, perfecto. Dice que el TDD y el Unit test son dos cosas aisladas y hay que tratarlas como tal. Se puede hacer TDD sin que todo el codigo testeado esté aislado. Para él, como ya dijo en su artículo, lo importante es que el código sea autotesteable, que haya un botón que pueda probar todo el código. TDD está bien porque ofrece esto como uno de sus beneficios.  Está de acuerdo en que en ocasiones no se puede usar TDD, cosa que le apena ya que dice que es una herramienta que le gusta. También opina que incluso hay que separar conceptualmente el Unit testing aislado y el no aislado.

El debate termina barajando un posible futuro debate hablando unicamente de si el TDD crea un buen diseño o no.

 

 

 

En VSN buscamos C++ developer. Lo que no nos cabe en Infojobs

EN VSN estamos contratando. Necesitamos bastante urgentemente dos programadores C++. Quisiera ampliar aquí lo que no nos ha cabido en la oferta de Infojobs.

Analista/Programador Senior C++  – Programador Junior C++
Dos puestos, uno junior y otro aguerrido, un C++ Black Belt que mapee mentalmente el heap y stack sin siquiera levantar la ceja.

Empresa: Video Stream Networks S.L.
Nos dedicamos a hacer software para cadenas de televisión. Tenemos muchos clientes “pequeños” como televisiones locales y últimamente hacemos muchos clientes grandes como la productora Telson/Turner o Dorna, los que retransmiten el MOTOGP. Tenemos oficinas en varias partes del mundo y clientes en casi todos los lados. Nos falta el Ártico y algún rincón más.

Provincia:
Alicante – España

Concretamente en San Juan de Alicante. Hay facilidades de aparcamiento por ser un pueblo, acceso facil desde la autovía y tiendas cercanas de casi todo. Sólo nos echamos de menos un FNAC.

Perfil del Candidato:
Titulado en Ingeniería, preferiblemente en Informática o Telecomunicaciones o Licenciado en Ciencias (Físicas, Matemáticas)
Usamos regularmente conceptos avanzados cómo muestreo de señal digital, algorítmia avanzada, las capas de la comunicación TCP. Necesitamos que tengas una buena base de conocimientos técnicos y una mente bien entrenada.

Analista Programador – Programador C++ con al menos tres años de experiencia.
Te vamos a meter a saco a mantener un programa complejo y sacarlo adelante por lo que necesitamos que le des caña desde el primer día.

Capacidad para asimilar grandes proyectos y entender su código fuente rápidamente.
Como vas a mantener un programa que ya existe, debes tener facilidad en entender el por qué lo que hace. Nosotros te ayudaremos pero eres tú el que debes darnos la mayoría de respuestas. Si te mola bajarte proyectos del Github por el mero hecho de leerlos para ti esto será pan comido.

Buena capacidad comunicativa tanto hablada como escrita para el trabajo en equipo.
El C++ déjalo para el compilador. Tus compañeros necesitamos entenderte bien, y no digamos ya los que trabajan en otros departamentos.

Must have:

C++.
Como segunda (o primera) lengua madre

Aplicaciones visuales (GUI) sobre plataforma Windows (preferiblemente con MFC/Win32).
Crear botones, grids, ponerles textos comprensibles, elementos alineaditos…

Multihilos/Concurrencia/Tiempo real
Tengo que ser sincero. Te vas a tener que pelear con semáforos y sincronía de hilos.  La aplicación que vas a mantener necesita comunicarse continuamente con otros elementos y no puede pararse a pensar ni 40 milisegundos.

TCP / IP, Sockets.
Crear server, crear cliente, conectar, send buffer, receive buffer… ese tipo de cosas

SO Windows.
Entender bien cómo funcionan los hilos y sistema de ficheros en Windows sobre todo. Leer y escribir en registro y otras cosillas que tan poco gusta a los linuxeros.

Microsoft Visual Studio.
Esta será tu herramienta. Si ya la sabes manejar, y conoces sus secretos sabemos que serás más productivo desde el principio que si nunca lo has tocado.

INGLÉS
Esta claro que si sabes bien programar es muy probable que sepas inglés escrito. Sin embargo esperamos que te desenvuelvas bien también en el oral para poder contar contigo en todo tipo de situaciones. En ocasiones hay que llamar a algún cliente, a algun compañero que vive en otro continente, recibir formación en otro pais,….

Good to have:
(Lo que ya nos emocionará si lo tienes)

* Git, Subversion.
Tenemos la mitad de proyectos en Subversion pero los que mantendrás al empezar estan en GIT. Hacer PULL, PUSH, CLONE… Pero cuidado que yo odio los Feature Branches por lo que voy a estar muy atento de cómo lo usas.

* WxWidgets
Como objetivo de que sea multiplatarforma está hecho en xwWidgets… Lo sentimos

* Boost, STL
Esas herramientas que hacen del C++ un mundo mejor en el que vivir

* ActiveX, OCX, Interfaces COM.
CoCreateInstances y QueryIntefaces. Si te suenan nos harás tilín en la entrevista

* Conocimientos en los estándares, codecs y protocolos de streaming de video.
No sólo el DIVX, piratilla. En las teles usan muchos codecs distintos. Si no los conoces ya te irás familiarizando aqui.

* Java, C#.
Sobretodo el C# que es en lo que estamos basando los nuevos productos aunque el Java también nos será útil

* MS SQL Server, diseño de BD, procedimientos almacenados.
Todo necesita su persistencia y nosotros usamos SQL Server. Tendrás que crearte las tablas y lo que necesites tú mismo.

* Conocimientos sobre servicios REST, SOA.
Es a lo que estamos tendiendo, todo basado en servicios web con REST. Si sabes de qué hablamos cuando te lo preguntemos empezaremos con buen pié.

* ActiveMQ
(sigh)

* TDD, Refactoring, Código Limpio.
Es posible que en la entrevista hagas un kata con TDD. En VSN llevamos muchos años perfeccionando el cómo generar test y cómo hacer código limpio y estructurado. ¡ Muestranos lo que sabes y por lo menos a mí me tendrás en el bolsillo !

* Haber trabajado en un proyecto Open Source
Esto es propuesta mia.  Je, je. Si eres friki del desarrollo, sientete orgulloso y hablanos de cómo has pasado sabados por la noche peleandote con el código sólo por gusto.

Ofrecemos:

* Participar en las decisiones de diseño e implementación de los productos.
Desde el primer día. Pensamos que no existe idea mala y queremos oir tu voz en todas las reuniones.

* 6 Meses + 6 Meses + Contrato Indefinido e incorporación a proyecto estable.
Es un puesto que necesitamos y necesitaremos por lo que si lo haces bien tienes tu sitio asegurado.

* Salario en función de la experiencia aportada por el candidato/a.
No es confirmado pero puedes esperar algo entre 25000 y 30000 euros brutos al año. Pensamos que es un buen sueldo para empezar y pero también que el sueldo no debería ser la única motivación para trabajar con nosotros.

* Facilidades para combinar la vida familiar
Para nosotros es muy importante que estés en la oficina en el mismo horario que el resto de compañeros, sobre todo para trabajar en equipo. Sin embargo si necesitas dejar a tus hijos en el cole y llegar algo más tarde no hay problema. Hay facilidades para ajustar el horario un poco hacia los lados.

* Formar parte de una plantilla con el mejor ambiente de trabajo, participando en proyectos de gran envergadura.
Formarás parte de un equipo muy motivado en el que trabajar con intensidad no está reñido con estar de buen humor.

* Gran colaboración entre miembros del equipo de trabajo.
El departamento de desarrollo forma una especie de círculo alargado y siempre vamos moviéndonos en la sillas de un puesto a otro ayudando a quien lo necesite.

* Trabajos colaborativos en grandes proyectos.
Hay algunos proyectos que llevamos entre varias personas.  Así mejoramos la velocidad y disminuimos el riesgo por si alguno se pone malito o tiene algún compromiso.

* Trabajar en un entorno ágil en el que se valora el talento y las ideas de los miembros del equipo.
Hacemos standup dailies reales(menos de 15 min.), tenemos un buen sistema de integración continua, el testing está integrado en el equipo de desarrollo, vamos mejorando retrospectiva tras retrospectiva,… No hacemos SCRUM sino que es más parecido a FDD aunque hacemos entregas oficiales cada 3 semanas.

* Un puesto rotativo de desarrollo de pié para estirar de vez en cuando las piernas
En VSN cuidamos de tu salud. Si necesitas estirar las piernas puedes pasarte un rato a un puesto de desarrollo en el que podrás trabajar de pié y ver las cosas desde otro ángulo.

Experiencia:
3-5 años
Lo sentimos. No necesitamos un newby esta vez

Datos del Puesto:

* El candidato liderará la evolución del producto,siendo apoyado e instruido por un miembro del equipo de desarrollo actual, proponiendo mejoras a la arquitectura actual del sistema, así como las tecnologías y herramientas más apropiadas para la tarea.
Raro pero no tengo nada que añadir.

Nivel Profesional:
Empleado.
A cuenta ajena, claro.

Jornada:
Jornada completa (L-J 9:00-14:00  15:00 – 18:30, V-9:00 15:00)

Si vives cerca y prefieres y a comer allí podrás comer de 14 a 15:30 y después salir a las 19. El salir los viernes a las 15 es una PASADA…

Tipo de contrato:
Indefinido

Creo que ya hemos hablado de esto. Si ambas partes estamos contentas puede que te jubiles con nosotros, sea el que sea el lenguaje de programación que se use entonces.

Funciones:
Analista Programador – Programador

¡Ups!. Esto no me había dado cuenta, que fallo. Para mí el puesto es de DESARROLLADOR en mayúsculas. Olvídate de las funciones típicas. En VSN cortamos, pegamos y coloreamos todo lo que hace falta para sacar el producto con calidad.

Tecnología:
C++,Video, MultiHilo, Concurrencia, TCP/IP,Sockets,Windows,HTTP,Visual Studio,GIT,
Esperamos que no te asuste todo esto.

Si no lo ha hecho, saca brillo a tu currículum y envíamelo a jmuria en el dominio vsn.es. Tus propios compañeros lo leerán y colaborarán en tu selección.