Recomendaciones para iniciarme en programación

DantePD

#30 No es que hagas el curso y de cabeza a Google. Me refiero que en el curriculum suma muchos puntos tener carrera universitaria Computer Cience + curso de Udacity.

En el de python sale un par de veces Sergei Brin (fundador de Google) hablando de como hacer un buscador, ya que el curso trata de como hacer un crawler (araña que busca paginas para el buscador)

Cuenta el fundador de Udacity que fue a decirle a Sergei Brin que dejaba Google X y cuando le conto lo que estaba haciendo, Sergei le dijo que normalmente habria luchado para que se quedara en Google, pero que Udacity va a ser tan importante para el mundo que lo dejaba irse.

1 respuesta
B

#31: Ya he hecho el curso, y te digo que es extremadamente sencillo. Para Google que sepas eso es como si no sabes nada.

Conozco a uno que fue entrevistado por Google (ahora está en Yahoo) y en la entrevista le preguntaron por una fórmula matemática poco conocida así que puedes estar por seguro que dan por hecho que sepas utilizar python o cualquier otro lenguaje para hacerte un web crawler o que tengas nociones de diseño e IA, que es lo que se da ahí.

Todas esas cosas se dan en la carrera, y siguen siendo insuficientes. Es un nivel muy básico.

Eso sí, para empezar no están mal, solo que es eso, para empezar. Si quieres alcanzar un buen nivel (y no hablo de Google ni de SV, hablo de una empresa decente en España) necesitas muchísimo más.

Además de muchos conocimientos, lo único online que te vale la pena para trabajar en Google es el Google Summer of Code (y el de menores de edad también, que no sé como se llama) o tener nombre en alguna comunidad de SL.

DantePD

Hay tres niveles en Udacity: Beginning, Intermediate y Advanced. Los advanced obviamente tienen mas valor.

Lo que hace Udacity es lo siguiente. Tu puedes rellenar un profile y si quieres ellos lo mandan a diferentes compañias por si estan interesados en ti. Como te comento, con solo un curso de Udacity no te van a contratar, pero se te suma al CV y ellos te lo mandan.

In addition to providing free classes for students, Udacity knows that connecting students with employers is key. Currently, we are working to build relationships with trusted employers so that we can connect them with our students. So far we have found a lot of companies that are interested in recruiting our students. These companies include: Twitter, Google, QualComm, Bank of America, Facebook, Amazon, BUMP, Mozilla, BMW, Bosch, and SpaceX.

http://udacity.blogspot.com.es/2012/05/whats-deal-with-profile-page.html

1 respuesta
B

#33: Tío, que estoy dentro, ya sé como va. Y te digo que eso es solo una buena base, pero necesitas muchísimas piezas por encima.

#35: Ya, ya. Pero quiero matizar que lo suyo es hacer los tres cursos, sacar una puntuación perfecta, saber muchas más cosas y, solo después, contactar con ellos para trabajar allí.

PD: Lo de la puntuación perfecta no sé si es posible porque no hice ningún examen aún, pero supongo que no será solo apto/no apto.

1 respuesta
DantePD

#34 No entiendo porque estamos discutiendo si piensas igual que yo:

"Como te comento, con solo un curso de Udacity no te van a contratar, pero se te suma al CV y ellos te lo mandan"

Los dos estamos diciendo que con solo un curso de Udacity no te van a contratar. Es un plus.

De todas formas la vision del fundador es que este sistema de enseñanza sea la universidad del futuro. Dice, y tiene razon, que no tiene sentido gastarse 200.000$ en ir a la universidad ya que la mayoria de estudiantes se pasan muchos años devolviendo los creditos.

1 respuesta
B

Yo empece con C y una vez sabes programar en c aprender otro idioma es bastante sencillo.

Ademas el c es mas viejo que java y por ejemplo cuando usas memoria dinámica, tienes de gestionar tu el espacio así que aprendes y comprendes como funciona todo lo que haces.

Yo empezaria con c.

Variables
Funciones
tablas
Ficheros
Gestion de memoria dinamica (colas,listas,...)
Pipes, sockets
Procesos y hilos
....

7 meses después
Elenusglez

hablais de C....sabéis donde puedo encontrar este libro de programación computer organization and design ??

