© Ralph McQuarrieCasi comenzaremos a abrir champaña, a arrojar montañas de ensaladas y a limpiar mandarinas. Mientras tanto, todas estas tareas agradables no han comenzado, resumamos el blog del año pasado. Por lo tanto, nuestra publicación anual con las publicaciones que obtuvieron más ventajas, así como los comentarios, se agregan a favoritos y vistas, para aquellos que no están incluidos en la primera lista corta.
Campeones por rating
Esta es una colección cínica y clínica de lo que aprendí durante 30 años en el desarrollo de software. Repito, algunas cosas son muy cínicas, y el resto es el resultado de largas observaciones en diferentes lugares de trabajo.
Una vez, mi colega Peter sugirió participar en un proyecto interesante: la creación de un "teléfono cueva para espeleólogos", ya que está interesado en la espeleología. Los espeleólogos tienen ese problema: la comunicación inalámbrica subterránea no funciona en la práctica. La recepción de radio aceptable solo es posible en la línea de visión, pero vale la pena un par de vueltas y no hay conexión. Y necesita comunicarse a través de la cueva, cuya longitud puede ser de varios kilómetros. Por supuesto, la comunicación móvil no atrapa allí, lo que significa que no hay conexiones con el mundo exterior para grupos que trabajan de forma autónoma en la cueva durante varias semanas.
En agosto de 2018, Peter debía participar en una expedición a una cueva bastante compleja y peligrosa. Para esta expedición, decidimos desarrollar un nuevo dispositivo que resolvería el problema de conectar grupos de trabajo autónomos con el mundo exterior.
¿Por qué hacer un taller de carpintería? No tengo una respuesta definitiva. Si solo quiere hacer algo con las manos desde un árbol, es decir, talleres donde pueda venir, pagar dinero por el alquiler de máquinas y un lugar de trabajo, y hacer todo allí. No es necesario tener su propio local y su propio equipo. Si desea participar en la carpintería como negocio, entonces la competencia es alta, es difícil encontrar su nicho.
Como dicen, si no te avergüenzas de tu antiguo código, entonces no creces como programador, y estoy de acuerdo con esta opinión. Comencé a programar para el entretenimiento hace más de 40 años, y hace 30 años profesionalmente, así que tuve muchos errores. Como profesor de informática, les enseño a mis alumnos a aprender de los errores: los suyos, los míos, los extraños. Creo que es hora de hablar sobre mis errores para no perder la modestia. Espero que alguien lo encuentre útil.
Trabajo como programador de investigación en el equipo de visión por computadora del Grupo Mail.ru. Para el Día de la Victoria de este año, decidimos hacer un proyecto para la restauración de fotografías militares. ¿Qué es la restauración de fotos? Consta de tres etapas:
- encontramos todos los defectos de imagen: roturas, rasguños, agujeros;
- pintar sobre los defectos encontrados en función de los valores de píxeles a su alrededor;
- colorear la imagen
En este artículo, pasaré por cada una de las etapas de restauración en detalle y le diré cómo y dónde tomamos datos, qué redes aprendimos, qué hicimos, qué rastrillos pisamos.
En algunas áreas de programación, es normal querer escribir una estructura de datos o algoritmo que pueda funcionar con elementos de diferentes tipos. Por ejemplo, una lista de genéricos o un algoritmo de clasificación que solo necesita una función de comparación. En varios lenguajes, se ofrecen varias formas de resolver este problema: desde simplemente señalar las funciones comunes apropiadas (C, Go) a los programadores hasta sistemas genéricos tan poderosos que se vuelven completos de Turing (Rust, C ++). En este artículo hablaré sobre sistemas genéricos de diferentes idiomas y su implementación. Comenzaré resolviendo el problema en lenguajes sin un sistema similar (como C), y luego mostraré cómo la adición gradual de extensiones conduce a sistemas de otros lenguajes.
Considero que los genéricos son una opción interesante, porque son un caso especial simple del problema general de metaprogramación: escribir programas que pueden generar clases de otros programas. Como prueba, mostraré cómo tres métodos de metaprogramación diferentes y completamente generales pueden considerarse extensiones multidireccionales en el espacio de sistemas genéricos: lenguajes dinámicos como Python, macro sistemas de procedimientos como Template Haskel y compilación por fases como Zig y Terra.
Hace unos meses, mencioné en una publicación que esto es un mito, como si const ayudara a habilitar las optimizaciones del compilador en C y C ++. Decidí que esta declaración debería explicarse, especialmente porque yo mismo creía en este mito antes. Comenzaré con teoría y ejemplos artificiales, y luego pasaré a experimentos y puntos de referencia basados en una base de código real: SQLite.
Hoy, estar en línea es una condición común para muchas personas. Todos compramos, nos comunicamos, leemos artículos, buscamos información sobre varios temas. La red nos conecta con todo el mundo, pero, sobre todo, conecta a las personas. Hace 20 años que uso Internet, y mi relación con él cambió hace ocho años cuando me convertí en desarrollador web.
Los desarrolladores conectan a las personas.
Los desarrolladores ayudan a las personas.
Los desarrolladores dan oportunidades a las personas.
Los desarrolladores pueden crear una red para todos, pero esta habilidad debe usarse de manera responsable. Al final, es importante crear cosas que ayuden a las personas y las empoderen. En este artículo quiero hablar sobre cómo los encabezados HTTP pueden ayudarlo a crear mejores productos para el mejor trabajo de todos los usuarios en Internet.
Las bacterias, no el cáncer, los terroristas y los desastres se cobraron la vida de un gran número de personas. Solo Yersinia pestis (varita de peste) causó la muerte de 150 millones de personas. Tomar antibióticos es el método principal para combatir las infecciones bacterianas. Pero, ¿y si las drogas dejan de funcionar?
Esta no es una pregunta retórica ni introductoria para modelar una hipótesis, sino una situación real en el futuro previsible en el contexto de un aumento de la resistencia bacteriana. La Organización Mundial de la Salud (OMS) y los servicios nacionales tienen un plan de acción común, pero ningún estado tiene un algoritmo detallado para prevenir una pandemia bacteriana.
Hablaremos sobre las causas de la catástrofe inminente, así como sobre los intentos de encontrar una salida al punto muerto médico con la ayuda de disciplinas relacionadas: genómica, matemática y virología.
Recientemente, estaba trabajando en la tarea de agregar zonas horarias a la biblioteca de calendario JS mantenida por mi equipo. Era muy consciente del soporte de zona horaria inútil en JavaScript, pero esperaba que abstraer objetos de datos existentes facilitaría la resolución de la mayoría de las dificultades.
Sin embargo, mis sueños se hicieron polvo. Cuando profundicé en la tarea, me di cuenta de que es realmente difícil trabajar con zonas horarias en este idioma. Implementar algo más complicado que simplemente formatear la visualización de la hora y calcular la fecha usando operaciones complejas (funciones de calendario) fue extremadamente difícil. Adquirí una valiosa experiencia en la solución de este problema, y esto conllevó nuevas dificultades.
En este artículo quiero discutir lo que encontré y cómo se resolvió. Mientras escribía el texto, me di cuenta de que la razón de todas las dificultades era mi pobre comprensión del tema de las zonas horarias. A la luz de esta conciencia, propongo hablar primero en detalle sobre la definición y los estándares, y solo luego pasar a JavaScript.
Campeones por comentarios
Llevamos con nosotros algunas cosas útiles que usamos, si no todos los días, con bastante frecuencia. Todo esto es basura llamada EDC - Everyday Carry. Y hoy, con la increíble abundancia y accesibilidad de todo tipo de herramientas, gadgets, dispositivos, nishtyachki callejeros y pequeños, en nuestros bolsillos y bolsos puedes encontrar las combinaciones más interesantes de cosas. Y en everydaycarry.com, puede cargar fotos de su EDC y firmar cada elemento. Recolectamos los conjuntos de especialistas en TI más interesantes de allí. También nos pidieron que mostraramos lo que hay en los bolsillos y mochilas de nuestros empleados.
Este artículo trata sobre lo que significa agregar genéricos a Go, y por qué creo que deberíamos hacer esto. También mencionaré un posible cambio en la arquitectura del lenguaje para agregar genéricos.
Go fue lanzado el 10 de noviembre de 2009. Menos de un día después, apareció el primer comentario sobre genéricos. También menciona excepciones que agregamos al lenguaje en forma de pánico y recuperación a principios de 2010.
Durante tres años de observación, la ausencia de genéricos siempre ha sido una lista de tres problemas principales que deben corregirse en el idioma.
Es viernes de primavera afuera, y realmente quiero distraerme de la codificación, las pruebas y otros asuntos de trabajo. Hemos compilado para usted una selección de sus libros y películas de ciencia ficción favoritas que se han lanzado en el último año.
Campeones para agregar a favoritos
¿Quién dijo que los desarrolladores pueden aprender cosas nuevas solo a través de libros, videos y análisis del código de otras personas? Después de todo, también tenemos otros canales para obtener información del mundo exterior. Por supuesto, no se trata de saborear el conocimiento, probarlo u olerlo. Pero escuchar, eso es todo. Hemos compilado para usted una colección de podcasts actuales en ruso para desarrolladores. Una buena forma de descansar los ojos o de atascos.
Probablemente todas las personas cercanas al desarrollo web ya hayan escuchado sobre la aplicación web progresiva. ¡Ojalá pudieras! Esta tecnología tiene un desarrollo web y móvil prácticamente equilibrado en términos de distribución de productos y participación del usuario. Sí, una interfaz moderna escrita, por ejemplo, en React, funciona como una aplicación. Pero esta aplicación solo se descarga al navegador y se inicia desde ella. Esta es la gran desventaja que siempre ha tenido el desarrollo móvil. Pensemos que, desde el punto de vista del usuario común, la "aplicación" es diferente del "sitio". Inmediatamente me viene a la mente que la aplicación está en el teléfono y el sitio está en la computadora. Pero hay un navegador móvil, por lo que el sitio también está en el teléfono. Luego hay 3 diferencias significativas:
- El icono de la aplicación se encuentra en la pantalla principal del teléfono inteligente.
- La aplicación se abre en una ventana separada.
- La aplicación envía notificaciones push.
Los 3 puntos se eliminan gracias a la aplicación web progresiva o PWA. Ahora, yendo al sitio desde un navegador móvil, podemos "descargarlo", después de lo cual veremos el icono en la pantalla principal. Además, al iniciar, aparece una pantalla de inicio, como en las aplicaciones móviles, y si lo desea, puede configurar el envío de notificaciones push.
¡Y parece que todo está bien! Pero, por desgracia, durante más de 10 años de la era móvil, los usuarios están demasiado acostumbrados a buscar aplicaciones en Google Play y App Store. Romper los hábitos de los usuarios es una tarea ingrata, y por lo tanto, los chicos de Google (por cierto, Google es el desarrollador de PWA) decidieron que si la montaña no va a Magomed, entonces ... En general, más recientemente, el 6 de febrero de 2019, proporcionaron el uso de Trusted Web Activities para Cálculos de aplicaciones web en Google Play.
El artículo de dos partes le mostrará cómo obtener la ruta completa de un sitio web normal a una aplicación en Google Play en cuestión de horas. Todo esto se mostrará en el ejemplo de un servicio real: Skorochtets.
¿Alguna vez te has preguntado cómo los navegadores leen y ejecutan código JavaScript? Parece misterioso, pero en esta publicación puedes tener una idea de lo que está sucediendo bajo el capó. Comenzamos nuestro viaje al idioma con una excursión al maravilloso mundo de los motores JavaScript.
Ver campeones
Estoy mirando una pieza de código. Quizás este es el peor código que he conocido. Para actualizar solo un registro en la base de datos, extrae todos los registros de la colección y luego envía una solicitud para actualizar cada registro en la base de datos, incluso aquellos que no necesitan actualizarse. Hay una función de mapa que simplemente devuelve el valor que se le pasó. Hay comprobaciones condicionales de variables con obviamente el mismo valor, simplemente nombradas en diferentes estilos (firstName y first_name). Para cada ACTUALIZACIÓN, el código envía un mensaje a otra cola, que es procesada por otra función sin servidor, pero que hace todo el trabajo para otra colección en la misma base de datos. ¿No mencioné que esta función sin servidor proviene de una "arquitectura orientada a servicios" basada en la nube que contiene más de 100 funciones en el entorno?
¿Cómo podría hacerse tal cosa? Me tapo la cara y lloro entre risas. Mis colegas preguntan qué sucedió y vuelvo a contar los peores resultados de BulkDataImporter.js 2018 en colores. Todos me saludan con simpatía y están de acuerdo: ¿cómo podrían hacernos esto?
A pesar de que en los últimos siete años escribo en JavaScript casi todos los días hábiles, debo admitir que presto poca atención a las noticias sobre las innovaciones de ES. Las características principales como async / await y proxies son una cosa, pero cada año hay una serie de pequeños cambios por fases que no entran en mi campo de visión, porque siempre hay algo más importante para estudiar.
En este artículo, he reunido las capacidades de los JS modernos, de los que no se habló mucho cuando aparecieron. Algunos de ellos solo aumentan la usabilidad, y otros son increíblemente prácticos y pueden ahorrarle escribir un montón de código.
El lenguaje XML fue inventado en 1996. Apenas había aparecido antes de que las posibilidades de su aplicación comenzaran a malinterpretarse, y para los fines para los que intentaron adaptarlo, no era la mejor opción.
No sería una exageración decir que la gran mayoría de los esquemas XML que he visto son inapropiados o mal uso de XML. Además, este uso de XML atestigua un malentendido fundamental de lo que se trata principalmente XML.
XML es un lenguaje de marcado. Este no es un formato de datos. En la mayoría de los esquemas XML, esta distinción no se tuvo en cuenta explícitamente, confundiendo XML con el formato de datos, lo que finalmente significó un error en la elección de XML, porque de hecho el formato de datos era necesario.
Sin entrar en detalles, XML es mejor para anotar bloques de texto con estructura y metadatos. Si su tarea principal no es trabajar con un bloque de texto, es poco probable que la elección de XML esté justificada.
Desde este punto de vista, hay una manera fácil de verificar qué tan bien está hecho el esquema XML. Tome, por ejemplo, el documento en el esquema propuesto y elimine todas las etiquetas y atributos del mismo. Si no tiene sentido lo que queda (o si queda una cadena vacía), entonces su esquema no está construido correctamente o simplemente no debería haber usado XML.
A continuación daré algunos de los ejemplos más comunes de circuitos construidos incorrectamente.
* * *
Gracias a todos los que lo leyeron. Y con la venida!