Enseñándome a mí mismo, como físico, a ser un mejor programador [cerrado]


17

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?


12
Una pregunta: ¿Cómo sabes que tu código es eficiente?
Matsemann

He visto a muchas personas decir no a C ++ como primer lenguaje OO. Estoy aprendiendo Java y encontré los videos tutoriales de Mark Dexter aquí eclipsetutorial.sourceforge.net/totalbeginner.html , son bastante buenos y te enseñarán en forma TDD. También echa un vistazo a Head First Java, es bastante bueno para cubrir Java en modo OO.
Garv

44
@DeveloperDon, la computación era una parte central de la física incluso antes de que existieran las computadoras electrónicas. Los cálculos se realizaron a mano o en calculadoras mecánicas. Desde la Segunda Guerra Mundial, los físicos han estado profundamente involucrados en el software. Si está calculando el retorno de un cometa, simulando la producción de neutrones en una reacción en cadena nuclear o analizando gigabytes de datos en busca de signos del Bosón de Higgs, debe hacer muchos cálculos numéricos. En 1974, la primera mitad de mi primer año de laboratorio de física se dedicó a enseñar FORTRAN.
Charles E. Grant

1
@DeveloperDon Cuando los físicos del CERN, por ejemplo, obtienen datos, obtienen datos de millones de colisiones de partículas. Necesita una computadora para manejar esta cantidad de información. Considere también un área como la física del estado sólido en la que intenta comprender las propiedades macroscópicas de un material a partir de las interacciones microscópicas de los átomos. En dicho sistema, un solo electrón siente la repulsión / atracción de miles de millones de núcleos y electrones, y para describir dicho sistema con precisión se necesita una computadora rápida y algoritmos eficientes (y algunas buenas aproximaciones a las ecuaciones fundamentales).
user787267

1
¿Quizás debería cambiar su idioma de C / C ++ a Python para poder tener más tiempo? Python es a menudo utilizado por los científicos , hay módulos como NumPy - paquete para computación científica con Python o SciPy . Si necesita la velocidad de C / C ++ en Python, use Cython , le permite usar tipos y estructuras de C / C ++ para obtener una velocidad similar a C / C ++, también es fácil de integrar con las bibliotecas de C / C ++ existentes que usan Cython.
Czarek Tomczak

Respuestas:


20

Tenga en cuenta que no tengo tiempo para leer varios tomos de 1000 páginas sobre programación abstracta.

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 .


Gracias por los enlaces, lo investigaré. Sé que no me convertiré en un gurú de la codificación en un fin de semana, sin embargo, espero mejorar gradualmente con el tiempo, especialmente si busco inspiración fuera de la física (como a muchos físicos que conozco no les importan las buenas prácticas de codificación).
user787267

1
Agregaría Python en herramientas como recuento legible
Xavier Combelle

2
+1 por sugerir Código Completo. Realmente es lo mejor que el operador puede leer para resolver el problema en cuestión.
JW01

9

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.


MentorNet parece muy interesante, lo investigaré. ¿Fue una transición difícil de físico a ingeniero de software?
user787267

@ user787267 Debido a que estaba interesado en la programación (y ya era un programador aficionado), me sentí motivado para hacer la transición como parece, así que no encontré el lado técnico difícil. Lo que me llevó más tiempo comprender fue el software: entender mi lugar en un equipo de proyecto más grande y quién era experto en lo que es un gran cambio de la codificación del "lobo solitario" que estaba haciendo antes.

5

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:

"Necesito pasar tiempo en física real"

¿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:

  • Aplicación con hardware, sistemas embebidos.
  • Proyecto existente que desea como puntos de partida.

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?


4

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.


Gracias por los enlaces! Definitivamente lo investigaré (pero no creo que tenga tiempo para leer varios libros, aunque en algún momento he leído C ++ acelerado en la escuela secundaria). Estoy trabajando en un entorno Unix (estoy usando Vim como mi editor y me gusta), y uso make y Valgrind ampliamente. También he activado la opción -pedantic en gcc y -Wall, ya que ayuda bastante. Tal vez debería haber mencionado que hago computación de alto rendimiento (con la biblioteca MPI para programación paralela) en la supercomputadora de la universidad.
user787267