1 respuesta
Srhoud

Si quieres aprender a hacer cosas rápido: empieza por Java.

Si quieres aprender a programar de verdad: empieza por C, luego sigue por C++ y luego si tal Java, que sabiendo los otros 2 es una tontería aprenderlo.

Java te vale para hacer cosas rápido, pero es una máquina de generar malos hábitos de programación acojonante, traga con todo lo que le metas.

1 respuesta
C

#37 lo siento, pero llevo años queriéndolo hacer y acabo de ver la oportunidad:

Salu2

#38, según tú y el siguiente ranking, hay mucha gente que no sabe programar de verdad:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Define "malos hábitos de programación" y "programar de verdad".

1 1 respuesta
Srhoud

#39 Programar de verdad y malos hábitos de programación van unidos de la mano. Si quieres algo que funcione rápido y eficientemente, no entra en ninguna cabeza hacerlo en Java, básicamente porque su punto fuerte de cara a desarrollar, que es el simplificar la tarea del programador para poder acortar tiempos de desarrollo gracias a evitar la gestión manual de la memoria, es su punto débil en cuanto a rendimiento, y es básicamente el recolector de basura. A eso me refiero con programar de verdad, hacer algo que exprima una máquina al límite o un sistema en tiempo real, no lo vas a hacer con Java por razones obvias. Que sí, que es la ostia de cómodo y para muchas cosas es lo mejor porque puedes hacer por ejemplo webs con servlets y demás en 4 patadas, pero dista mucho de ser el mejor lenguaje, al menos a mi modo de ver.

Y luego malos hábitos, pues en primer lugar no tocas nada de la memoria, con lo cual esa parte no te molestas en pensar acerca de su optimización, lo cual va a derivar en un menor rendimiento de lo que hagas. Después, si estás acostumbrado a Java y su recolector de basura, muy probablemente sufras como un cerdo en caso de querer o tener que cambiarte a un lenguaje con gestión de memoria manual y vas a tener petes por todos los lados. A mayores de esto, está el tema de que tiene cosas muy poco ortodoxas como los casteos mágicos a lo loco. En mi experiencia personal, la gente que se quiere pasar de C/C++ a Java no tiene problema ninguno, porque es una simplificación enorme, pero la gente que quiere hacer al contrario las pasa canutas.

2 respuestas
elkaoD

#40 estamos en el 2013. El precio por GB de RAM es ridículo y los ordenadores tienen varios núcleos a varios millones de ciclos por segundo. ¿Para qué quiero manejar la memoria a mano? Como dijo el propio Donald Knuth: premature optimization is the root of all evil.

El rendimiento a fecha del 2013 viene por dos factores: algoritmia (en cuyo caso da igual el lenguaje) y el más importante: PARALELIZACIÓN.

Gracias a Java y a su recolector de basura, paralelizar es un poco menos infernal de lo que sería hacerlo con C.

¿Pero sabes qué es más importante que todo eso? La ventana de oportunidad hasta que tu competidor directo saca tu mismo producto mucho antes que tú.

1 respuesta
Srhoud

#41 nunca has tenido que hacer ningún sistema en tiempo real no? o para un sistema pequeño?

2 respuestas
elkaoD

#42 es que entonces Java está fuera de discusión obviamente. Hay dos mundos claramente diferencias, software engineering (donde C está mueto) y dispostivos embebidos (donde Java no tiene ni tendrá nunca nada que hacer). Es como comparar el fútbol y el baloncesto.

¿Eres consciente de que nadie hace RT? Los dispositivos de ahora son los móviles y el que toque RT con constraints pues obviamente sabe C, no Java. Pero vamos, C puro. Ni siquiera C++. Ya meter C++ es un RT es una locura.

Si estás tan "constrained" de memoria/tiempo, ¿para qué quieres clases? :)

Y como digo, ahora con cosas como la RasPI/móviles los casos de uso del RT son cada vez menores... como mucho dispositivos de control y ese tipo de cosas.

1 respuesta
Srhoud

#43 eres consciente de que hay miles de aplicaciones donde el procesamiento en tiempo real es indispensable?
No sabía yo que no había consolas portátiles con míseros megas de ram sin llegar ni al medio giga, no sabía que las consolas hasta ahora tenían gigas y gigas de ram, o que todos los móviles tengan gigas de ram también, por citar 3 cosas que no van tan sobradas de memoria.

