¿Qué es lo más importante, útil o esclarecedor que aprendiste en los últimos 12 meses? [cerrado]

14

Mucha gente en la comunidad de codificación habla sobre la mejora continua, la práctica deliberada y demás, pero cuando hablan de sus prácticas actuales es casi como si 'surgieran completamente de los lomos de Zeus' porque no escuchas cómo sus opiniones cambiaron con el tiempo o lo que aprendieron recientemente.

De vez en cuando voy a una charla, leo un libro o hablo con alguien y se abren un poco más y descubro que aprendo mucho de estas ideas.

Entonces, si tuviera que elegir una cosa de los últimos 12 meses que aprendió, ¿cuál sería?

FinnNk
fuente

Respuestas:

18

Aprendí que solo se necesita un administrador podrido para estropear todo el proyecto, pero se necesitan muchos buenos programadores para limpiar el desorden después.

Martin Wickman
fuente
Martin, voté porque tu mensaje me hizo sonreír en este lluvioso y frío sábado por la mañana, pero no respondes a la pregunta;)
Se agregó "Aprendí que ..."
Martin Wickman
+1 porque soy uno de esos programadores este mes. Más de 70 horas la semana pasada == "mi turno en el barril".
Dan Ray
¡Reconozco eso! Debería ser cita! "Solo se necesita un administrador podrido para estropear todo el proyecto, pero se necesitan muchos buenos programadores para limpiar el desastre después".
Amir Rezaei el
12

Después de aprender algo de Clojure , comencé a darme cuenta de la utilidad de la programación funcional , y mi estilo de codificación Java se ha visto muy afectado por eso. Contrariamente a la creencia popular, un lenguaje de programación funcional no es un prerrequisito absoluto para realizar alguna programación funcional.

Es posible incorporar bastantes elementos de programación funcional en un lenguaje imperativo como Java, e incluso si no siempre es idiomático, puede ser muy beneficioso en algunos problemas. Por ejemplo, las clases anónimas son aproximadamente iguales a los cierres, como se describe en wikipedia . La evaluación perezosa debería ser una norma más que algo inusual. La inmutabilidad difícilmente puede ser utilizada en exceso. Simplemente supere la idea (casi) obsoleta de que construir nuevos objetos en lugar de mutar los existentes es costoso debido al consumo de GC y montón: en el 99.9% de los casos simplemente no es relevante. De hecho, el procesamiento paralelo puede voltear incluso el argumento de la eficiencia al revés: crear nuevos objetos inmutables puede ser más barato que mutar los existentes, porque se elimina el bloqueo.

Más información sobre cómo hacer FP en Java puro aquí , aquí , aquí y aquí .

Joonas Pulakka
fuente
+1 estoy de acuerdo. Es triste que Java tenga tan mal soporte para la programación funcional.
Jonas
Yo he tenido un interés de larga data en la FP (mi primer trabajo involucrado Lisp) y yo creo que es muy interesante que en los últimos años es finalmente convertirse en un paradigma bastante 'común' junto OO etc.
FinnNk
Java 7 debería tener mejores cierres al menos. Y usar bibliotecas inteligentes como lambdaj puede hacer maravillas para corregir las deficiencias del lenguaje en sí.
Joonas Pulakka
Me gustaría tener un mejor soporte para la recursividad de cola en Java / JVM.
Jonas
1
Método @Helper: los dos primeros enlaces en mi respuesta son artículos sobre FP con Java. No conozco ningún libro sobre el tema. Creo que el mejor método para "entenderlo" es aprender un lenguaje FP real y luego comenzar a usar objetos más inmutables en su código Java.
Joonas Pulakka
10

Incluso si tiene un equipo excelente y una administración competente para ese equipo, su trabajo aún no es seguro. La alta gerencia aún puede hacer cosas tontas, como disolver toda su Dirección.

En resumen: la política importa y, a veces, la política que te afecta no puedes controlarla.

