Prepararme para el futuro al aprender a programar [cerrado]

10

Quiero aprender a programar de una manera 'a prueba de futuro', si lo desea. Si bien Windows domina el mercado de SO de escritorio (por ahora), obviamente hay mucho valor en aprender sus lenguajes / marcos / API, etc., esto puede estar sujeto a cambios a medida que surgen nuevos dispositivos o Windows se dispara en el pie (más de Las vistas previas amigables de Windows 8 no parecen demasiado atractivas ...).

¿Estaría en lo cierto al pensar que tener un sólido conocimiento de C / C ++ para la lógica de back-end / programación de bajo nivel y similares, combinado con un lenguaje extremadamente portátil como Java para GUI y demás, sería una buena base para el desarrollo de software que resultará útil en la mayor cantidad de sistemas? - Estoy hablando de computadoras de escritorio, tabletas, teléfonos.

Anónimo
fuente
11
No existe tal cosa
Job
Construye una guarida y llénalo de libros.
Edward Strange
44
Construye una guarida y llénala con comida enlatada. El programador más preparado para el futuro es el programador que está vivo después del apocalipsis.
Tom Anderson
1
No aprenda lenguajes de programación o codificación, pero principalmente aprenda programación y eso lleva muchos años , casi diez, y debe continuar aprendiendo toda su vida
Basile Starynkevitch

Respuestas:

31

Si desea estar preparado para el futuro, el mejor consejo que le puedo dar es no encerrarse en una tecnología.

Así que no aprendas API a ciegas. Aprende cómo se conciben. ¿Cuáles son las filosofías detrás de la escena? ¿Cuáles son sus ventajas y defectos? Piense en el software en general, no en una tecnología específica.

También puede trabajar en una buena concepción del programa, ir a OOP y AOP es una buena opción de la OMI. Pero no solo entienda el mecanismo, realmente trabaje en la filosofía detrás del mecanismo.

No descuides la informática en general, como las estructuras de datos y los algoritmos, porque son conocimientos de tecnología cruzada que siempre son útiles.

También ve por buenas prácticas. A menudo tiene docenas de formas de hacer algo, pero la mayoría son basura: propensas a errores, difíciles de mantener, difíciles de entender más tarde o de otro programador, etc. . . Por lo general, el código es más difícil de leer que de escribir. Entonces, aprenda a dedicar un poco más de esfuerzo a escribir para facilitar la lectura (porque leerá el código más de lo que escribe).

Aprenda técnicas efectivas para depurar (uso inteligente de registro y depurador) y probar (cómo escribir código que se pueda probar fácilmente en la unidad y cómo automatizar estas pruebas).

Entonces, necesitará un fondo de tecnología general. Me refiero a un conocimiento muy amplio, como el funcionamiento de un procesador (la falta de caché o la predicción de bifurcación son un buen comienzo), sobre sistemas UNIX, sobre protocolos de red como IP, TCP y Ethernet, etc. . .

Al final, aprende a aprender. Si sabes aprender, entonces puedes adaptarte.

Necesitará un conocimiento sólido en tecnologías específicas para poder encontrar un trabajo, pero estos están desactualizados muy rápidamente (piense en COBOL, por ejemplo, o en la programación web en el momento de la guerra de IE / Netscape). Así que no confíes en ellos para estar preparados para el futuro. Serán clave para ser contratados, pero definitivamente no lo que hace a un gran programador y lo que hará que sus habilidades sean duraderas en el tiempo.

EDITAR: si recién está comenzando, definitivamente debe hacer algo. Cualquier cosa en realidad. Un juego como Tetris o serpiente es un buen comienzo y divertido. Si no hace las cosas, pasará mucho tiempo aprendiendo y realmente no obtendrá la experiencia necesaria para comprender completamente lo que aprende.