Pero por eso lo digo, es decir, Java es tan cómodo como ineficiente, y es muy cómodo, para determinadas cosas está muy bien y es lo más práctico comparando rendimiento y tiempo de desarrollo, pero vamos, que alguien que está acostumbrado a picar C++ (por comparar con orientación a objetos) está a un nivel superior de programación que alguien que únicamente pica Java, para mí es indiscutible, directamente por lo que te da un lenguaje y otro.

1 respuesta
elkaoD

#44

"No sabía yo que no había consolas portátiles con míseros megas de ram sin llegar ni al medio giga"

Mi móvil tiene 256 Mb de RAM y no veo yo que Java vaya sufrido. Tengo abiertas un montón de aplicaciones que son posibles gracias a Java y el framework Android. Eso en C(++) es impensable y aunque fuera posible (que lo es) también es impráctico. Si en móviles no se usara programación de alto nivel estaríamos ahora mismo en 1990 en cuanto a dispositivos móviles.

"no sabía que las consolas hasta ahora tenían gigas y gigas de ram, o que todos los móviles tengan gigas de ram también, por citar 3 cosas que no van tan sobradas de memoria."

Ahí te doy la razón. Por eso la 3DS no usa Java. Vuelvo a insirtir: en estos casos Java ni siquiera es una alternativa. No está sobre la mesa. No es una carta a barajar.

--

"alguien que está acostumbrado a picar C++ (por comparar con orientación a objetos) está a un nivel superior de programación que alguien que únicamente pica Java, para mí es indiscutible"

Y alguien que toca PF está a un nivel superior de programación que el que unicamente pica C++.

What's your point?

Porque la PF es extremadamente ineficiente, gasta memoria A SACO y es parte de su diseño (y lo que la hace genial). Por eso tampoco usaría PF en un dispositivo embebido... pero tampoco usaría C++ para hacer el nuevo Twitter.

--

O por otro lado podríamos todos volver a programar ASM. ¡C es extremadamente ineficiente! ¡Y no hablemos de C++!

Esto mismo ya pasó en 1970, ¿advinas quién ganó la guerra ASM-C? ¿El eficiente o el útil?

En resumen: ni Java es peor que C++, ni C++ es peor que Clojure (que por cierto, va sobre Java :))

The right tool for the right job.

1 respuesta
Srhoud

#45 "Tengo abiertas un montón de aplicaciones que son posibles gracias a Java y el framework Android. Eso en C es impensable."
Pues me entero ahora de que C gasta más memoria que Java xDDDD

"What's your point?"

Mi punto es que hay para cosas para las cuales Java no es una alternativa, pero por tema eficiencia C siempre va a ser una alternativa por encima de prácticamente cualquier otro lenguaje.

"Y como digo, ahora con cosas como la RasPI/móviles los casos de uso del RT son cada vez menores... como mucho dispositivos de control y ese tipo de cosas."

Sistemas de visión por ordenador, juegos, sistemas de control de robótica, sistemas de procesado paralelo de alto rendimiento, por citar 4 campos en los que RT es necesario y en los cuales no hay alternativa real a C/C++ salvo contadas excepciones.

Pero vamos, esto era un hilo de por dónde era mejor empezar a aprender programación y estamos bastante desviados del tema xDDDD.

Relativamente a eso (a aprender), para mí el trío a aprender es C/C++/Java, con eso cubres la grandiosísima mayoría de cosas que vayas a necesitar y te va a simplificar muchísimo la vida de cara a aprender nuevos lenguajes.

1 respuesta
elkaoD

#46

"Pues me entero ahora de que C gasta más memoria que Java xDDDD"

No, no estoy hablando de memoria. Estoy hablando de rapidez de desarrollo. Si me tengo que poner a manejar la memoria estás tú que el ecosistema avanza como lo ha hecho.

Es una cuestión de "me la suda el rendimiento, voy a hacer las cosas YA". Eso no es un mal hábito, ¡es una necesidad! ¡Un mal hábito sería querer manejar la memoria a mano!

"Mi punto es que hay para cosas para las cuales Java no es una alternativa"

