Dificultad en el trabajo de un programador.



Hoy quiero especular sobre la complejidad que nos rodea (las personas) y sobre nuestra capacidad para trabajar con ella. No de la complejidad que escriben en los estados de estado civil en las redes sociales, como “todo es complicado”, sino de la complejidad en los sistemas organizativos y técnicos (por cierto, en mi opinión, resultó un buen nombre para una especialidad universitaria). No pretendo ser original y, además, no pretendo ser cierto (sobre todo porque, al menos la mitad, estoy aquí para degradar, jugar y tontear). Parte de este razonamiento ya lo he hecho en algún lugar de los comentarios, pero para mí esta pregunta no está cerrada. Por eso, la vida siempre me arroja varios ejemplos ilustrativos que me animan a pensar más. A pesar del viernes, no estaba destinado a ser una lectura entretenida, no habrá imágenes divertidas, en todo caso, les advertí. Si solo quiere leer una oración,y vaya a leer el resto de los divertidos artículos del viernes. Aquí está: "Simplifique la complejidad donde se puede hacer, maneje la complejidad donde no se puede simplificar y gane experiencia y la capacidad de distinguir el primer caso del segundo". Se adapta como un brindis de viernes.



Algunas citas de los grandes:



Entender es simplificar.



Simplificar no es comprender.



La sencillez requiere diseño y buen gusto.



Manténgalo lo más simple posible, pero no más simple.




La complejidad está en todas partes a nuestro alrededor. Usamos dispositivos técnicos sofisticados, respetamos un código penal complejo, dentro de nosotros un sistema inmunológico complejo combate el coronavirus, los seres vivos unicelulares más simples llevan orgánulos increíblemente complejos, la ley más simple de Newton resulta ser una simplificación de una ley mucho más compleja a velocidades no relativistas, y sobre la complejidad de los Modelos Estándar y todo tipo de diferentes mecánicas cuánticas, generalmente me quedo callado.



La complejidad es siempre un cierto orden, un cierto sistema de elementos que interactúan, y de acuerdo con la definición de este concepto básico, la complejidad crece cuando aumenta el número de elementos y cuando aumenta el número y variedad de conexiones entre estos elementos. ¿Quizás complejidad es sinónimo de orden, la antítesis del caos?

La vida en general es un aumento espontáneo de complejidad dentro de nosotros debido a una disminución de la complejidad en el exterior, como debería ser para cualquier sistema disipativo decente. La energía se redistribuye de tal manera que para aumentar la complejidad, es necesario gastar parte de ella, pero la organización resultante, el orden resultante, da "acceso" a grandes cantidades de energía. Esta es, creo, la razón evolutiva del aumento "espontáneo" de la complejidad de la vida.



Los sistemas complejos que nos rodean, la complejidad de la organización de la materia y la energía alrededor, que uno quiere disipar, conducen a un aumento en la complejidad del consumidor, y más a lo largo de la cadena. Una flor en la que se puede llegar al néctar solo con la ayuda de un tronco largo provoca el bombeo de los labios con complicación de silicona , alargamiento y especialización del tronco en aquellas mariposas que se decidieron por tal solución de diseño.



Somos programadores, creamos sistemas de software que, como el tronco de esa mariposa, deben ser complicados para automatizar soluciones similares a los complicados procesos complejos de la vida.



Somos programadores, creamos complejossistemas de software, y no importa lo que digan, nos gusta crear esta complejidad, pero hay un matiz que nos distingue de los creadores de cualquier otro sistema técnico complejo.



El creador de un material complejo y un dispositivo técnico está limitado por la fuerza, la fricción y otros materiales que amortiguan ligeramente el vuelo de su imaginación. La fuerza de fricción del programador no importa ni limita (a menos que sea el desarrollador del mejor simulador de fracturamiento hidráulico del mundo ), la fuerza y ​​el peso del dispositivo también, y de aquí, en mi opinión, surge el problema principal.



Y radica en el hecho de que es demasiado fácil para nosotros los programadores crear complejidad. Es demasiado fácil para nosotros. Ctrl + C y Ctrl + V, una nueva función, un nuevo módulo, una nueva biblioteca, una nueva capa de abstracción, macros-shmakros, preprocesadores-posprocesadores, adaptadores, conversores y fachadas - todo esto funcionará, solo tienes que agregar más frecuencia y RAM, y no se necesita reductor de fricción. En el mundo físico creado, no todo es tan simple. ¿Dónde en la producción industrial hay análogos no solo de la programación genética, sino al menos incluso de las simples macros Lisp?



