¿Qué cosas debo aprender para convertirme en un verdadero programador en lugar de usar algunas bibliotecas que otros programadores han escrito?

Ah, saltamontes, has vislumbrado el estado exaltado del verdadero programador ™. El camino es largo y no debe ser recorrido por lo sensato, ni aquellos que necesitan trabajar para ganarse la vida. Pero si te atreves, aquí está el camino.

  1. Deja atrás los lenguajes compilados e interpretados. Estos lenguajes y compiladores fueron escritos por otros, y sus limitaciones no deberían ser suyas. Programe solo en el ensamblaje hasta que esté listo para avanzar al siguiente paso.
  2. Deja atrás el sistema operativo. El único propósito del sistema operativo es mediar entre las solicitudes de recursos en conflicto. En su computadora, sin embargo, solo se ejecutará su código, y entonces, ¿cómo puede haber algún conflicto? Inicie un shell UEFI y realice su propia gestión de la memoria hasta que esté listo para pasar al siguiente paso.
  3. Deja atrás la BIOS. Se interpone entre usted y el hardware, lo que le impide ver su verdadera naturaleza. Tome un minnowboard y escriba y actualice su propio BIOS hasta que esté listo para pasar al siguiente paso.
  4. La arquitectura de hardware que está utilizando está contaminada por las deficiencias de décadas de ingenieros de hardware. Esto es intolerable para un verdadero programador. Deje $ 15k en un tablero FPGA y haga su propia arquitectura.
  5. Los FPGAs sufren todas las limitaciones impuestas por la física. Estas no son tus limitaciones. Escriba una simulación de dinámica molecular ab initio para darse cuenta de su verdadera física, arquitectura, BIOS, sistema operativo y lenguaje. Necesitará un modesto cluster de linux que admita MPI y OpenMP; C ++ es probablemente la mejor opción para el idioma, ya que puede aprovechar muchos de los códigos físicos existentes.

tl; dr: Los verdaderos programadores son perezosos y no pierden el tiempo resolviendo problemas donde ya existen soluciones perfectamente adecuadas.

Bien. Estoy seguro de que muchas personas le dirán ‘cállate y no reinventes la rueda’. No seré uno de ellos. Escucho totalmente de dónde vienes. Una rueda necesita reinventarse una y otra vez, a diferencia de lo que muchos le dirán, muchos de nosotros sentimos la necesidad de hacer precisamente eso. Tal vez incluso algunos de los que te dicen que no lo hagas.

Es un proceso totalmente sano. Si no sintiéramos ese impulso, todavía estaríamos introduciendo tarjetas perforadas en un lector de tarjetas (o como se llamen esas cosas), porque hace el trabajo.

Así que, déjame intentarlo aquí.

  1. Escribir un editor de texto GUI. Incluso un procesador de texto. Lo he hecho una o dos veces al principio de mi carrera. Fue una experiencia significativa.
  2. Inventar un lenguaje de programación. Nunca he hecho eso, pero desearía haberlo hecho. No tiene que ser nada lujoso, pero debería ser algo que se pueda usar a la mitad (no Arnold o Shakespeare).
  3. Inventar un lenguaje de marcado de datos que no sea XML o JSON. Creo que en realidad podría ser útil para algunas personas, porque con JSON o XML no estamos cerca de la perfección. Mucho más lejos que nosotros en el área de los lenguajes de programación.
  4. Escriba un complemento para Eclipse para el lenguaje de definición de datos de adición de programación que inventó. Esa será una experiencia bastante única en aprender algo que nunca aprenderás completamente (me refiero a todas las apis de Eclipse).
  5. Escribe un pequeño sistema operativo. Eso puede arrancar una computadora y darle un indicador de comando. Inventa un sistema de archivos mientras estás en ello. Debería ser una cosa súper divertida de hacer.

No lo sé. Sólo unas pocas cosas en las que podría pensar.

Estás haciendo la pregunta equivocada. Ser un programador experto no significa reinventar la rueda y no construir sobre el trabajo de otros; La mayor parte del tiempo es simplemente un comportamiento obsesivo-compulsivo. Más bien, debería preguntarle qué necesita aprender para poder escribir bibliotecas que otros programadores puedan usar para que puedan desarrollar su trabajo.

Y eso significa comprender completamente los algoritmos comunes, saber qué hace que una API sea buena o mala (esto tiene aspectos tanto objetivos como subjetivos), saber cómo probar realmente el infierno de su código (y hacer un hábito de hacerlo). Significa saber qué funciones incluir y, lo que es más importante, qué funciones omitir. Significa saber cómo responder a las críticas de su código sin ponerse a la defensiva o ceder ante solicitudes injustificables de creep de características.

Significa comprender que * no es suficiente que el código funcione en su sistema en particular, * cómo * el código puede ser lo más no dependiente del sistema que sea posible y, una vez más, hacer que sea un hábito hacerlo.

Significa escribir código con la expectativa de que otros lo leerán y lo modificarán. Significa documentarlo correctamente, que es mucho más que simplemente crear una lista de firmas de métodos (que uno puede y debe ser completamente automatizado). Significa hacer que las limitaciones y suposiciones de su código sean * explícitas * para que el programador ocupado y sobrecargado que está considerando usar su código pueda * inmediatamente * saber si cumple con sus requisitos.

Incluso si nunca terminas de escribir una línea de código de biblioteca en tu vida, aprender todas estas cosas te hará un programador mucho mejor.

Así es como funciona:

Objetivo: implementar la característica A

Pasos: ¿Alguien más ha implementado una función similar? (Su experiencia existente y / o Google ayudan aquí). Si no tenía una maldita pista, pongámosla en el desbordamiento de pila. Quora…. Nahhh

Oh genial, encontramos una solución. Es de código abierto, cuál es su licencia.

Oh genial, encontramos una solución que casi hace lo que queremos. Es de código abierto, cuál es su licencia. ¿Puede la semana guardar las modificaciones sin abrir nuestro código?

Oh genial, encontramos una solución comercial. Cual es su licencia. Cuánto costará. ¿Nuestro presupuesto de proyecto lo cubre? ¿Qué es el ciclo de soporte? ¿Cómo vamos a parchar el sistema existente con la nueva versión.

Oh genial, parece que nadie lo ha implementado todavía. El proyecto es subestimado de repente. Muy bien, es hora de empezar a codificar esta biblioteca.

Jajaja … Me tomó la mayor parte de una década simplemente absorberlo y comenzar a usar bibliotecas en lugar de escribir todo por mí mismo.

A nadie le importa una mierda lo “duro” o lo “puro” o “verdadero” que eres como programador, siempre y cuando obtengas una mierda buena y mantenible en la puerta.

En serio, sigo diciendo esto, pero la mayoría de la codificación en estos días es un ejercicio de integración. Te tomas un tiempo y eliges todas las cosas correctas que deben unirse, luego las juntas. La lógica tiende a ser tediosa con muy pocas partes legítimamente difíciles que requieren una profunda reflexión.

Lo primero que debes aprender es no reinventar la rueda todos los días, por interesante, noble y heroico que sea …

Si todavía te molesta demasiada abstracción, pasa tu propio tiempo aprendiendo lenguaje ensamblador