¿Por qué casi todos los trabajos de investigación en informática escritos por profesores universitarios y estudiantes de doctorado tienen muy poco que ver con escribir código? La mayoría de los documentos que he leído son simplemente inútiles cuando se trata de mejorar mis habilidades de programación.

Los trabajos de investigación de CS son extraordinariamente valiosos y útiles para el público al que están destinados. Pero esa audiencia, en general, no es gente que “quiere escribir un mejor código”.

Entonces, si su objetivo es escribir un mejor código, entonces, casi con seguridad, como ya lo descubrió, leyendo trabajos de investigación de profesores universitarios y doctores. No es probable que los estudiantes sean el mejor uso de su tiempo.

Si su objetivo es “escribir un código mejor”, le servirá mejor leer libros y artículos de autores como Robert C. Martin, Sandi Metz, Kent Beck, Martin Fowler y otros escritores que han hecho “ayudar a las personas escribir un mejor código “, una parte central de su misión.

También trato de trabajar con estudiantes en mis clases de programación en UCSB para ayudarlos a escribir un mejor código. También tengo bastante claro que esa actividad no es realmente un tema de “informática central”. Algunas personas llaman a eso “Ingeniería de software”. Prefiero el término emergente “Code Craftsmanship”, o el término más neutral de género “Code Craft”.

Entonces, si la investigación de CS NO se trata de escribir un mejor código, ¿de qué se trata?

Les digo a mis alumnos que la informática es el estudio de abstracciones y algoritmos. La investigación de CS generalmente implica encontrar nuevas abstracciones y nuevos algoritmos para resolver problemas.

Por ejemplo, la investigación en Machine Learning podría centrarse en formas de hacer que un algoritmo de aprendizaje automático (por ejemplo, para la identificación de objetos en fotografías) sea más preciso (es decir, cometa menos errores) o sea más fácil de entrenar (es decir, no tiene que darle tantos ejemplos de fotografías etiquetadas antes de que pueda comenzar a identificar objetos por sí mismo).

Llevar a cabo dicha investigación generalmente implicará escribir mucho código. Por lo tanto, los investigadores de CS deben ser buenos para escribir código, o deben tener colaboradores o ayudantes que sean buenos para escribir código. Pero “escribir un código mejor”, per se, no es el objetivo de la investigación de CS.

Hay algunos investigadores de CS en áreas particulares de investigación de Ingeniería de Software que hacen de la calidad del código su especialidad.

Algunos investigadores de CS también son codificadores sobresalientes. Y algunos proyectos de investigación de CS también producen piezas de software de código abierto de larga duración como subproducto de la investigación.

Sin embargo, el código, per se, NO es el objetivo de la investigación de CS. El objetivo es obtener nuevos conocimientos sobre abstracciones y algoritmos útiles.

Para la mayoría de los investigadores de CS, el código es solo un medio para un fin, por ejemplo, para probar dos estrategias diferentes de reemplazo de caché, o dos formas diferentes de optimizar el código de máquina producido por un compilador, o recolectar basura en la JVM, o diseñar un nivel múltiple red neuronal

Desde el punto de vista de la investigación de CS, el código utilizado para probar un enfoque particular podría ser “Código limpio” (en el sentido del famoso libro de Martin Fowler), en cuyo caso podría ser lanzado como un proyecto útil de código abierto, y ese proyecto podría conseguir que los autores tengan más fama y reconocimiento que sus documentos de conferencia y artículos de revistas.

O bien, el código podría ser algo que se integre rápidamente para completar el trabajo, lleno de antipatrones y malas opciones de diseño (desde el punto de vista del mantenimiento del software a largo plazo).

Lo que le importa al investigador de CS, por lo general, es: qué algoritmo produce los mejores resultados. El algoritmo es lo que se revisa y publica por pares, no el código.

Espero que esto le ayude a entender por qué, si está buscando ayuda para mejorar sus habilidades de codificación, los documentos de investigación de CS son el lugar equivocado para buscar.

La pregunta se lee un poco como “¿por qué no se centran más trabajos académicos en ingeniería civil o arquitectura en martillos y destornilladores?” O “al describir el campo de la ingeniería náutica, ¿por qué los ingenieros no enfocan el software CAD utilizado en el diseño o el grúas utilizadas para la construcción? “.