De nuevo. Es demasiado fácil en la programación para agregar complejidad y demasiado difícil en la programación para reducir la complejidad. Además, a nadie le gustan los que reducen la complejidad en la programación, porque siempre rompen todo durante la refactorización.



No estoy diciendo que el código complejo sea algo malo. El código automatiza una tarea de la vida real, la refleja en sus modelos de datos, el código no puede ser más simple que la vida. La complejidad del código crece junto con la complejidad del problema, pero un desarrollador analfabeto agrega mucha más complejidad al código que la complejidad del problema.



Un desarrollador competente se abstiene de introducir complejidad en el código. No es de extrañar que los grandes dijeran que, dado que depurar es más difícil que escribir código, no podrá depurar el código que escribió en el límite de la complejidad disponible para usted. Pero también diría que un desarrollador competente no crea soluciones más difíciles que el 84% de su capacidad para hacer frente a la complejidad.



La incapacidad para diseñar futuros cambios impredecibles en los requisitos de la vida lleva al hecho de que el código tiene que ser reescrito y reelaborado. Hola, soy tu gorra. Pero no puede reescribir sistemas de software complejos desde cero solo porque no le gustan por su complejidad.



La complejidad y la confusión son dos cosas diferentes. Como siempre les digo a los estudiantes que trajeron el laboratorio de otra persona y están seguros de que lo entendieron (dos marcos recientemente incluso dijeron que pensaban que deberían aprender a explicar el código de otra persona y no escribir el suyo propio, explique, Karl, ni siquiera editar y desarrollar !), es imposible entender que no entiendes algo si no lo entiendes. En este lado del umbral inductivo, la situación “creo que entendí” es indistinguible de la situación “realmente entendí”.



Si alguien se le acerca y le dice: "Aquí es demasiado difícil para usted, escribiremos desde cero", no debe dejarlo entrar para escribir, primero debe demostrar que puede refactorizar el sistema anterior. Si no puede hacer frente a la complejidad que ya tiene, mediante el método de refactorización gradual, cuando comience a escribir usted mismo, torcerá la complejidad aún peor y al final no resolverá el problema. ¿Y por qué? Porque es imposible entender qué es exactamente lo que no entiendes y subestimas, por definición.



Exagerando: incluso inventar la bicicleta adecuada no funcionará la primera vez. La primera bicicleta será curva y oblicua, con tres marchas conectadas por pares, como en los cuadros clásicos de niñas-diseñadoras. Pero lo llevará al nivel de dificultad con el que necesita trabajar al construirlo, y la segunda bicicleta ya saldrá sensata. Escriben su propia clase de cadenas no para aprender la sintaxis, sino para obtener una porción de complejidad vivificante.



La complejidad de una y la misma pieza de código, de la misma solución, depende en gran medida de cuán complejo sea ya en el sistema, y ​​la complejidad del sistema no es la suma de las complejidades de los subsistemas. Y esto es parte del problema cuando se trabaja con un cliente o cualquier otro observador externo. Probablemente hayas escuchado muchas veces: "Es fácil de hacer, es solo {acción X} {dentro del sistema Y}, ¡ahí ya existe {dentro del sistema Z}!". Este es el resultado de subestimar la complejidad sistémica, cuando una persona cree que si algo es fácil de hacer por separado de todo lo demás, entonces es fácil hacerlo dentro de un gran sistema prefabricado. Si el programa necesita implementar A, B, C, D, E y F, y todos son aproximadamente iguales en complejidad, sería una fuerte subestimación pensar que se construirán al mismo tiempo.



Lo principal para un programador experimentado es la capacidad de gestionar la complejidad. Por lo general, solo agregamos complejidad (no se puede simplemente refactorizar), pero ¡ay de alguien que no llega a la refactorización (de hecho, simplificación!). Entonces, en lugar de poner las cosas en orden y simplificar, tal desarrollador enrolla muletas con muletas y no puede detenerse, porque las muletas son más fáciles de escribir. Con el tiempo se vuelve cada vez más difícil escribir con muletas, pero el truco es que en cada momento es cada vez más difícil escribir otra muleta, pero siempre es más fácil que limpiar los establos y poner las cosas en orden. Y siempre existe la ilusión de que debido a los plazos, la solución óptima es escribir muletas. Por desgracia, esta es la solución óptima en este momento, pero muy subóptima a largo plazo. Programación codiciosa.



