More on this book
Kindle Notes & Highlights
deja que la gente se autogestione y busq...
This highlight has been truncated due to consecutive passage length restrictions.
la mayoría de objetivos se alcanzan a base de esfuerzo, dedicación y trabajo en equipo.
Compartid vuestras inquietudes y vuestros logros… Merece la pena levantarse cada día pensando que tienes el mejor trabajo del mundo.
objetivo. Al contrario que para un ataque del tipo anterior, en el caso de querer comprometer un software mediante el uso de malware con características de troyano, será necesario mantener la integridad del objetivo para poder realizar las actividades programadas
Se dice que un lenguaje es Turing completo si el lenguaje tiene la misma capacidad computacional que la máquina universal de Turing. Dicho de otro modo, un lenguaje es Turing completo si puede computar todo lo computable.
Cualquier lenguaje de programación moderno tiene una multitud de conceptos que van más allá del if y el for, como el polimorfismo paramétrico, la orientación a objetos, los tipos perezosos, la metaprogramación y una larga lista de otras características que hacen que los programas sea más legibles, mantenibles y compactos.
En Python las comparaciones pueden encadenarse
list comprehensions
expresiones generadoras
El propio inventor del puntero a null, Tony Hoare, dijo que la creación del puntero a null es su “error del billón de dólares”.
el cómo diseñes tu aplicación afectará notablemente al consumo de batería, calidad de servicio de la red y un sin fin de problemas a nivel radio que, finalmente, repercutirá en tus usuarios.
cómo la red móvil establece conexiones radio para transmitir tus paquetes IP y el por qué es tan importante conocer esto para mejorar el rendimiento de tu aplicación.
Los desarrolladores tienen dos caminos para recuperar esta información:
Polling: Periódicamente solicitar la información al servidor. Push: El servidor envía la información al cliente cuando está disponible.
JavaScript está basando en eventos y callbacks: úsalos y aprovéchate de ellos, piensa como lo que son: elementos diferenciales del lenguaje. Node.js es no bloqueante, orientado a eventos y con un montón de librerías,
RabbitMQ es un sistema de colas muy potente y muy versátil. Y está escrito en lenguajes funcionales,
RabbitMQ tiene que ser bien configurado para que rinda de forma excelente: elige tu mejor opción de entrega de mensajes, usa los topics (suscripciones a temas), prueba, juega, diviértete y encuentra la mejor solución. Además, te recomendamos que en vez de realizar sólo una sola conexión con RabbitMQ, hagas varias en cada proceso, y en diferentes momentos (espera milisegundos), porque hay problemas con conexiones concurrentes muy rápidas.
No temas investigar. Pégate con la tecnología. Invierte tiempo en cosas que, probablemente, vayan a mejorar lo que tú tienes montado. Haz pruebas, falla y vuelve a intentarlo. Pregunta a gente que sepas que ha estado trabajando con estas tecnologías. Y sobre todo, piensa a lo grande.
la naturaleza real de desarrollo de software no suele ser bien comprendida por las personas que participan, gestionan y ejecutan el proyecto de desarrollo software. Se tiende, sin querer, a intentar sistematizar el desarrollo de software con el fin de hacerlo predecible, cuando precisamente es todo lo contrario: es incierto y complejo.
Siempre que los humanos se enfrentan a problemas en entornos con dinámicas complejas, como es el caso del desarrollo software, es necesario intercambiar conocimiento e interpretar información de una forma creativa, tanto del problema a resolver como de sus posibles soluciones. Por un lado, las interpretaciones de los humanos suelen ser subjetivas, basadas en su conocimiento y experiencia. Por otro, en muchas ocasiones las fuentes de información acerca del problema a resolver o su solución son ambiguas. Todo ello son causas de incertidumbre.
el desarrollo de software se ha entendido como un proceso que ocurre después de que haya una especificación o definición de dicho software, primero a nivel de usuario o externo (Use Cases, User Experience), luego a nivel interno (arquitectura, análisis y diseño del software) y finalmente la construcción o síntesis del software que viene dirigida por la definición previa. Esta construcción incluye la programación, testing y despliegue del software.
solo hay una circunstancia en la que el desarrollo de software se puede predecir, por tanto, estimar con cierta precisión: cuando se trata de desarrollar un sistema que se ha construido previamente varias veces por el mismo equipo y en un contexto similar.
No sólo se trata de que el software se ejecute y cumpla con lo esperado en cuanto funcionamiento, sino que la forma en la que está escrito y ejecuta cierta funcionalidad también importa. Es una cuestión del diseño de la estructura del código y de su comportamiento temporal en ejecución, y es aquí donde se aplican prácticas y paradigmas de desarrollo de software.
un programador necesita programar y ejecutar en la dimensión del tiempo el programa, para asegurar que funciona como espera y desea. En lugar de percibir el funcionamiento de un programa por los sentidos, como ocurre con la música, la percepción del comportamiento y estructura del software es más sutil. Requiere realizar pruebas de ejecución con la máquina y el software, revisar cómo está escrito y estructurado el código, y sobre todo, entender su funcionamiento temporal con la mente.
Varios miembros de un equipo integran sus diferentes realizaciones software, generándose ciclos de Intención-Realización entre varios programadores, que requieren de test de integración para verificar que las diferentes partes del sistema funcionan como se esperan en su conjunto.
La arquitectura software proporciona un marco común e integridad conceptual al desarrollo del sistema, para que el trabajo de todos los programadores pueda funcionar como un todo
un equipo de desarrollo sería como una banda de jazz, donde cada músico interpreta una melodía encima de una armonía o base musical que alguien previamente ha compuesto. Esa armonía proporciona una estructura, integridad y base temporal musical que permite que las interpretaciones de los distintos componentes de la banda suenen bien. La arquitectura del software sería entonces equivalente a la armonía musical.
Un product owner parte de una definición intencional de cómo tiene que funcionar el software desde el punto de vista del usuario
Si el funcionamiento del sistema no es como se espera, se ejecuta un nuevo ciclo de Intención-Realización, hasta que el what-how del product owner emerge.
A nivel de “arquitectura” del sistema, también es necesario ejecutar ciclos de Intención-Realización, para descubrir el what-how de la base software que proporciona integridad al desarrollo del sistema. Esto ocurre como una parte más del desarrollo de software,
En la evolución de los ciclos de Intención-Realización se suelen mezclar, consciente o inconscientemente, dos tipos de desarrollo:
Desarrollo iterativo:
Desarrollo incremental:
En los últimos años, han surgido varios métodos y prácticas ágiles para ayudar en este propósito, pero lamentablemente la forma en la que se han definido algunos métodos “agiles” y peor aún, cómo se han aplicado por algunas compañías, han degenerado de nuevo en procedimientos de trabajo sistemáticos, que dificultan, a la práctica, el desarrollo de software.
El desarrollo de software es incierto y complejo.
El desarrollo de software se basa en la creatividad y procesos mentales de transformación de conocimiento que realizan humanos acerca del what-how del sistema, tanto desde un punto de vista externo como desde uno interno al sistema, considerando a la vez dimensiones estructurales y de comportamiento temporal.
Tanto la funcionalidad como la arquitectura del s...
This highlight has been truncated due to consecutive passage length restrictions.
La única medida de progreso es el working software
Los planes, fechas, definiciones de producto, diseños de experiencia del usuario y arquitecturas han de ser intencionales.
Cuanto más cortos sean los ciclos Intención-Realización, más rápido se puede hacer converger el software hacia la solución esperada
Es esencial disponer de buenos creativos de software, en especial de buenos programadores.
Todas las personas que trabajan en un proyecto/producto software deberían entender el desarrollo software y su idiosincrasia.
Los equipos de trabajo deberían ser pequeños, alrededor de 5-7 personas.
Hay que mantener a raya la complejidad accidental,
Adaptar los métodos y prácticas existentes en la industria al equipo, no al revés.
cómo gestionar la incertidumbre
vivimos en entornos empresariales que demandan predictibilidad):
Limitar los objetivos del software:
Evitar comprometerse demasiado pronto con el contenido de una release
Añadir iterativamente e incrementalmente calidad a las características del software.
ciclo tras ciclo, refinar su calidad y funcionamiento.