También debería mencionar que Python no es realmente una opción, ya que mi código debe ser muy rápido, aunque me gusta para trazar, por ejemplo. También he usado mucho a Matlab.
user787267

A menudo uso Python como interfaz para hablar con las rutinas implementadas en mi propio C ++. Con Boost esto es realmente fácil y obtienes toda la flexibilidad de Python (por ejemplo, para procesar datos para trazar). Además, Python es bastante bueno para la creación de prototipos. Una vez que sé que algo se vuelve crucial, siempre puedo moverlo a C ++. Como mencionas MPI, te recomendaría pasar una tarde con IPython con una buena interfaz para la informática distribuida.
Benjamin Bannier

@ user787267 Ya no es necesariamente cierto que Python tenga un rendimiento lento; consulte youtube.com/watch?v=Iw9-GckD-gQ por ejemplo. La clave es que puede usar Python para escribir más rápidamente un código de trabajo que luego puede acelerar 1) usando numpy / scipy 2) usando Cython o shedskin, y 3) colocando solo el algoritmo central en un módulo C / C ++ o FORTRAN si Realmente necesitas esa última mejora del 5%. También recuerde, el tiempo que dedica a la codificación es tiempo en que el código no se ejecuta, por lo que a veces puede ser más eficiente tener un código de rendimiento del 80% escrito en la mitad del tiempo
Tobias Kienzler

Normalmente hago prototipos en Matlab para probar cosas fáciles, pero he querido cambiar a Python por un tiempo. Lo echaré un vistazo. Sin embargo, debido a que gran parte de mi código ya está escrito en C ++, no quiero cambiar el idioma a la mitad. Si bien es cierto que también debe considerar el tiempo de programación en tiempo real (y créanme, lo hago), no creo que sea una excusa para no mejorar sus habilidades de programación (gradualmente).
user787267

4

¿Cómo evalúo si mi trabajo también es bueno desde la perspectiva de un programador?

  • ¿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.


3

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.


Leer y participar en proyectos de código abierto es en realidad una muy buena idea, pero algo que tendría que hacer en mi tiempo libre (pero dado que me gusta la programación, no debería ser un gran problema). Una razón por la que deseo convertirme en un mejor programador es porque no estoy seguro si me quedaré en la academia. Cuando mi doctorado Una vez hecho esto, podría conseguir un trabajo en la industria, y aquí un programador experto debería tener una gran demanda. Otra razón es la satisfacción intelectual de crear algo elegante / bello, como resolver una ecuación diferencial realmente difícil.
user787267

Desafortunadamente, la industria requiere habilidades que generalmente no obtienes en desarrollo académico. Lo que escribirá durante sus investigaciones académicas suele ser menos del 5% del código fuente de la aplicación comercial.
Andrzej Bobak

3

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:

  • ¿Será esto fácil de cambiar?
  • ¿Es esto fácilmente comprobable?
  • ¿Puedo simplificar esto? ¿Puedo entender esto fácilmente cuando lo vuelva a ver en 3 meses?

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.


2

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,


1
Pero C es aún más no administrado que C ++. En C ++ hay al menos RAII.
Benjamin Bannier

Me gusta codificar, así que quiero ser un mejor programador. Primero soy físico y segundo programador, pero eso no significa que no deba mejorar mis habilidades de programación; después de todo, si decido publicar mi código junto con los resultados científicos, sería mejor tener buenos resultados, código legible
user787267

2

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.


Sí paso mucho tiempo en Stack Exchange: es un recurso invaluable para mí en mi trabajo diario. He usado mucho a Matlab, pero es muy fácil desarrollar malos hábitos, como no preasignar matrices, ya que es muy indulgente.
user787267

+1 para python @ user787267 Realmente no entiendo por qué no preasignar la matriz es un mal hábito
Xavier Combelle

2

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.


Aunque la física es potencialmente una rica fuente de metáforas, la intención en XP es encontrar una metáfora que facilite la comunicación con el cliente en el sitio y otros miembros del equipo, por lo que generalmente tenderá a elegir metáforas que se entienden más comúnmente.
Pete Kirkham

2

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 .


-5

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.


Tengo una idea de por qué esta respuesta fue rechazada, pero tal vez sea útil si los votantes votaron por qué.
Pierre Arlaud
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.