La capacidad de hacer frente a la complejidad, anticipar las consecuencias y ver las relaciones fuera del objeto en cuestión es en sí mismo un gran valor profesional, así es como los programadores se convierten en gerentes y jefes. En cierto sentido, predecir el comportamiento de un sistema complejo, anticipar las consecuencias de nuevas conexiones de sistemas emergentes, "depuración mental" y "probar para casos extremos", "a qué conducirá esto", como habilidad profesional de los programadores, fomenta su crecimiento en gerentes, junto con habilidades generales de abstracción, inducción y deducción. Es cierto que la reflexión y la introspección, la introversión, como una serie de otras habilidades profesionales de los programadores, por el contrario, los limita en este crecimiento.



¿Cómo aprendes a lidiar con la complejidad? No tengo otra receta que un consejo para aprender a ver qué funciona para esta habilidad y qué funciona en su contra. Pero en cualquier caso, creo que todo comienza con la educación más básica. Estudios. La repetición es la madre del aprendizaje. Soy profesor, tengo una deformación profesional: repetir dos veces lo mismo. Soy profesor, tengo una deformación profesional: repetir dos veces lo mismo. Entreno redes neuronales naturales poco profundas que no sufren de sobreajuste , y todas las redes neuronales deben ser muestreadas varias veces. La repetición es también una forma de lidiar con la complejidad, es con la repetición que se refactoriza el modelo mental de la realidad, y nada más.



A menudo hay muchas quejas sobre la enseñanza en general y la enseñanza en la escuela y la universidad en particular sobre el hecho de que se está enseñando algo irrelevante, los cerebros están llenos de conocimientos y habilidades innecesarios. Mi hija tenía cubos tan huecos con agujeros de diferentes geometrías, y solo caían dentro figuras más pequeñas de la forma correspondiente. ¿Hay alguien que piense que un niño al que se le enseña a seleccionar una clave de la forma geométrica deseada necesitará las habilidades de un oso de insectos en la edad adulta?



Creo que una parte muy importante de la educación, y desde cero hasta la defensa de la primera disertación, es entrenar el cerebro para hacer frente a la complejidad. Cuando un niño en la escuela aprende a multiplicar números de tres dígitos en una columna en una hoja de papel, nadie en su sano juicio pensará que esta habilidad le será útil en la vida. Multiplicar correctamente dos números de tres dígitos en una columna es un ejercicio de la capacidad de forzar el cerebro, tener en cuenta un par de números y no perder la concentración durante un período de tiempo determinado. Primero agregue una columna, luego multiplique, luego divida. Incrementando la complejidad. La capacidad de esforzarse, la capacidad de trabajar.



¿Es esta la calidad adecuada? ¡Depende de a quién quieras crear! Si es un "usuario calificado", entonces no es necesario. Si "un hombre creador", entonces, creo, es necesario. En la vida, la capacidad de multiplicar en una columna no es útil, en la vida será útil poder multiplicar los mismos números en el teléfono, si necesita una respuesta exacta, y la capacidad de dejar solo 1 dígito significativo de cada número en su mente sin un teléfono y estime aproximadamente el orden del valor obtenido. Y esto, por cierto, tampoco es más que la capacidad de trabajar con complejidad: tomar decisiones rápidamente sobre datos complejos, simplificando los datos de entrada y utilizando estimaciones aproximadas. Pero si alguien cree que en su trabajo no necesitará concentrarse y sin errores realizar algunas operaciones rutinarias similares, lo más probable es que no vaya a trabajar con la cabeza en esta vida.



Concluyendo esto, por supuesto, una corriente de pensamientos mal ordenada, solo quiero repetir una vez más el llamamiento hecho en el primer párrafo. Aprenda a simplificar la complejidad donde se puede hacer, aprenda a lidiar con la complejidad donde no se puede simplificar y desarrolle experiencia y la capacidad de distinguir la primera de la segunda.



All Articles