Y lo mismo para C ;)

Lo que tú llamas buenos hábitos desde el punto de vista C yo lo llamo malos hábitos desde el punto de vista Lisp y viceversa. ¿Ves por donde voy? No hay "malos hábitos", hay "casos y casos".

Para mí es impensable hacer un for con Lisp. Para ti será impensable los datatypes inmutables.

"Sistemas de visión por ordenador, juegos, sistemas de control de robótica, sistemas de procesado paralelo de alto rendimiento"

  • En los sistemas de visión se está usando MATLAB, con eso te digo todo... Tampoco te voy a quitar la razón porque depende del dominio del problema si necesitas RT (¡o no!)
  • En juegos el uso de C/++ me parece estúpido, anticuado e innecesario (si ahora la GPU es la que te lleva todo el procesamiento). ¿Por qué no haces la lógica del juego en un lenguaje de MUY alto nivel que permita "tunear" el juego al mínimo y dejar a la GPU que haga lo que hace bien: calcular a granel?
  • En robótica tienes toda la razón, ahí sólo C es alternativa.
  • En procesado paralelo no se usa C (si acaso dialectos como en CUDA, pero vamos, no es cuestión de lenguajes sino de tecnología).
  • Más procesado paralelo: en tecnologías MapReduce (Hadoop-like, BigTable de Google, mapReduce de Mongo) se usan lenguajes de alto nivel. De la Wikipedia: Hadoop is written in the Java programming language...

"Relativamente a eso (a aprender), para mí el trío a aprender es C/C++/Java"

Para mí el trío es Clojure, CoffeeScript e Inglés :P


EDIT: y por cierto, si pones a un programador C++ a programar JavaScript las va a pasar putas. No son conocimientos intercambiables. ¡Y mira que JavaScript es simple! Pero cada lenguaje tiene su paradigma y la OO de JS no tiene NADA que ver con la OO de C++.

¿Hace eso que el que programa JS esté un nivel por encima del que programa C++?

Si lo ves desde el punto de vista sintaxis vale, pero la diferencia es la meta-programación.

1 1 respuesta
C

A eso me refiero con programar de verdad,
hacer algo que exprima una máquina al límite o un sistema en tiempo real

Y luego malos hábitos, pues en primer lugar no tocas nada de la memoria,
con lo cual esa parte no te molestas en pensar acerca de su optimización,
lo cual va a derivar en un menor rendimiento de lo que hagas.

#40 suponía que ibas a responder algo así. Te doy mi opinión:

Ah, pues muy bien. Esa es tu definición. Según a quien preguntes te va a decir una cosa distinta.
Si le preguntas a mi director general, te dirá que un programador de verdad soy yo y mi equipo, que
utilizamos XP como metodología de trabajo y antes del deadline tenemos todo a punto. Y te dirá que el equipo de weberos de mi empresa son lo peor porque se pasan el deadline por el arco del triunfo.

Si le preguntas a un usuario sobre dos webs distintas quién es el programador de verdad, te dirá que la más bonita, aunque por debajo tenga código espagueti del bueno.

Si le preguntas a un profesor de universidad, un engendro como este:

sobre qué es programar de verdad, la respuesta puede ser que programar de verdad es ASM. Y que todo lo que no sea ASM es de pobres. Son personas que dudo que hayan escrito programas de más de 1000 líneas (y estoy siendo generoso).

A mí si me preguntas qué es programar de verdad, te preguntaré a su vez que me des información sobre Qué, Cuándo, Dónde y Cuánto. Y entonces elegiré la herramienta, la metodología y te diré que para ese objetivo en concreto, programar de verdad es hacerlo con esto, de esta forma y en este tiempo. Y todo lo que no sea saber elegir bien la herramienta y la metodología, lo considero un mal hábito.

Cierto es que a mi opinión le he dado un sesgo desde el punto de vista de la ing. del software a nivel empresarial. Pero, por mi parte, basta ya de denostar paradigmas, lenguajes y metodologías. Cada una de ellas tiene su razón de ser y es como comprar churras con merinas. Hace tiempo que no soy ni de apple ni de android, ni de c ni de java, etc. Creo que en estos temas se tiende a caer en absolutismos con puntos de vista obtusos creyendo, por ejemplo, que programar en C es de pr0s y programar en Java es de inútiles.