Pongamos un ejemplo con patrones de diseño. Los patrones de diseño son geniales y definitivamente debes usarlos. Pero si se usa en exceso, harán que su código sea complicado y difícil de entender. Tendrá que enfrentar el problema que resuelve un patrón de diseño y perder algo de tiempo tratando de resolverlo o sus efectos secundarios para comprender completamente de qué se trata el patrón de diseño. Los patrones de diseño deben usarse como pequeñas refactorizaciones a lo largo del tiempo cuando el código crece. Y sabrá cuándo se necesita un patrón de diseño cuando el beneficio del mismo sea mayor que la complejidad del código inducida por su uso. Esto requiere experiencia.

Definitivamente, haz las cosas, aprende de tus errores. No puedo insistir más: ¡ HAZ LAS COSAS !

deadalnix
fuente
Bien ... Excelente * respuesta y algo que entiendo: entiendo la necesidad de comprender el tema de 'programación' en general, no cada uno de los temas que mencionó. No estoy demasiado preocupado por encontrar un trabajo en el campo, ya que tengo un buen sueldo en la administración de un sitio de comercio electrónico con el que definitivamente estoy feliz por lo previsible. Mi interés en la programación lo clasificaría como un hobby serio, aunque me gustaría usarlo para mejorar el flujo de trabajo tanto mío como de otros en el trabajo.
Anónimo
Se agregó una edición para aclarar las cosas como un punto de vista para principiantes.
deadalnix
4

Lo que separa a los buenos programadores de los malos es su capacidad de programar en CUALQUIER lenguaje. Como han señalado otros carteles, conocer cualquier lenguaje orientado a objetos significativo le dará las herramientas para crear excelentes programas y tener demanda.

Además, si todavía estás en la escuela, asegúrate de tomar algunas clases de escritura. Los mejores ingenieros y programadores también son los que comunican bien sus ideas.

Una vez que comience a trabajar, lo mejor que puede hacer para evitar quedar obsoleto es mantenerse al día con las tendencias actuales. No tenga miedo de dejar un trabajo por otro si no están utilizando la tecnología actual o tienen un proceso terrible, etc. Lo peor que puede hacer para su carrera es tomar un trabajo que lo haga trabajar con tecnología antigua o procesos débiles.

Bill Leeper
fuente
Aprecio que un buen conocimiento de los conceptos de programación es esencial para ser bueno 'en este juego', pero tener conocimiento de la sintaxis del lenguaje / biblioteca estándar real y lo que aún no resulta esencial para utilizar todas las características del lenguaje (cuando corresponda). Desafortunadamente, todavía no estoy en la escuela, estoy trabajando, aunque, como creo que dije en un comentario anterior, estoy bastante bien pagado, así que no estoy demasiado preocupado por ese aspecto. Gracias por la respuesta. =)
Anónimo
4

La respuesta de @deadalnix es buena. Yo agregaría tres cosas:

  1. La información reutilizable proviene del medio, no de los extremos. Minsky presenta esto en detalle en su libro Society of Mind, así que lo resumiré como: la capa superior está demasiado cerca de la solución específica para que gran parte se aplique al siguiente problema, mientras que la capa inferior está demasiado cerca del plataforma específica para que gran parte se aplique al siguiente problema. La capa intermedia es donde se encuentra la información reutilizable: los algoritmos, patrones, taxonomías, tácticas, estrategias, técnicas, organizaciones, protocolos, etc., que generalmente son útiles para resolver problemas similares independientemente del dominio (capa superior) o plataforma (capa inferior ) Nota: estas capas no tienen nada que ver con la arquitectura de 3 niveles, aquí estamos hablando de semántica de espacio de solución / espacio de solución.
  2. no sabrá lo que es común / general / reutilizable hasta que haya visto al menos dos instancias de este. Entonces, estudie cómo funciona Windows internamente, luego estudie cómo funciona linux / unix internamente y compare los dos. Las cosas comunes son reutilizables. Las diferentes cosas son las decisiones de diseño, que también pueden dar lugar a ideas reutilizables.
  3. Para cualquier situación o problema, piense en cómo podría implementar la solución, luego compare la solución de su sillón con la solución real e intente comprender las posibles razones detrás de las diferencias.
Steven A. Lowe
fuente
Grandes adiciones!
deadalnix
2