La respuesta a ambas preguntas es: porque esas son las herramientas utilizadas para expresar los principios fundamentales, y el propósito de un trabajo de investigación académica debe ser explicar una contribución nueva y convincente al estado del arte en el campo (aunque no todos los trabajos) lograr esto, y la informática como un campo tiende a ignorar cualquier investigación de más de unos pocos años, pero ese es otro problema …).

Convertirse en un mejor programador y disfrutar de la programación son objetivos loables. Sin embargo, hay otras formas de lograr esto. La mayoría de ellos se reduce a escribir más código. También ayuda a recibir comentarios de otras personas con más experiencia que toman en serio la codificación: muchas prácticas modernas de desarrollo de software enfatizan este enfoque (por ejemplo, “desarrollo ágil”) y pueden convertirlo en un mejor programador como subproducto de su trabajo profesional. Comenzar un proyecto que te apasiona y escribir un programa real y de complejidad moderada también puede mejorar tus habilidades. Tengo un buen amigo que convirtió el proyecto de pregrado “escribir una calculadora” en algo lleno de funciones y útil. Todavía trabaja en él en su tiempo libre después de obtener un doctorado en informática y muchos años como programador profesional. Cualquiera que vea su antiguo código en un proyecto como ese notará la diferencia (y a veces se encogerá). Las herramientas y procesos que rodean ese código (por ejemplo, el entorno de compilación, el control de versiones, etc.) a veces evolucionan más que el código en sí.

Con el tiempo, su técnica y su sentido de la estética evolucionan. Hay una forma casi infinita de estructurar las cosas, y mucho debate sobre el “mejor” enfoque.

Estás tratando de hacer un pastel mirando la imagen en el frente de la caja . Si quieres convertirte en un mejor programador, leer los documentos de investigación de CS no es el mejor medio para hacerlo, ya que la mayoría de las veces, los documentos giran en torno a conclusiones (la nueva idea) más que al proceso en sí (una tonelada de programación). Hay algunos buenos recursos sobre algoritmos y lenguajes de programación, pero serán demasiado detallados para sus propósitos.

Intenté salir de mi propio cuerpo y preguntarme: “ ¿Sería útil mi propio trabajo para un aspirante a programador? “La respuesta a la que llegué es” no “, y aquí hay un ejemplo de mi proceso de pensamiento usando mi trabajo de taller más reciente:

Proyecto: Creación de un lago virtual de datos para la recolección y distribución de datos geoespaciales.

Métodos: Pasé 5 meses codificando un promedio de 25 horas por semana. Construyó cada componente del programa final una pieza a la vez. Trabajos de investigación consultados para tener una idea de cómo deberían funcionar las partes individuales. Trabajó para obtener información de antecedentes de una gran cantidad de disciplinas científicas para garantizar que el programa y sus resultados sean útiles. Probado cada parte de la aplicación. Escribí un montón de código para hacer que mis visualizaciones (que ni siquiera podía caber en el artículo final) fueran bonitas. Tengo repositorios privados de github COMPLETOS de un código maravilloso que nunca será visto por nadie más que mi equipo y yo (a menos que vayamos a código abierto después del manuscrito).

Lo que realmente apareció en el documento: fuentes que inspiraron mi trabajo, la arquitectura de alto nivel de mi programa, una explicación de cómo manejamos las dificultades, observaciones finales, evaluaciones y trabajos futuros.

Nada sobre el código o las herramientas útiles que debe usar al intentar recrear mi programa (a menos que piense que una breve mención de Amazon EC2 y Docker Containers cuenta). Estoy bastante seguro de que nunca mencioné los lenguajes de programación que utilicé. Digo que tenemos una ‘interfaz web’, pero ni siquiera te digo lo que funciona en los extremos frontal o posterior.

Una regla general: cualquier materia con “ciencia” en el título no es una ciencia.