Es como decir que un Concorde es mejor que una avioneta. Pues si es para ir de Londres a Nueva York con prisa ok. Pero si lo que quiero es ir de mi finca al aeródromo que está a 50Km va a ser que no.

Y los malos hábitos los puedes tener programando en ASM, ActionScript, C, Java, Haskell, Ruby, etc. He aquí un listado de malos hábitos: http://es.wikipedia.org/wiki/Antipatr%C3%B3n_de_dise%C3%B1o. Y aun así, hay situaciones en las que se permite caer en alguno de ellos si tiene en cuenta el compromiso eficiencia/rentabilidad.

Por otro lado, suscribo todo lo referente a tus comentarios sobre C, Java y la eficiencia en términos de velocidad de uno sobre otro. Te veo muy puesto en el asunto. No puedo estar más de acuerdo.

2 1 respuesta
Srhoud

#47
"Es una cuestión de "me la suda el rendimiento, voy a hacer las cosas YA". Eso no es un mal hábito, ¡es una necesidad! ¡Un mal hábito sería querer manejar la memoria a mano!"

Para mí esto difiere mucho de la realidad, pero es una opinión personal, todo depende del contexto.

#47 y #48 creo que me habéis entendido mal, con el último mensaje de #48 me he dado cuenta de que quizás el problema fue lo de usar la expresión "programar de verdad", con la que hay gente que se puede dar por ofendida, desde luego no quería decir ni por asomo que la gente que pique C sea pro y los de Java inútiles, ni de lejos vamos.

Todo esto empezó porque preguntaban el lenguaje por el que empezar a aprender, y mi opinión en eso es que es mejor empezar por C, luego continuar por C++ y luego Java. De este modo, en primer lugar te habitúas a todo el tema punteros y tratar la memoria a mano, luego introduces todo el concepto de programación orientada a objetos y luego, una vez dominado eso, aprender Java es algo trivial.

1 respuesta
elkaoD

#49 sí, no te creas que me tomé a mal lo de "programar de verdad". Sólo intento decir que hay muchas formas de programar "de verdad" y ninguna es exclusiva, todo depende de qué quieras.

En una empresa les vienes con lo del rendimiento y se te ríen en la cara xD La empresa quiere resultados, no rendimiento. ¿Necesito rendimiento? Pues meto más memoria al servidor o me compro una máquina y que trabaje en paralelo. Los servidores son, como dicen los ingleses, "dirt cheap". Es una cuestión de costes: gasto más tiempo (es decir, dinero) optimizando cuando puedo gastarlo en arreglar bugs y comprar una máquina extra que vale dos pesetas.

En la uni desgraciadamente no lo enseñan, pero en IT prima la mantenibilidad, no el rendimiento. Sigo diciendo que son dos "niveles". Tú lo ves desde el punto de vista teleco/industrial (¿me equivoco?) y yo como ingeniero del software.

Por eso no creo que sea un buen consejo decir que aprendan C porque van a manejar memoria, porque es un... ¿1%? del trabajo que se realiza programando (robótica y poco más, que es donde se necesita RT de verdad), mientras que Java vale para el 99% de las tareas haciendo el tiempo de desarrollo ridículamente bajo comparado con C.

No sólo eso, diría que todo el FUD que hay contra Java en cuanto a rendimiento, es eso, FUD. Créeme que en la JVM 1.7 se ha implementado lo que quiera que tú vayas a implementar en C++ mucho más eficiente, mucho más bonito, con mucho más conocimiento del dominio y, sobre todo, su "codebase" está repleto de conocimiento tácito (corner cases, peleas contra bugs, etc.) Java es mucho más rápido de lo que el 99% de la gente piensa.

