language-agnostic

language agnostic - ¿Cuáles son algunos temas de desarrollo de software avanzado que todo desarrollador debería saber?



language-agnostic (30)

Digamos que su empresa le ha dado el tiempo y el dinero para adquirir capacitación sobre tantos temas de programación avanzada que puede comer en un año, carta blanca. ¿Cuáles serían esos temas y cómo preferirías adquirirlos?

Suposiciones

  • Todavía tiene materiales que entregar, pero se le permite una semana al mes durante el año para esta capacitación.
  • El entrenamiento puede venir de cualquier parte. IE: aula, instructor en el lugar, libros, suscripciones, podcasts, etc.
  • La materia puede cubrir cualquier plataforma, tecnología, lenguaje, DBMS, conjunto de herramientas, etc.

¿Cómo preferiría adquirir la formación? Me encantaría tener una cantidad considerable de tiempo de la empresa dedicado a la autoformación.


Accesibilidad

Muchas organizaciones lo ignoran, pero el hecho es que hay una gran cantidad de personas con poca o ninguna visión, ceguera al color u otras diferencias que pueden hacer que navegar por la web sea una experiencia muy frustrante. Si todos tuviéramos al menos un poco de entrenamiento, podríamos obtener algunas interfaces de usuario basadas en web que sean un poco más inclusivas.


Aquí están los tres que siempre me estoy explicando a los desarrolladores junior que no recibieron suficiente capacitación en CS. Todas esas otras cosas son generalmente más exageradas que la sustancia, o pueden recogerse con bastante facilidad. Pero si no conoces estos tres, puedes hacer mucho daño:

  1. Análisis de algoritmos, incluyendo Big O Notation .
  2. Los distintos niveles de cohesion y coupling .
  3. La Ley de Amdahl , y cómo se relaciona con las optimizaciones.

Bastante gracioso que nadie haya mencionado:

  • depuración
  • herramientas e ide con las que trabajas
  • y la plataforma que están desarrollando.

El desarrollo diario es mucho más divertido si conoces bien tus herramientas y logras más cosas y te simplificas la vida si sabes cómo depurar el código de alguien más a gusto.


Bueno, si estás aquí, espero que ya tengas lo básico:

  • OOP Mejores prácticas
  • Patrones de diseño
  • Seguridad de la aplicación
  • Seguridad de bases de datos / Consultas / Esquemas

En particular, los desarrolladores deben esforzarse por aprender múltiples lenguajes de programación y disciplinas, para que su conjunto de habilidades se amplíe en más de una dirección. No necesitan convertirse en expertos en estas otras habilidades, pero al menos tienen una comprensión muy aguda de la integración con su disciplina central. Esto los convertirá en mejores desarrolladores a largo plazo, y también les permitirá adquirir todas las herramientas a su disposición para crear aplicaciones que puedan trascender las limitaciones de un lenguaje singular.

Además de la programación de temas específicos, también debe aprender cómo trabajar con Agile, XP u otras metodologías basadas en equipos para tener más éxito mientras trabaja en un entorno de equipo.


Computación paralela: la forma más fácil y mejor de aprenderla.


Creo que un programador avanzado debería saber cómo conseguir que su empleador le dé tiempo y dinero para adquirir capacitación sobre tantos temas de programación avanzada que puede comer en un año. No estoy avanzado todavía. :)


Cubriría nuevas tecnologías y tendencias. Algunas de las nuevas tecnologías con las que estoy investigando / mejorando mis habilidades incluyen:

  • Microsoft .NET Framework v3.0 / v3.5 / v4.0
  • Cloud Computing Frameworks (Amazon EC2, servicios de Windows Azure, GoGrid, etc.)
  • Patrones de diseño

Desafortunadamente, las habilidades de comunicación parecen caer en la sección de "temas avanzados" para la mayoría de los desarrolladores (la compañía actual está excluida, por supuesto). La mejor manera de adquirir esta habilidad: la práctica.

  • Quítese los audífonos y hable con alguien en lugar de enviar mensajes instantáneos o enviar correos electrónicos al tipo que se encuentra en la mesa de al lado.
  • Levante el teléfono y hable con un cliente en lugar de lanzar un correo electrónico por encima de la valla.
  • Haga preguntas en una conferencia en lugar de sentarse detrás de la pantalla de su computadora portátil.
  • Participar activamente en una reunión no técnica en el trabajo.
  • Presentar algo en público.

La mayoría de los proyectos no fallan por razones técnicas. Fracasan porque no pudieron crear un equipo. La comunicación es vital para la dinámica del equipo.

Tampoco perjudicará tu carrera.