Como estás al principio, yo diría que solo aprendas un idioma, no importa cuál. La dificultad no está en el lenguaje (sintaxis) en sí, sino en la comprensión de los conceptos; y estos conceptos generales de programación se aplican a todos los lenguajes de programación, por lo que aprender su segundo y tercer y cuarto (...) lenguaje será mucho más fácil.

Entonces, al principio, no pienses demasiado en ser 'a prueba de futuro'. Sin embargo, a medida que progreses, trata de dominar idiomas que son muy diferentes entre sí. Básicamente, (como dijiste) debes ser útil con un lenguaje de bajo nivel (-ish) como C / C ++, un lenguaje de programación de nivel superior como Java y también un lenguaje de secuencias de comandos (Python, Ruby, etc.). Si desea entrar en las cosas realmente avanzadas, también debe conocer Asamblea.

Pero no te estreses demasiado por esto ahora. Aprender a programar lleva años. Por el momento, solo elija un lenguaje como Java o C # o lo que sea, y apúntelo. :)

Paul
fuente
Me gusta la actitud de 'elegir uno' e ir por él ... Probablemente lo adoptaré. ¿Sí o no elegir un lenguaje de bajo nivel (C), un lenguaje de alto nivel (Java) y un lenguaje de secuencias de comandos (Python) y aprender los 3 simultáneamente?
Anónimo
¿Estás comenzando a programar? Entonces no aprendas más de un idioma a la vez, solo te confundirá. Lo que necesita aprender al principio son los conceptos, no los idiomas. Solo debe pasar a nuevos idiomas cuando sea necesario. Por ejemplo, solo recientemente sentí la necesidad de entrar en lenguajes de scripting, y eso es porque decidí hacer mi juego de scripts con Python.
Paul
No diría que solo comencé: conozco html / css durante años (aunque en realidad no califican / son irrelevantes) y he estado construyendo sitios web PHP / MySQL durante unos meses. Desarrollo web con el que puedo 'superarme', estoy abordando el desarrollo de software. Aunque prestaré atención a lo que estás diciendo.
Anónimo
If you want to go into the really advanced stuff you must also know Assembly- Puedes hacer esto en cualquier nivel, los desafíos son simplemente diferentes.
sixtyfootersdude
1

¿Estaría en lo cierto al pensar que tener un sólido conocimiento de C / C ++ para la lógica de back-end / programación de bajo nivel y similares, combinado con un lenguaje extremadamente portátil como Java para GUI y demás, sería una buena base para el desarrollo de software que resultará útil en la mayor cantidad de sistemas?

Estoy hablando de computadoras de escritorio, tabletas, teléfonos.

No. Nada de eso ayudará.

Un conocimiento sólido de las estructuras de datos y algoritmos, independiente de cualquier lenguaje de programación específico, es más valioso que la "programación de bajo nivel y similares".

Un "lenguaje extremadamente portátil como Java" es tan portátil como C y no ayuda. La próxima gran cosa será tan diferente de estos lenguajes que su Java súper portátil será una responsabilidad, no un activo.

Mac OS (computadora de escritorio, tableta y teléfono) se realiza en el Objetivo C. Ese podría ser un lugar para comenzar.

Windows (escritorio, mesa y teléfono) se realiza en C #. Ese podría ser un lugar para comenzar.

S.Lott
fuente
Estaba comparando Java con C como ambos lenguajes portátiles, con Java como nivel bajo y nivel alto respectivamente, lo cual es cierto ... Como usted mismo dijo, Mac OS = Obj-C, Windows = C #, que es donde no quiero especializarme en una y cortar mis opciones, o ambas, y ser un "maestro de ninguna" si me entiendes. Aprecio lo que está diciendo, pero un conocimiento sólido de estructuras de datos y algoritmos sin conocimiento de un lenguaje de programación es tan inútil como el conocimiento de un lenguaje de programación sin este último.
Anónimo
@ Chris Bridgett: Estás confundiendo completamente el punto. Hay fundamentos universales, y un lenguaje de programación no lo es. Primero, aprende los fundamentos. Entonces, un idioma (o un sistema operativo) simplemente se está congelando en el pastel. Los fundamentos son el pastel y son a prueba de futuro.
S.Lott