Por lo tanto, tenemos física, química, biología, astronomía, geología y una gran cantidad de disciplinas científicas relacionadas de alguna manera con esas ciencias naturales. Hay una superposición considerable. Hemos aplicado ciencias como la medicina, la ingeniería y la agricultura. Nuevamente, existe una superposición considerable: la medicina requiere la aplicación de principios científicos de muchas disciplinas diferentes.

En una línea similar, hemos creado “Ciencias formales” para describir y modelar sistemas encontrados en las ciencias naturales. Estos incluyen lógica, matemáticas, lingüística y (en algunos casos), filosofía. Una vez más, tenga en cuenta la ausencia de la palabra “ciencia”.

Cuando examinamos temas que usan la palabra “ciencia” en su título, podríamos comenzar a ver un patrón: Ciencias Médicas, Ciencias de Cohetes, Ciencias Políticas y Ciencias Sociales, como ejemplos.

Cada una de estas disciplinas hace uso del método científico en una medida u otra y hace uso de la verdad científica, pero no (generalmente) contribuye a nuestra comprensión de la ciencia física subyacente. Obviamente, hay muchas excepciones: un médico puede descubrir algo de verdad fundamental sobre la biología, por ejemplo, pero ese descubrimiento está más allá del objetivo (o el propósito) de la medicina: curar a los enfermos y reducir el sufrimiento humano.

Cuando consideramos la “informática”, vemos una tormenta perfecta emergiendo. La “informática” se asocia generalmente con alguna rama de las matemáticas aplicadas. En mi Alma Mater (Universidad de Edinboro de Pensilvania), los estudiantes de ciencias de la computación (incluso los becarios pobres de “Seguimiento de aplicaciones”) se encuentran convirtiéndose en estudiantes de matemáticas. Aquellos que no encajan en ese molde en particular son desviados a programas con títulos como “Sistemas de información de gestión” o “Tecnología de la información”. La computadora en sí misma es simplemente una herramienta para la expresión matemática.

Como analogía, considere un tractor agrícola: obviamente, un tractor utiliza muchos principios científicos: los principios mecánicos subyacentes son parte integrante de la física; el combustible nos llega de químicos y geólogos, los ingenieros diseñan y construyen los tractores, la ciencia aplicada de la agricultura hace uso de principios biológicos para decirnos CÓMO y CUÁNDO usar el tractor para arar, plantar, fertilizar, escardar y finalmente cosechar cultivos.

¿Cómo organizaría una materia titulada “ciencia del tractor”? Bueno, los agricultores son los que hacen uso de los tractores (principalmente), por lo que incluiremos la “ciencia del tractor” en el programa de ciencias agrícolas. Si va a estudiar ciencias de los tractores, necesitará saber mucho sobre el ciclo de vida del maíz, la soja y varios cultivos en hileras. Estudiarás con nauseabundo detalle los diversos implementos que están unidos al tractor y cómo esos implementos afectan las condiciones del suelo, la humedad y el estiércol. Dado que hay muchos tractores diferentes en el mercado que queman gasolina, combustible diesel o biomasa, vamos a considerar el tractor en sí mismo como una abstracción, un dispositivo teórico generalizado que tira o empuja los implementos de la agricultura.

¿Ves a dónde va esto? “Tractor Science” se ha convertido en una rama especializada de la agricultura, que es una forma aplicada de botánica y zoología, ambas aplicaciones especializadas de la biología. Ahora tiene una disciplina académica terciaria: una que requerirá toda la infraestructura que se encuentra en cualquier otro esfuerzo académico: investigación activa, publicaciones revisadas por pares, una jerarquía académica y un consenso general sobre lo que implica exactamente el tema.

Al principio, habrá artículos de interés práctico: ¿Debería el tractor usar un motor de combustión interna o vapor? ¿Qué combustibles son los más adecuados para el uso agrícola? ¿El tractor debe usar ruedas o orugas? ¿Qué disposición de ruedas es óptima para los cultivos en hileras? ¿Qué tan rápido necesita ir un tractor? ¿Debería la transmisión de potencia ser puramente mecánica o es mejor un sistema de accionamiento hidráulico? A medida que la disciplina madura, la discusión se vuelve más académica: ¿qué pasa si ponemos muchos implementos en paralelo en lugar de aumentar la velocidad del tractor? ¿Cómo puede una arquitectura paralela competir con un tractor más rápido? Pronto, la notación “Big O” se usa para comparar la eficacia relativa de los implementos del tractor. Finalmente, vemos artículos de “pastel en el cielo” sobre “Tractores cuánticos” que simplemente reorganizan la organización de la materia a un nivel subatómico para lograr un campo arado.