Pero bueno paro aquí porque esto es un bucle y como dices hemos deraileado el thread :(

5 1 respuesta
Srhoud

#49 No, no soy teleco/industrial, soy informático, y sí, en IT prima la mantenibilidad frente al rendimiento en la mayoría de las empresas de este país, en todos los lados que he trabajado siempre se ha usado Java/.NET por su facilidad de picar código en cero coma.

Volviendo al tema de la educación, para mí si que es importante aprender a manejar la memoria a mano, puede que sea un 1% de los casos, pero al menos a mi modo de ver, el código resultante si estás acostumbrado a hacerlo manualmente siempre va a simplificarle la vida al garbage collector, consiguiendo mayor rendimiento. Pero vamos, ya digo que es una visión personal del asunto, no tengo ni quiero tener la respuesta correcta a este tema, porque es como el culo, cada uno tiene el suyo xDDD.

Tendré que pegarme con Java 1.7, que si te soy sincero no conozco en profundidad, pero merecerá la pena echarle un ojo ;)

1 respuesta
BLZKZ

manejar memoria a mano y luego decir "programo en java" y "ayudo al garbage collector" es cuanto menos curioso (amén de una gilipollez)

1 respuesta
Srhoud

#52 En ningún lado he dicho lo de "manejo memoria a mano", pero vamos, precisamente ahora estoy desarrollando algo en C++ xDDD.

Por otra parte, lo de ayudo al garbage collector a mi no me parece ninguna tontería, todo lo que sea simplificar tareas automáticas, será una mejora del rendimiento, aunque sea prácticamente inapreciable.

Pero vamos, si queréis un hilo de Java vs C, que alguien lo abra y empezarán a surgir los fanboys de ambos lados, esto si no me equivoco, era un hilo de recomendaciones para iniciarse en programación.

1 respuesta
T

#42 Mirate Java RT (Java Real Time) esta pensado precismaente para eso, programar aplicaciones en "tiempo real" para entornos con recursos limitados. (arquitectura embebida o como se llame en castellano)

BLZKZ

#53 encima vienes mintiendo. en #51 cito textualmente

ara mí si que es importante aprender a manejar la memoria a mano + hacerlo manualmente siempre va a simplificarle la vida al garbage collector

Así que no vengas diciento que no. Y en el mundo empresarial raro es el proyecto en el que en c++ se maneja a mano la memoria dinámica. Muy muy raro.

1 respuesta
Srhoud

#55 va, venga, si citas, cita bien:

Volviendo al tema de la educación, para mí si que es importante aprender a manejar la memoria a mano, puede que sea un 1% de los casos, pero al menos a mi modo de ver, el código resultante si estás acostumbrado a hacerlo manualmente siempre va a simplificarle la vida al garbage collector

1 respuesta
BLZKZ

#56 y eso qué cambia? sigues diciendo lo mismo

1 1 respuesta
cabron

Para ayudar al recolector de basura, saber manejar la memoria a mano es completamente irrelevante, lo único que tienes que hacer es evitar usar new en partes temporales del programa donde se reserva memoria en la pila que es liberada al terminarse esa parte (ej: dentro de un bucle o en las variables locales de un método) y poco más...

Es más relevante conocer las particularidades de la plataforma para evitar utilizar cosas que usan "new" por debajo creando objetos que luego hay que limpiar (ej: en Java usar el operador + para concatenar 2 Strings crea por debajo un StringBuffer temporal que es lo que realmente concatena, y que luego tiene ser limpiado por el recolector, por lo que es mejor usar un StringBuffer directamente si vas a concatenar mucho).

1 1 respuesta
Srhoud

#57 hombre, de para mí si que es importante aprender a manejar la memoria a mano + hacerlo manualmente siempre va a simplificarle la vida al garbage collector a Volviendo al tema de la educación, para mí si que es importante aprender a manejar la memoria a mano, puede que sea un 1% de los casos, pero al menos a mi modo de ver, el código resultante si estás acostumbrado a hacerlo manualmente siempre va a simplificarle la vida al garbage collector para mí hay un trecho largo, igual es algo personal, pero...

#58 Es decir, claro que puedes ayudar al recolector sin saber manejar memoria a mano, pero lo único que digo es que alguien acostumbrado a hacerlo así va a tender a usar ese tipo de patrones de estructuración del código más que alguien que no lo está, pero vamos, creo que se me está entendiendo del modo en que no quiero que se haga.

Soltrac

Aún así, muchos managed codes tienen leaks cuando llaman a funciones unmanaged (lo más común, llamadas a la API de windows), acostumbrados a usar el recolector de basura no se preocupan y tachán! fallan.

Al menos es donde yo más me he encontrado fallos al leer código en .NET

Usuarios habituales