Frank Shearar
fuente
Te doy un +1 virtual porque Martin ya me hace sonreír con una respuesta similar;) ¿Leíste Dead March? este es un libro sobre lo que estás hablando
(Convierto el voto virtual en uno real)
9

Aprendí que el propósito de las pruebas de software es encontrar errores . Es no para verificar que el sistema es correcta.

Hay importantes factores psicológicos en juego: si su objetivo es demostrar que el programa es "correcto", gravitará hacia las pruebas que sabe que pasarán. Pero si su objetivo es encontrar errores, gravitará hacia las pruebas que realmente llevarán su sistema a los límites.

Incluso hay un cambio importante en el idioma que usa. Si una prueba encuentra un error, lo llamas exitoso . Si la prueba no lo hace [es decir, el programa pasa], usted lo llama fallido . Me sorprendí siguiendo las líneas del pensamiento de "verificación", y eso hace una gran diferencia.

Este efecto psicológico se discute más en The Art of Software Testing , un libro clásico que recomiendo encarecidamente. El autor, Myers, también recomienda que quien esté probando un programa no sea el autor, ni siquiera en la misma cadena de administración. Puede hacer esto si está codificando por su cuenta, por lo que requiere disciplina.

Macneil
fuente
8

Hacer un desarrollo impulsado por la prueba desde el principio en una entrega al cliente para ver cómo afectaría la calidad del código, y solo se ejecuta desde el iniciador JUnit en Eclipse. Resultó en un mejor producto.


fuente
Tenga en cuenta que no encontré una manera de vincular "Volver a ejecutar la última prueba unitaria" a una clave. Esto lo hizo un poco tedioso.
5

El verdadero valor de la programación sin ego.

En algún nivel, siempre supe que el ego y la programación no se mezclan, pero nunca razoné las consecuencias. La idea de que tienes que revisar activamente y encontrar fallas en tus propias prácticas es algo que recién comencé a darme cuenta el año pasado. También estoy aprendiendo a buscar activamente críticas de mis diseños (tanto en la interfaz de usuario como en el código).

Sin embargo, para ser honesto, todavía estoy aprendiendo a dejar caer el ego, y probablemente aprenderé a hacerlo durante el resto de mi carrera de programación.

Joeri Sebrechts
fuente
3

Aquí está mi respuesta a mi propia pregunta:

Hace aproximadamente un año, hizo clic en que las pruebas de aceptación automatizadas no debían ser versiones automatizadas de las pruebas que nuestros evaluadores habrían hecho manualmente. Centrarse en las pruebas según especificaciones individuales en lugar de intentar alcanzar el máximo posible en una sola pasada hizo que las pruebas fueran mucho más simples, fáciles de leer y también ayuda a fomentar la entrega incremental.

FinnNk
fuente
3

Aprendí cómo un concepto matemático como Semirings se aplica a los algoritmos. Con esto, puede mostrar cómo algunos algoritmos son iguales, excepto para usar un semiring diferente. Esto no debería ser tan extraño para mí como programador, pero me voló la cabeza.

Peter Stuifzand
fuente
1
¿Tienes un ejemplo de uno?
Mark C
Hay un ejemplo en el libro Elemento de programación que usa una función que calcula potencias y algunas cosas de Fibonacci, que calcula fib en tiempo O (log n). Creo que el ejemplo se puede encontrar aquí cpp-next.com/archive/2010/03/eop-ch3-preview , pero ese sitio web responde con un error interno del servidor.
Peter Stuifzand
3

Además de la política que mencionó Frank Shearar , recientemente descubrí QUnit y JSCoverage que me alegraron el día. Y mes. Nunca pensé que sería posible probar JavaScript unitariamente con cobertura de código, pero ahí está ... :-)

Dr. Hannibal Lecter
fuente
Esto está en mi radar para el próximo año, he incursionado un poco en las pruebas de la unidad js pero aún no en un proyecto real. ¡No sabía que había una herramienta de cobertura disponible!
FinnNk
2

