Siempre me ha gustado la física, y siempre me ha gustado la codificación, así que cuando recibí la oferta de un doctorado en física numérica (los detalles no son relevantes, es principalmente programación paralela para un clúster) en una universidad, fue un no -brainer para mí.
Sin embargo, como la mayoría de los físicos, soy autodidacta. No tengo un amplio conocimiento sobre cómo codificar de una manera orientada a objetos, o el nombre de ese algoritmo específico que optimiza la búsqueda en algún árbol de kD.
Como todo mi trabajo hasta ahora ha estado más preocupado por la física y los resultados científicos, indudablemente tengo algunos malos hábitos, más aún porque mi codificación es mía y no realmente trabajo en equipo. Principalmente he usado C ya que es muy sencillo y "lo que escribes es lo que obtienes", sin necesidad de abstracciones sofisticadas. Sin embargo, recientemente me cambié a C ++ ya que me gustaría aprender más sobre el poder que viene con la abstracción, y es bastante similar a C (al menos en cuanto a sintaxis).
¿Cómo me enseño a codificar de una manera buena y abstracta como un graduado en informática?
Sé que mi código es eficiente, pero también quiero que sea elegante y legible. Tenga en cuenta que no tengo tiempo para leer varios tomos de 1000 páginas sobre programación abstracta. Necesito pasar tiempo en investigaciones reales relacionadas con la física (mi supervisor se reiría de mí si supiera que pasé tiempo pensando en cómo programar con elegancia). ¿Cómo evalúo si mi trabajo también es bueno desde la perspectiva de un programador?
fuente
Respuestas:
Entonces, ¿está pidiendo que alguien le dé una lista de verificación de cinco pasos que lo haga un programador experto? Eso no va a suceder !
Al igual que con cualquier otra disciplina, si quieres ser bueno en la programación, debes dedicar tiempo y esfuerzo a practicar y estudiar. Aprende a escribir código claro y elegante escribiendo mucho código y leyendo cuidadosamente el código de otras personas. Algunos de esos tomos de 1000 páginas realmente le ahorrarán tiempo al resumir las duras lecciones que otras personas han aprendido. Es delirante pensar que puede convertirse en un programador experto como un efecto secundario indoloro de obtener un doctorado en física. No es que no pueda salir de un doctorado en física. con habilidades de programación locas, es solo que te costará tiempo y problemas.
Code Complete es una buena introducción a la mecánica del desarrollo de software, que incluye consejos sobre cómo escribir y estructurar código claro y fácil de mantener. Sí, es un tomo enorme, pero ciertamente no es tan denso como, por ejemplo, los "Principios de la mecánica cuántica" de Dirac o la "Gravitación" de MTW. Code Complete es lo más cercano a una lista de verificación de cinco pasos para escribir un mejor software.
Matlab, VIM, C, MPI y Valgrind son excelentes herramientas para conocer. No mencionas el uso de un sistema de control de versiones. Si por casualidad aún no está utilizando un sistema de control de versiones, debe comenzar a utilizar uno de inmediato. El control de versiones también es un envío de Dios para escribir su tesis. Otras herramientas básicas que debe conocer son un depurador, un generador de perfiles de ejecución, un marco de registro y un marco de prueba de unidad. No tiene que leer un libro de 1000 páginas para cada uno de estos. Revise los tutoriales en línea para obtener los conceptos básicos y luego comience a trabajar con ellos. Profundice más en la documentación a medida que sus necesidades se vuelvan más sofisticadas.
Asesorarlo sobre el aprendizaje de los fundamentos de la informática (a diferencia de los fundamentos de la construcción de software) es más difícil. No especifica en qué problema está trabajando, si está desarrollando nuevos algoritmos o aplicando algoritmos existentes. Dependiendo de su problema de investigación, una encuesta de las estructuras de datos básicas y los algoritmos estándar podría ser útil. Otros problemas se beneficiarían más de una sólida formación en análisis numérico. Si desea aprender los conceptos básicos del análisis de algoritmos, hay varios textos buenos. El Manual de diseño de algoritmos y la Introducción a los algoritmos vienen a la mente. También hay un par de buenos cursos introductorios disponibles en línea ahora: Diseño y Análisis de Algoritmos y Algoritmos .
fuente
Mi experiencia es un poco similar a la tuya: yo era un graduado de física que era autodidacta. Después de graduarme, acepté algunos trabajos de TI y finalmente me convertí en ingeniero de software; incluyendo un poco de tiempo trabajando en OpenGDA (software utilizado para ejecutar experimentos en varios sitios de sincrotrón).
Lo principal que aprendí acerca de las preguntas que tenía mientras estaba llegando aquí es que es mucho más fácil obtener estas habilidades de otras personas que tratar de recogerlas usted mismo. Un mentor experimentado puede ayudarlo fácilmente a identificar dónde su código es débil o dónde los patrones y prácticas comunes pueden ayudarlo. Si bien aprendí a escribir C y Objective-C por mí mismo, no sabía exactamente lo que no sabía (si entiendes lo que quiero decir) hasta que estuve trabajando con otras personas en el mismo código. El hecho de que estés pidiendo consejo aquí significa que lo estás haciendo mejor que yo :-).
Ahora, ¿dónde encuentras un ingeniero de software profesional? Recientemente me uní a MentorNet , un sistema que asocia a programadores experimentados con protegidos.
Pero no tiene que optar por un sistema formal como ese. Encontrar un grupo de reunión de programadores local (o dónde va el departamento de ingeniería de software de su universidad después del trabajo el viernes) es un gran lugar para comenzar.
fuente
No Royal Road to Software
En la antigüedad, su estudiante, el rey Ptolomeo, hizo preguntas a Euclides como la suya. Su respuesta: "No hay un camino real hacia la geometría".
Mencionas que tu supervisor se reiría si supiera cuánto tiempo pasas tratando de escribir código como un desarrollador profesional. Otros respondieron sus preguntas con una larga lista de cosas para aprender que van desde el control de origen hasta el Diseño y Análisis de Algoritmos.
No alcanzan su objetivo:
¿Pianista de concierto o One Man Band?
El mundo se mueve demasiado rápido para que la gente pueda incursionar. Si quieres ser un pianista de concierto, no dividas tu tiempo aprendiendo instrumentos para convertirte en una banda de un solo hombre.
Mi concepto para el papel de un doctorado en física en proyectos medianos a grandes es como líder de ideas para la definición de sistemas, experto en teoría, experto en la materia durante la creación de casos de uso y usuario / juez final para los resultados generados por artefactos de software. Trabaje en estrecha colaboración con los mejores ingenieros de software que pueda.
¿Cómo evalúo si mi trabajo también es bueno desde la perspectiva de un programador?
Si desea establecer el listón alto, comience aquí:
Arquitectura de software en la práctica, Len Bass, Paul Clements, Rick Kazman
Busque el capítulo "Comprensión de los atributos de calidad". Más allá del código, considera usabilidad, modificabilidad, rendimiento, seguridad, disponibilidad, confiabilidad, capacidad de prueba, capacidad de mantenimiento y portabilidad (no puede llevarlo, pero puede portar el diseño de una plataforma a otra). Todos necesitan objetivos medibles específicos. Referencias similares incluyen:
http://msdn.microsoft.com/en-us/library/ee658094.aspx
http://www.sei.cmu.edu/reports/95tr021.pdf
Tus objetivos frente a C y C ++
Al igual que FORTRAN, estos son idiomas antiguos y difíciles. Los indicadores positivos para C / C ++ incluyen:
Hay mucha gente haciendo desarrollo web, visualización de datos y big data. Muchos están motivados para encontrar o hacer otros idiomas. Por ejemplo, el físico Sir Tim Berners-Lee hizo su éxito con HTML (pero es poco conocido para la física). Evalúa tu objetivo frente a tu lenguaje de programación.
Considere usar Matlab
Matlab tiene una gran base instalada, está especializada en matemáticas y ciencias. Cuenta con herramientas para la visualización de datos. Permite a científicos y matemáticos expresar problemas en el dominio del problema en lugar del dominio de la solución. Matlab fabrica una caja de herramientas de computación paralela y productos de servidor de computación distribuida.
Espero que el éxito de Matlab se deba al uso de equipos multidisciplinarios con personas expertas en física, matemáticas, electrónica e instrumentación, sistemas operativos, lenguajes de programación, desarrollo de software, pruebas de software, arquitectura y diseño de software. La analogía puede ser exagerada, pero ¿por qué se presentaría solo, comenzando con un martillo, un cincel y una escofina para hacer algo cuando tenga una impresora 3D disponible? Como Newton podría preguntar, ¿por qué no pararse sobre los hombros de alguien?
fuente
Podrá recorrer un largo camino en Física sin saber nada sobre el estilo "profesional" (hablando por experiencia). Pero he visto a muchas personas perder tiempo sin fin porque perdieron la noción de lo que estaban haciendo o después de haber desarrollado su código durante un par de años, simplemente se perdieron en su complejidad (incluso en la academia no hay código "desechable", pero las cosas quedarse mucho más tiempo de lo que piensas inicialmente).
Te sugiero que comiences con algoritmos y estructuras de datos, por ejemplo, con este curso . Después de eso, debería poder pensar en el rendimiento en un nivel más productivo y ser capaz de seguir, por ejemplo, con artículos en Wikipedia.
Después de eso, acostúmbrese a lo que está disponible en el núcleo de su lenguaje, por ejemplo, para C ++ cppreference.com . También le recomendaría encarecidamente que lea la serie Effective C ++ de Scott Meyers y Accelerated C ++ de Koenig & Moe. Al menos para C ++, esto le dará una base sólida en el lado del lenguaje.
Paralelamente, debe tratar de conocer bien sus herramientas. No es improbable que desarrolle su código en Linux, así que trate de aprender cómo obtener más diagnósticos (advertencias) de sus compiladores (al menos gcc y clang). Aprenda también sobre las herramientas de análisis estático como cppcheck o clang's scan-build . Aprenda cómo hacer que estas herramientas sean una parte integral de su proceso de desarrollo, por ejemplo, integrándolas en su configuración de compilación (sí, debe usar al menos GNU make, o incluso algo mejor como GNU autotools / cmake / ...). También debe agregar herramientas de creación de perfiles a su conjunto de herramientas. Para C ++, le recomendaría que aprenda todo lo que pueda sobre valgrind, que puede perfilarse en un nivel muy bajo (también puede ayudarlo a encontrar fugas de recursos).
Todo esto lo ayudará a concentrarse en lo que más le importa (su investigación) en lugar de perder el tiempo buscando errores o haciendo optimizaciones inútiles. Por supuesto, esto es casi imposible de vender a un asesor, pero ellos (y usted) quedarán impresionados, pero la velocidad con la que podrá obtener resultados confiables.
Usted mencionó C y C ++, pero para los cálculos numéricos no puedo recomendar Python con numpy y scipy lo suficiente. Le permite escribir en un lenguaje limpio bastante limpio en un nivel muy alto (incluso puede trabajar de manera interactiva), mientras aprovecha las rutinas extremadamente optimizadas implementadas en C, C ++ y FORTRAN. Además, la interfaz de su propio código C o C ++ con Python es casi trivial.
fuente
¿Es correcto? ¿Produce resultados correctos en todos los casos?
¿Pueden otras personas leer y entender fácilmente su código?
Cuando su supervisor dice "Genial, ahora haga que también haga X ..." ¿tiene que reescribir mucho código?
Cuando ha escrito un programa, ¿se convierte en una herramienta que puede usar una y otra vez, o lo usa una vez y lo descarta?
Si puede responder sí, sí, no y 'sí, intento hacer herramientas en lugar de cálculos únicos', entonces ya lo está haciendo bastante bien. Gran parte de lo que hacemos como programadores está destinado a ayudar con los tipos de cosas enumeradas anteriormente.
fuente
Sus programas serán completamente diferentes del código fuente comercial, por lo tanto, muchas buenas prácticas y enfoques no se aplicarán en el desarrollo de su código fuente diario. Pero hay una buena manera de aprender algunos consejos y trucos.
Deje que un buen desarrollador de software revise su código y lo optimice juntos. Le dará mucha más experiencia y le enseñará buenas prácticas. También revise el código fuente escrito por otras personas. Busque proyectos de código abierto en sourceforge o github y lea su código fuente.
Pero, sobre todo, piense si realmente necesita aprender algo nuevo para lograr sus objetivos. Hacer cosas innecesarias solo para que el código se vea más bonito no agregará ningún valor a sus aplicaciones.
fuente
En cuanto a convertirse en mejores programadores, no hay una bala mágica. Si eres autodidacta, la clave es la autoconciencia, lo que parece que sí. Sin embargo, aprender a codificar bien se reduce principalmente a la lectura y la práctica.
Ser crítico con su propio código es una de las mejores maneras de mejorar. Siempre pregúntate a ti mismo:
Mi otra sugerencia sería no encerrarse en C / C ++. Si bien esos son buenos idiomas que se usan por alguna razón, requieren que haga muchas cosas que no están relacionadas con el tema. Mira a Matlab, me sorprendería si la universidad no tiene eso disponible para ti. Considere un lenguaje de script como Python. Considere seriamente elegir un lenguaje funcional como Haskell: el paradigma es de naturaleza muy matemática y probablemente se ajuste a sus problemas como un guante. En resumen, explore algunos otros lenguajes / paradigmas. Incluso si no se convierten en una herramienta permanente en su cinturón, lo harán un mejor programador.
También es posible que desee ver algún diseño de algoritmo. Sospecho que habrás conseguido el trabajo, ya estás relativamente preparado para esto, pero los algoritmos son increíblemente importantes al hacer análisis numéricos. De hecho, sospecharía que hay recursos específicamente orientados a los algoritmos de análisis numérico.
Nunca pierda de vista su propósito principal al escribir el código. Necesitas hacer las cosas. Convertirse en un mejor programador es un método para hacerlo. Seleccionar las herramientas adecuadas para el trabajo es otra.
fuente
Primero, "elegante" es un término relativo. La abstracción puede parecer elegante para usted, pero para otro aficionado de C, puede parecer innecesaria. De todos modos, para responder a su pregunta, debe intentar publicar su código para su revisión en http://codereview.stackexchange.com .
Divagando desde el punto principal, algunos consejos no solicitados basados en mi propia experiencia. Si puede hacer todo su trabajo con solo C, entonces ¿por qué desea codificarlo de manera abstracta? Con esto, ¿desea permitir que otros reutilicen su código? Si realmente tiene una razón sólida para cambiar a C ++, vaya a la abstracción y aprenda los conceptos de C ++ y OO. De lo contrario, deje caer la idea. En mi humilde opinión, ¿no debería apuntar a que su código sea más legible y sus resultados científicos reproducibles que darle abstracciones OO? Yo mismo tenía este tipo de obsesión por aprender OOPS y codificar "con elegancia". Pero C ++ tardará en dominar. Tendrá que aprender a administrar la memoria ya que la recolección de basura no es automática en C ++. Sigue mi consejo ya que trabajé para un laboratorio de investigación y perdí mucho tiempo aprendiendo C ++ y OO,
fuente
Teniendo en cuenta su mención de la falta de tiempo para estudiar teoría.
Si ha vuelto a mirar su antiguo código después de unos meses y se preguntó "qué clase de idiota escribió ese código", está progresando.
¿Cómo progresaste? Al ver un mejor código escrito por otros. Una persona nunca conoce el valor del código de 'elegancia' o 'buen' a menos que vea que agrega valor a su trabajo. En lugar de leer la teoría, le animo a que mantenga los ojos abiertos al código escrito por otros en su campo de trabajo. Mantenga los ojos abiertos a los conceptos que se discuten en stackoverflow (etiqueta C ++). Pasar solo quince minutos al día de esa búsqueda puede exponerlo al azar a conceptos que pueden ayudarlo. Puede mostrarle código que está mejor escrito que su código. Ahí es cuando haces un seguimiento en Wikipedia y descubres más al respecto. Tal aprendizaje que surge de la curiosidad será mucho más duradero y útil para usted que la teoría que olvidará cuando se despierte al día siguiente.
También considere probar lenguajes como MATLAB o Python.
fuente
Como físico convertido en programador, encontré que mi formación en física era muy útil para formar las metáforas correctas para comprender los conceptos de software. Esta perspectiva también hizo que el aprendizaje de la programación fuera más divertido para mí y me ayudó a desarrollar el sentido de "elegancia" en el software, por lo que parece luchar.
Describí el importante y poco apreciado papel de las metáforas y las analogías en el software en mi columna CUJ "Patrones de pensamiento: nombres, metáforas, mejor programación y la política del lenguaje" . Por ejemplo, los conceptos OO de herencia de clase a menudo se comparan con el paso de rasgos de padres a hijos en una familia. Esta es una analogía incorrecta. La analogía correcta para la herencia de clase es la clasificación biológica de los organismos (por ejemplo, una clase RedRose es un tipo de flor, y una flor es un tipo de planta).
O tome por ejemplo el concepto de software de una máquina de estados jerárquica. Una buena metáfora aquí es el concepto de un sistema cuántico unido como el átomo de hidrógeno. Como recordará, los estados de un átomo están numerados por tres números cuánticos | n, l, m>, exactamente porque están "anidados" (jerárquicos). Esta metáfora le muestra cómo comprender que los estados anidan dentro de los estados (al igual que los estados de momento angular (l) anidan en los estados de energía (n)) y también ve de inmediato que el anidamiento de estado siempre es reflejo de alguna simetría del sistema.
Otra analogía interesante de la física es el "modelo de cómputo del actor", que últimamente se ha vuelto a descubrir debido a las CPU de varios núcleos y la computación distribuida en la "nube". Me pareció útil y divertido pensar en eventos intercambiados por actores con estado (también conocidos como objetos activos) como bosones virtuales, como fotones en QED o gluones en QCD. Esta metáfora explica la naturaleza asincrónica fundamental de la comunicación, el procesamiento de eventos de ejecución completa (salto cuántico) y la encapsulación estricta de objetos activos, que solo pueden interactuar entre sí a través de los artefactos intermedios explícitos.
De todos modos, desarrollar una metáfora del sistema es una práctica recomendada en XP (eXtreme Programming), y como físico tendrá una ventaja para encontrar buenas metáforas. También obtendrá un sentido de "elegancia", porque su software heredará la integridad conceptual de las buenas metáforas que aplique.
fuente
Puedo decirles que las mayores ganancias que he logrado en términos de cómo abordo la resolución de problemas se han logrado a través del aprendizaje de lenguajes y analizadores funcionales. Ambos descubrimientos fueron hechos por accidente. Entonces, le digo ahora si realmente es serio acerca de convertirse en un mejor programador, entonces necesita aprender sobre las diversas técnicas involucradas en la redacción de un compilador, por ejemplo, analizadores y generadores de analizadores, y necesita aprender cómo componer cálculos con un orden superior funciones
Un excelente recurso para el analizador y compilador es PL101: Cree su propio lenguaje de programación . Todavía no he encontrado una buena introducción a la programación funcional, pero escucho cosas realmente buenas sobre SICP .
fuente
Un graduado en Informática no sabe cómo codificar bien cuando se gradúa; no tienen tanta demanda cuando salen de la universidad. Solo si obtienen la experiencia.
La respuesta a su pregunta es que necesita aprender Patrones de diseño. Programé en Java, .NET y ahora trabajo como programador PHP, Javascript y MySQL. .NET por cierto tiene un nivel muy grande de abstracción, por ejemplo, ASP.NET. Significa que puede omitir el aprendizaje de abstracción. Lenguajes como Perl, PHP, etc. tienen un bajo nivel de abstracción.
Lea Head First Design Patterns, es un buen libro. Es un libro bastante completo. Eso es todo lo que necesitarás.
fuente