En la superficie, esto parece una pregunta fácil de responder, solo ingrese a su mascota favorita sobre lo que otros desarrolladores no pueden hacer correctamente. Pero cuando leí las respuestas y lo pensé un poco, me di cuenta de que cada "tema avanzado" que se mencionaba estaba cubierto en mi plan de estudios de ciencias informáticas, hace 20 años. Y dudo que los conceptos de OO, seguridad, programación funcional, etc. hayan cambiado en ese tiempo. Claro que las herramientas tienen, pero sostengo que las herramientas son diferentes a los temas.

Entonces, ¿qué es un "tema avanzado" en informática? ¿Quién es el Turing, Knuth, Yourdon del siglo XXI?

No tengo una respuesta clara a esta pregunta, aunque me gustaría ver más trabajo sobre las teorías para la programación paralela que permita a las herramientas abstraer esas cosas complicadas para los desarrolladores.


Estoy totalmente de acuerdo con Accessabiitly. Me pidieron que lo examinara para ver el sitio web en el trabajo y hay una falta real de buen conocimiento sobre el tema, no solo la falta de estándares CSS para ayudar a los lectores de pantalla.

Sin embargo, mi respuesta va al diseño de GUI, es bastante difícil hacerlo bien. Hay demasiadas aplicaciones terribles que podrían evitarse simplemente tomándose el tiempo para seguir los consejos / diseños de HCI (Interacción con computadora humana). Tome Google / Apple en busca de inspiración cuando cree una GUI, no su típica combinación de cientos de botones / etiquetas, que a menudo se elimina.


Fuente de control



La guía del autostopista a la galaxia.


Los desarrolladores deben conocer los conceptos básicos del desarrollo de SQL y cómo sus decisiones afectan el rendimiento de la base de datos. Una cosa es escribir una consulta, otra cosa es escribir una consulta, comprender el plan de explicación y tomar decisiones de diseño basadas en esa salida. Creo que un buen curso sobre desarrollo de PL / SQL y rendimiento de base de datos sería muy beneficioso.


Objetos orientados a patrones de diseño.


Problemas de internacionalización, especialmente porque parece que no sería un tema avanzado. Pero es.


Programación simultánea / paralela y subprocesos múltiples, especialmente con respecto a los modelos de memoria y la coherencia de la memoria. Creo que todos los programadores deben ser conscientes de las consideraciones en este campo a medida que nos adentramos en un mundo de hardware de múltiples núcleos / múltiples CPU.

Para esto probablemente usaría la investigación de Internet más fuertemente; pero una cartilla en el campus en una buena universidad podría ser una buena manera de comenzar.


Recomendaría aprender sobre Refactoring, Test Driven Development y varios marcos de prueba de unidad (NUnit, Visual Test, CppUnit, etc.) También aprendería cómo incorporar la prueba de unidad automatizada en sus compilaciones de integración continua.

En última instancia, si puede probar que su código hace lo que dice que puede hacer, no tiene que estar allí para responder preguntas sobre por qué o cómo. Si un mantenedor se presenta e intenta "arreglar" su código, sabrán al instante si lo rompieron. Las pruebas escritas en torno a los requisitos (casos de uso) explican al mantenedor lo que sus usuarios querían que hiciera, y proporcionan un pequeño ejemplo práctico de cómo llamarlo. Piense en las pruebas unitarias como documentación funcional.

Test Driven Development (TDD) es un enfoque de diseño más novedoso que comienza con los requisitos, en el que comienza por escribir una prueba antes de escribir el código. A continuación, escribe exactamente el código necesario para pasar la prueba. Debe detenerse antes de escribir un código adicional (que tal vez nunca necesite), porque lo refactorizará más adelante si descubre que realmente lo necesita.

Lo que hace que TDD sea genial es que una interfaz defectuosa (como una con muchas dependencias) también es muy difícil para escribir pruebas. Es tan difícil que un programador prefiera refactorizar la interfaz para que sea más fácil de probar. Y esa refactorización simplifica el código, elimina las dependencias inapropiadas o agrupa las pruebas relacionadas para facilitar la prueba, mejorando así la cohesión. Al revelarlo de inmediato al desarrollador cuando escribe un módulo con una interfaz defectuosa, el desarrollador se adhiere a la arquitectura y gravita sobre los principios de cohesión estrecha y acoplamiento suelto. Las buenas interfaces son el resultado natural. Y como beneficio adicional, una vez que pasas todas tus pruebas, sabes que has terminado.


Soy del mundo de desarrolladores basado en MS, así que aquí está mi opinión sobre este

  1. Más sobre nuevos conceptos en Cloud Computing (varias API, etc.). Como la industria está apostando en ello por algún tiempo.

  2. Más sobre LinQ para el framework .net

  3. Bases de datos distribuidas


Soy una persona de libros, por lo que realmente no me molestaría con la instrucción.