Bienvenido a la informática a principios del siglo XXI: las preguntas simples han sido respondidas; las respuestas a problemas complejos (como una IA fuerte) continúan eludiéndonos; y los académicos han comenzado a escribir formas de ciencia ficción altamente ofuscadas y etéreas para publicarse.

Si desea mejorar su capacidad de codificación y su empleabilidad como codificador, busque una copia de “El arte de la programación de computadoras” de Donald Knuth y léala. Implemente unos cientos de algoritmos básicos en su lenguaje de programación favorito y cree una cartera. Escriba un artículo o dos que no sean una mierda ofuscada y publíquelo. Crea una “aplicación asesina” en tu tiempo libre. ¡La mejor de las suertes!

Leer artículos científicos sobre dinámica de fluidos no te hará un mejor fontanero.

Sí, la mayoría de los documentos CS tendrán una gran cantidad de programación involucrada. Sin embargo, no es allí donde ocurren los importantes avances novedosos, por lo que no es lo que le interesa a la comunidad científica. El código real se supone implícitamente que está allí. Algunas personas hacen que su código esté disponible en línea, lo cual es bueno si desea comparar su algoritmo con el de ellos.

Muchos profesores no han escrito una línea de código en mucho tiempo. Su tiempo (de investigación) lo pasa pensando en problemas y soluciones a un nivel superior; dejan el código a sus alumnos y asistentes de investigación.

Hay muchos foros dedicados a mejorar las habilidades de programación, aquí es donde debe buscar.

si desea mejorar su programación, debería considerar practicar en LeetCode, HackerRank o TopCoder, etc. Los trabajos de investigación tienen un propósito diferente.

He tenido la oportunidad de revisar y estudiar algunos de los trabajos de investigación, y puedo decirle eso, aunque no encontrará mucho código escrito allí, pero la mayoría de los trabajos de investigación se basan en los resultados de la codificación.

Cuando se trata de mejorar sus habilidades de programación, le sugiero que busque en proyectos en lugar de trabajos de investigación.

El código es meramente una implementación derivada de una descripción matemática. A veces, el pseudocódigo se usa para demostrar ideas, pero más comúnmente la notación matemática es un método más detallado pero compacto para comunicar conceptos.

More Interesting

¿Qué tipo de técnicas de visión por computadora que aún no se exploran para la conducción autónoma?

¿Qué necesito saber para hacer un software que pueda leer y hacer un resumen de cualquier información?

¿Cuál es el mejor lugar para comenzar a prepararse para la investigación en lenguajes de programación?

¿Cuáles son los tipos correctos de aplicaciones móviles?

¿Cuáles son los mejores grupos de investigación de geometría computacional en los Estados Unidos?

¿Cuánto trabajo se ha hecho para identificar acentos algorítmicamente?

¿Cuál es el campo donde la investigación tiene la aplicación más rápida?

¿Cuáles son las áreas clave de investigación en la práctica de farmacia actualmente?

¿La entropía de la web es de solo 22 bits?

¿Qué se necesita para ser admitido en una de las mejores escuelas de EE. UU. (MIT, CMU, Berkeley o Stanford) para obtener una maestría de CS? CGPA de alrededor de 3, con considerable experiencia en investigación (4 publicaciones internacionales + una pasantía de investigación en IIT KGP). Pasante como ingeniero de software.

¿Cuáles son los problemas en la educación en informática?

¿Cuáles son los avances importantes en el aprendizaje automático en la última década?

¿Es cierto que Simon Peyton Jones no tiene un doctorado, pero aún así aconseja a los estudiantes de doctorado?

¿Cuál es la investigación de HCI que fue hace 10 años pero que ya no es la tendencia?

¿Qué es un doctorado y, en general, qué implica completar uno?