Mis tres gracias principales por el último año de programación irían a lo siguiente (en orden descendente de importancia y agradecimiento):

  • El paradigma de programación funcional para abrir mi mente a otras formas, a menudo más elegantes y concisas, de expresar ideas y algoritmos en código. Siento que mi habilidad general de programación ha mejorado mucho en muy poco tiempo, gracias a las ideas de programación funcional.

    (Mi agradecimiento personal a Tomáš Petříček por su excelente libro Programación funcional del mundo real ).

  • tanto la inyección de dependencia como las pruebas unitarias me han enseñado que la composición de objetos es posiblemente la mejor manera de crear sistemas complejos (orientados a objetos) (y que la herencia de clases no es tan importante como solía pensar). Ambos me han enseñado y me han hecho pensar en cómo componer los mejores sistemas y cómo escribir componentes que sean fáciles de usar, pero que sigan siendo lo suficientemente flexibles para su reutilización.

    (Si tuviera que mencionar un buen recurso de enseñanza, diría el Arte de las pruebas unitarias de Roy Osherove ).

Todo esto en conjunto me ha llevado a escribir código que generalmente tiene menos errores que antes, porque ahora estoy escribiendo un código que es mucho más fácil de entender y equivocar que lo que publiqué anteriormente.

stakx
fuente
2

Lo que cambia en la industria del software en rápida evolución, la curva de aprendizaje siempre está aquí. "Si solo hubiera una manera de aprender sin tomarse el tiempo para aprender".

wassimans
fuente
El hecho de que siempre haya cosas nuevas que aprender es, para mí, uno de los grandes atractivos de esta profesión. Los sistemas de TI a menudo tratan de cómo manejar mejor la creciente complejidad, y me encanta descubrir nuevas teorías y conceptos en esa dirección. Por otro lado, todo puede ser frustrante a veces, porque tener que mantenerse al día con el estado de la técnica puede sentirse un poco como una carrera constante.
stakx
1

Aprendí que ser vendido a una nueva compañía puede mejorar su trabajo. Mi organización fue comprada a nuestra antigua empresa en mayo, y las cosas parecen seguir mejorando. La nueva compañía ha ahorrado poco o ningún gasto con nuestra nueva oficina, reemplazado nuestras máquinas de desarrollo obsoletas con equipos del siglo XXI, exhibió flexibilidad para administrar nuestros proyectos y, en general, nos hizo sentir más que bienvenidos.

Se siente un poco deprimente ser vendido (un poco como un siervo que tiene un nuevo señor feudal porque está atado a la tierra que cambió de manos), pero el resultado final ha sido mucho mejor de lo que esperaba.

Bedwyr
fuente
0

Yo diría que usa las pruebas unitarias de Microsoft en Visual Studio 2010.

Me resultó muy fácil depurar un método de prueba específico.

Podría ejecutar en cualquier momento mi proyecto de prueba para ver si la aplicación de capa empresarial funciona bien. El proceso de prueba garantiza que mi equipo no debería tener problemas al implementar la solución completa para los visitantes de nuestro sitio web.

Junior M
fuente
0
  • Python básico aprendido (usándolo para escribir scripts rápidos a veces)

  • Instalé ArchLinux en VM (tenía Ubuntu en VM antes, ¡mi PC ahora es rápida!)

  • Comenzó con MATLAB (especialmente para trazar gráficos y verificaciones numéricas rápidas)

  • Cambió a Mercurial (desde SVN) (¡ramificación y fusión!)

Vaibhav Bajpai
fuente
0

Aprender el patrón MVVM me ayudó a ser mucho menos hack.

bufferz
fuente
-1

Tuve que comenzar a mantener una aplicación web Python, así que decidí que también era un buen momento para aprender Vim . Ahora estoy usando el complemento IdeaVim para Intellij para mi desarrollo Java y Flex y definitivamente creo que ha hecho que mi escritura sea más rápida y eficiente.

Watson
fuente
1
Realmente - -1? ¿Quieres desempacar eso para mí? ¿La gente no cree que VIM sea esclarecedor o útil?
Watson