No necesariamente en este orden, y dependiendo de lo que ya sabes

  • Programación OO
  • Programación Funcional
  • Estructuras de datos y algoritmos.
  • Procesamiento en paralelo
  • Establecer lógica basada (esencialmente la teoría detrás de sql y cómo aplicarla)
  • Construyendo parsers (solo puse esto, porque en realidad surgió donde trabajo)
  • Métodos de desarrollo de software

Supongo que "avanzado" es diferente para todos, pero sugeriría lo siguiente como cosas que los desarrolladores más decentes (es decir, a los que no necesitan que se les diga sobre la integridad del NP o los patrones de diseño) podrían beneficiarse de:

  • Técnicas de multihilo que van más allá del "bloqueo" y cuándo aplicarlas.
  • Entrenamiento en profundidad para aprender y acostumbrarse con características inteligentes en su cadena de herramientas (IDE / editor de texto, depurador, generador de perfiles, shell).
  • Parte de la teoría de la criptografía y la experiencia práctica con diferentes fallas comunes en los esquemas de seguridad que las personas crean.
  • Si se programan en una base de datos, conozca las partes internas de su base de datos y las técnicas avanzadas de composición y ajuste de consultas.

Técnicas de refactorización (lo que implica también aprender a escribir un buen conjunto de pruebas de unidad / funcionales).

Saber cómo refactorizar es la mejor manera de mantener limpio el código; es raro que lo hagas bien la primera vez (especialmente en los nuevos diseños).

Sin embargo, varias refactorizaciones requieren un conjunto decente de pruebas para verificar que la refactorización no haya agregado un comportamiento inesperado.


Uno de los mejores cursos que tomé fue un curso de escritura técnica. Me ha servido bien en mi carrera.

Además, es probable que no importe el tema, ya que el hecho de que la organización esté interesada en él y pague por él y que los desarrolladores quieran ir, es un mejor indicador de éxito / mejora que cualquier otro tema en particular.

Tampoco creo que importe mucho lo que es el tema. Las organizaciones de desarrollo se ocupan de tantas cosas durante un proyecto que la capacitación y luego la implementación / prueba y error en el trabajo siempre le brindarán una mejor perspectiva, incluso si fracasan los intentos de probar / usar las cosas nuevas. Esa experiencia probablemente ayudará más en los proyectos posteriores.


Votaría por historias de batallas del mundo real. Haga que los desarrolladores de otras organizaciones presenten sus éxitos y fracasos. No limites las presentaciones a las tecnologías que estás usando. Con un proyecto significativamente complejo, esto está obligado a abarcar temas "avanzados" que ni siquiera has considerado. Los éxitos (y los fracasos) del mundo real tienen mucho que enseñar.


Yo sugeriría una clase de inteligencia artificial en una universidad / colegio. La mayoría de las cosas son divertidas, fáciles de entender (al menos lo básico), y las soluciones a los problemas suelen ser creativas.


Integridad NP . Específicamente, cómo detectar si un problema es NP-Completo y cómo construir una solución aproximada al problema.

Considero que esto es importante porque no desea que un desarrollador intente resolver un problema de NP-completo obteniendo la solución óptima, a menos que el espacio de búsqueda del problema sea muy pequeño, en cuyo caso la fuerza bruta es aceptable. Sin embargo, a medida que aumenta el espacio de búsqueda, el tiempo requerido para resolver el problema aumenta exponencialmente.


¡Seguridad!

Demasiados programadores simplemente crean algo y piensan que pueden agregar seguridad como una idea de último momento después de terminar la parte "principal" del programa. Siempre puede beneficiarse de saber más sobre cómo proteger su aplicación, cómo diseñar software para estar seguro desde el primer momento, cómo realizar la detección de intrusos, etc.

Desarrollo avanzado de bases de datos

Cosas como el almacenamiento de datos (MDX, consultas OLAP, esquemas en estrella, tablas de hechos, etc.), ajuste de rendimiento avanzado, esquema avanzado y patrones de consulta, y cosas por el estilo, siempre son útiles.


Depuración

La depuración de David J. Agans es un buen libro sobre el tema. La depuración puede ser muy compleja cuando se trata de programas de subprocesos múltiples, bloqueos, algoritmos que no funcionan. Todo el mundo estaría mejor siendo bueno en la depuración.


  • Pruebas automatizadas: pruebas unitarias, pruebas de integración funcional, pruebas no funcionales
  • Detalles del compilador (más relevantes en algunas plataformas que en otras): ¿Cómo implementa el compilador ciertas construcciones comunes en el lenguaje X? En una plataforma interpretada de byte-code, ¿cómo funciona la compilación JIT? ¿Qué se puede compilar con JIT (por ejemplo, se pueden compilar las llamadas virtuales con JIT)?
  • Seguridad web básica
  • Modismos de diseño comunes de otros dominios de problemas distintos de los que está trabajando en este momento.