lunes, 8 de agosto de 2016

La navaja de Ockham o principio KISS en el desarrollo de software

La navaja de Ockham o el principio de parsimonia es el principio metodológico ideado por William of Ockham (1285-1347) filósofo nominalista que se utiliza para “cortar” o "rasurar" todo aquel conocimiento que no provenga de los datos de los sentidos, es decir invalidar los conceptos que no sean comprobables por la experiencia misma.

La formulación correcta de Ockham es:

No hay que multiplicar los entes sin necesidad (entia non sunt multiplicanda praeter necessitaem).

La navaja funciona de la siguiente manera: cuando se nos ofrecen dos o más hipótesis en igualdad de circunstancias para explicar un determinado fenómeno, es razonable aceptar la hipótesis más simple o sea la que incluye menos supuestos no probados.

En otros campos del conocimiento la navaja de Ockham se utiliza para eliminar objetos o tipos de objetos que no aportan o cambian en nada las particularidades efectivas de las cosas. En informática a la navaja de Ockham se le conoce como el principio KISS, siglas que significan:

Keep It Simple, Stupid! (Mantenlo simple, estúpido)

Aplicando el KISS al desarrollo de software tenemos que pequeño y sencillo es mejor que grande y complejo. En pocas palabras, entre más pequeño sea el número de componentes o de código involucrado en un proyecto menor será la cantidad de errores o problemas asociados al mantenimiento. Lo que incrementa la probabilidad de una entrega exitosa a tiempo.

Hay un principio de la filosofía UNIX que ejemplifica la aplicación de un principio KISS:

*“En lugar de tener pocos programas grandes, cada uno tratando de hacer muchas cosas, el sistema UNIX proporciona muchas herramientas simples que pueden combinarse para realizar un amplio rango de cosas.”
*Rosen Kenneth, Rosinki Richard, UNIX System V release 4. An introduction. Second Edition, Mc Graw Hill

Algunos ejemplos del KISS en el desarrollo de software son:

  • No intentes complicar el modelo de base de datos agregando entidades que nada aportan al negocio funcional. Solo agrega las entidades que requieren una persistencia.
  • No toda la persistencia necesita estar en una base de datos, hay ocasiones en que los archivos de texto plano son la mejor opción para el rendimiento.
  • No requieres un RDBMS para guardar una agenda de contactos.
  • No intentes optimizarlo si ni siquiera funciona o no esta terminado.
  • La complejidad de los algoritmos o el número de capas que se agreguen a una arquitectura son inútiles si estos no resuelven los requerimientos funcionales, y al serán ignorados por los usuarios finales.

Hay una frase que también es un claro ejemplo de este principio:

Premature optimization is the root of all evil. (la optimización prematura es la raíz de todos los males)

--Sir Charles Anthony Richard Hoare, inventor del algoritmo Quicksort.

Hay que aclarar que la navaja de Ockham no sostiene que la hipótesis más simple sea la correcta, sino sencillamente que es la que tiene más probabilidades de ser la correcta.

martes, 2 de agosto de 2016

Entendiendo TCP Control Flags (los bits de control TCP)

El protocolo TCP (Transport Control Protocol) proporciona la comunicación orientada a la conexión entre dos sistemas utilizando características tales como: Three-way handshake, reconocimientos, y números de secuencia. Adicionalmente a esas características TCP tiene 6 banderas de control (control flags) o bits de bandera que se usan para dominar la funcionalidad de las conexiones, los 6 bits que son utilizados durante el ciclo de la conexión son: Urgent (URG), Acknowledgment (ACK), Push (PSH), Reset (RST), Synchronize (SYN) y Finish (FIN).

La posición de cada uno de los bits es una bandera para indicar si una funcionalidad TCP está habilitada o deshabilitada, poniendo el valor del bit en 1 es ON, si es 0 significa OFF.

A continuación la descripción de cada uno de los bits por su correspondiente posición:

Urgent (URG): Se utiliza para notificarle a un sistema que el paquete tiene datos urgentes dentro del campo TCP que reconocen una actividad urgente o con prioridad, por ejemplo cuando un usuario presiona la combinación CTRL-BREAK, el resultado de este bit le indica a TCP que estos datos deben tomar precedencia sobre la transmisión de datos y enviarse inmediatamente.

Acknowledgment (ACK): El bit de reconocimiento se utiliza por uno de los sistemas para indicar el reconocimiento de un paquete TCP de otro sistema. Esto indica que hay un numero de reconocimiento en el campo de reconocimiento que se envía como respuesta a un petición SYNC.

Push (PSH): Este informa a TCP de entregar los datos inmediatamente hacia la capa superior sin almacenarlos en el buffer.

Reset (RST): Indica que una conexión TCP debe reiniciar la conexión, quizás debido a un error.

Synchronize (SYN): El bit de sincronización se utiliza para solicitar la conexión TCP con otro sistema. Una solicitud de conexión tiene SYN = 1 y ACK = 0.

Finish (FIN): Este bit se utiliza para terminar la conexión en un sistema, indica que el emisor no tiene más datos que enviar. La desconexión es simétrica.

Fig 1 TCP Header (la cabecera TCP).

Flags (UAPRSF)
  • U (1 = Urgent pointer valid)
  • A (1 = Acknowledgement field value valid)
  • P (1 = Push data)
  • R (1 = Reset connection)
  • S (1 = Synchronize sequence numbers)
  • F (1 = no more data; Finish connection)