Hace 10 años | Por --411477-- a storify.com
Publicado hace 10 años por --411477-- a storify.com

Programar es fácil, programar bien es muy difícil. No hay que engañar, que luego abandonan decepcionados a la primera complicación. Problemas complejos + estructuras complejas requieren dominio de algoritmos básicos fundamentales, y conocer la complejidad de cada uno.

Comentarios

zoezoe

#19 Toy en ello

kaoD

#43 "pues genial porque no tienes que estar teniendo en cuenta que es un puntero y que esa memoria hay que liberarla."

Hete ahí que diferencie en el comentario entre puntero (apunta inherentemente a memoria, trabajar a bajo nivel) y referencia (una abstracción sobre los primeros).

No veo una ventaja de C++ poder usar punteros. La mayoría de las veces es, si acaso, un inconveniente. ¿Cuándo fue la última vez que usaste aritmética de punteros? Si la respuesta es "todo el rato" estás programando mal (o estás programando en sistemas empotrados). Si la respuesta es "nunca"... ¿cuál es entonces la ventaja de los punteros frente a referencias gestionadas?

"El problema viene cuando uno no entiende que no es lo mismo un array de enteros que un entero, que ese nombre de variable en realidad lo único que contiene es una dirección de memoria y no el contenido de la misma."

No. El problema es que en C/++ la diferencia es sutil. Un int* puede (o no) ser un escalar o un vector. ¿Cómo lo sabes? Inspeccionando el código, no te queda otra... y eso es un puto dolor de culo seas novato o no.

En real-life-C++ usarás librerías estándar que implementen vectores y acabarás programando Java-like.

La culpa de no distinguir entre un escalar int* y un vector int* no es del humano, es de la abstracción (porque tanto C como C++ son abstracciones sobre assembly). En Java no hay pérdida, o es un "int" o es un "List". En ese sentido Java gana sobre C/++ igual que Haskell sobre Java.

Pero vamos que tampoco voy a defender a Java lol

"Esas pequeñas sutilizas que en C aprendes cuando quieras volver atrás te vas a hacer un lio"

¿Y quién quiere volver a atrás? Si no manejas sistemas empotrados o de alto rendimiento no tiene sentido estar tan cerca del "metal". Y si lo haces.... ¿qué

Además que en mi opinión es justo al revés, una vez entiendes la programación a alto nivel puedes "volver atrás" y entender los punteros sin necesidad de pelearte con entender qué es un "statement", qué significa "==" frente a "=", qué cojones es una variable, qué es una función, etc.

Si a alguien le enseñas a programar y a la vez le quieres explicar la diferencia entre * y & pues le vuelves loco sí o sí. Si ya sabe programar, al aprender punteros sólo tiene un problema contra el que enfrentarse.

"Si no sabes como se maneja la máquina interiormente jamás serás un buen programador."

Discrepo. Para mí un buen programador:

- Sabe de algoritmia (lo que bien comenta Gallir).
- Es bueno estructurando.

Saber qué hace la máquina por debajo es lo de menos. Y te lo dice alguien que aprendió con C y fue fan de ASM en su día.

D

#15 meneando , nas noches

noexisto

Iba a hacer un chiste sobre lo de Rosa María Artal y BarbieJaputa (@dadelmo pero soy una persona discreta

c

#85 Primero, en tu comentario en #18 has puesto "librerías". Las cosas que comentas no son librerías. Moodle, Magento, Joomla o Drupal no son librerías. Eso lo PRIMERO.

Lo segundo, de las cosas que comentas, de todas hay alternativas desarrolladas en Python, de mayor o menor calado. CMS hay a punta pala, frameworks igual (no todo es Django gracias a dios, está Flask, Bottle, o liarte la manta a la cabeza con Werkzeug o a pelo y hacer tu propio framework según el estándar WSGI). Lógicamente hay más cosas hechas en PHP orientadas a la web, porque PHP es un lenguaje específico de back-end, no como Python que es un lenguaje de propósito general. (Sí, PHP puede usarse para más cosas aparte de back-end... seamos serios).

Por último, lo que dices de que "hay más desarrolladores de PHP por algo", ese algo es que desarrollar para la web con PHP es muy sencillo, la barrera de entrada es prácticamente inexistente: te instalas un apache y php y con solo poner un echo "Hello world"; ya vale. Con Python pues es más jodido, tienes que tener un proxy inverso, tienes que tener un servidor de aplicaciones tipo gunicorn o mod_python, etcétera. No es trivial. Ahora, que quede claro que el hecho de que haya más desarrolladores de PHP que de Python no se debe en absoluto a que PHP sea un mejor lenguaje, ni de coña.

D

A mi me parecen muy buenos consejos. Sobre los libros, diré que si ponéis el título en Google y añadís la palabra "pdf" a dicha búsqueda...bueno ¿quién sabe?

kaoD

¡Gallir ya si aprendieras* programación funcional lo flipabas! Viendo tu amor por los algoritmos te encantaría, en especial Clojure (que es más práctico que Haskell y mantiene una gran parte de la pureza).

Siendo sinceros, el 90% de los programadores no necesitan saber algoritmia porque se dedican a interfaz de usuario y lógica de negocio simple. La gran mayoría de aplicaciones son una capa CRUD bajo una capa de UI específica para el caso de uso y poco más.

*Asumo que no la conoces porque lo más "funcional" que recomiendas es JavaScript.

#28 conoces Rust y Nimrod? A mí Go no me llama nada, me parece una chapuzada y las abstracciones (en especial las de concurrencia como los canales) me parecen contraproducentes.

nergeia

#50 Completamente de acuerdo. Manejar punteros directamente es cada vez más arcaico. Entre la STL, o incluso mejor, usando BOOST, lo que es necesidad de utilizarlos no tienes, la gran mayoría de las veces. A ver, tienes una clase string, la clase vector que almacena lo que quieras, la clase map, que es un diccionario.... Para que quiero un char*?

Y si lo quiero, pues uso punteros inteligentes (que se liberan solos si no les referencian), y tan contento--> unique_ptr en vez de char*

frankiegth

Para #101. '...¿alguno reclmendable y mas o menos basico en español?...'

Olvídalo, las traducciones suelen y tienden a ser terribles. Para temas avanzados los autores españoles más 'conocidos' van siempre 20 pasos por detrás que la mayoría de autores en lengua inglesa que tienen todos estos temas ya superados desde hace décadas.

El inglés es claro y conciso en estos temas, te sale más a cuenta meterte de cabeza en el inglés que permitir que te lien las ciencias en computación con retorcida prosa española.

Amandy

¡Meneado! Venía a publicarlo, pero como siempre, lo busqué antes.

NapalMe

Cuando no programo en ensamblador me siento...sucio....

D

#81 Por poner ejemplos básicos, ¿cuántos motores de foros hay en Python? Porque en PHP tienes cientos y algunos buenisimos, como phpBB.

¿Cuántas plataformas elearning están desarrolladas en Python? Porque en PHP hay cientos y algunas buenísimas, como Moodle.

¿Cuántos CMS hay desarrollados en Python? Me refiero que tengan literalmente miles de módulos, themes y plugins. Porque en PHP hay muchos y algunos bastante buenos, como Drupal o la última version de Joomla.

¿Cuántas plataformas de pago hay en Python? Porque en PHP hay cientos y algunas con miles de themes, plugins y módulos como Magento.

¿Cuántas frameworks tiene Python aparte de Django? Es decir, Django es una muy buena framework, pero cada programador tiene sus manías y para alguno se puede hacer muy pesada o no ir con su filosofía de programación y a todos nos gusta tener alternativas. PHP tiene ahora mismo cientos de frameworks y algunas son muy buenas, como la de Zend, Symfony, Laravel, Yii.

Podría seguir toda la noche pero me imagino captas la idea.

Ojo, que yo desarrollo en Python también y me encanta y en muchas cosas ha sido pionero y los demás les han copiado. Yo todavía recuerdo hace 10 años cuándo descubrí por ejemplo su increíble forma de manejar cadenas, expresiones regulares y muchas otras características avanzadas, pero bueno, si hay más desarrolaldores en PHP es por algo, supongo.

En fin, tú en mi comentario veías "ijnoracia", yo en el tuyo veo fanboyismo desorejado y prepotencia.

D

#94 Mira, esta es la típica discusión que he tenido desde hace 20 años con universitarios recien salidos de la carrera, de esos que tienen cuatro pelillos en lo que debería ser una barba y tal. Y al final, cuándo tienen que entregar un trabajo en un tiempo determinado, con unas funcionalidades concretas y ajustandose a un presupuesto, vamos, lo que viene siendo desarrollar un proyecto en el mundo real® normalmente bajan las orejitas y se olvidan rápido de su talibanismo prepubescente.

Pero bueno, tú sigue tirando de wikipedia y de debates teóricos que no van a ninguna parte y llamando "ijnorante" a la peña que yo mientras tanto sigo ganandome la vida con esto, como repito, llevo haciendo ininterrumpidamente los últimos 20 años.

#95 ¿Quién dijo que PHP fuese un lenguage de propósito general? ¿Oyes voces en tu cabeza? ¿Serios problemas de compresión lectora? ¿Quién dijo que Python no era una alternativa seria en muchos ámbitos? Sencillamente, no lo es por ejemplo en una típica aplicación de escritorio, porque para eso hay alternativas mejores, pero en otras muchas pues sí, nadie lo niega.

En fin, si intentas meter baza hazlo al menos no tergiversando lo que otros dicen o explican.

D

#9 Vete pensando un lugar adecuado... lol #10 Moooola!

P

#100 Creo que confundes "productivo" con chapucero. En realidad puedes ser "productivo" mientras realizas buenas prácticas de programación (quienes mantengan tu código -y tú mismo en el futuro- te lo agradecerán), y eso lo puedes lograr en Pascal, Java y hasta PHP. O puedes ser chapucero y terminar antes, pero dejando un desastre sin posibilidades de mantenimiento a futuro, y eso también lo puedes lograr con PHP, Java y hasta Pascal.

E

#c-162" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/2177644/order/162">#162 Claro, el tema es cuando tengas que realizar un algoritmo avanzado y eficiente, si no conoces las estructuras y funcionamiento bruto de las abstracciones que utilizas acabas haciendo chapuzas. Luego resulta que ¿Por qué tarda tanto en arrancar este programa tan simplón?

Si te quieres dedicar a ello a nivel profesional, es una mala elección empezar por ahí, porque puedes sentir que controlas más de lo que realmente controlas y porque no vas a entender los argumentos que te den para elegir dos opciones que funcionan.

Por ejemplo, he visto utilizar un HashMap (pares clave-valor, en cada lenguaje se llamarán X) con claves tal que 1, 2, 3... 18751548, sin ningún valor intermedio ausente. Claro, eso funciona, Java te deja, ahora, si sabes algo de estructuras de datos y lo que implica esa acción sabrás que lo correcto habría sido usar un ArrayList.

Cosas que te obligan a saber si aprendes con un lenguaje que no ofrezca tanta abstracción (C, Pascal, Fortran...) sobre lo que implica ese uso de HashMap:
*Estás obligando a calcular un hash de cada índice numérico, eso conlleva ciclos de reloj, y al ser índices enteros consecutivos es absurdo.
*Una vez calculado el hash, la búsqueda de la coincidencia para obtener la entrada es otra vez pesada, aún metiendo un árbol binario (si sabes lo que es)
*Una vez obtenida la entrada hay que comprobar la colisión del hash.
*Estás desperdiciando memoria en conservar un hash y el entero que sirve de índice.

¿Cómo se resuelve con un array a partir del índice?
1 - Se multiplica el índice por el tamaño de cada entrada.
2 - Yastá.

Los primeros pasos son los que más te marcan el aprendizaje, si tienes alguna mala manía programando muy difícil te vas a librar de ella. Si programas en C las malas manías se quitan a golpe de "Violación del segmento" y corrupción de memoria (del proceso).

Y luego, si dejas Java y te quieres adentrar en... digamos... programar para dispositivos embebidos, drivers, sistemas operativos o herramientas de bajo nivel, vas a flipar en colores de todas las asunciones erróneas que tenías, doble de quebraderos de cabeza. En cambio, aprender Java o C# controlando C es un juego de niños, no paras de pensar "oh, que guay, ya tiene una herramienta para hacer esto solo", pero sabiendo y conociendo qué es lo que está haciendo realmente.

Luego vayamos a la exageración ¿Ensamblador? Bien, ensamblador tiene una serie de problemas,
* el primero y evidente es que hay un ensamblador por cada procesador ya que programas directamente para ese hardware, no puedes aprenderlos todos y no es práctico.
* el segundo que el control de la estructura de datos entre asm y c tiene un salto brutal en dificultad pero un mínimo impacto en rendimiento (incluso un compilador podría hacerlo mejor que tu si no eres un genio bestial y controlas un huevo de procesadores "¿Hola? ¿Estoy empezando recuerdas?").
* luego está el detalle de que no vas a poder ejecutar tus programas de iniciado en hardware real hoy día (o muy difícilmente), vas a tener que pelearte pues con emuladores de ensamblador que a saber qué hacen y que tal lo implementan y si equivale realmente a un procesador real. "¿Estoy aprendiendo algo o es solo un juguete difícil con lucecitas?"
* también que es bastante ilegible y para entenderlo hace falta conocer la arquitectura interna de una CPU (no, de LA CPU para la que es ese ensamblador), que tampoco está mal, pero ahí ya nos vamos a saber ingeniería informática y no solo a programar...

frankiegth

'...Nunca comencéis a aprender con programación orientada a objetos (ni con lenguajes que lo exijan), agrega una capa de abstracción muy elevada...'

Error. En los paises nórdicos desde primero de carrera Java con objetos. El error es empezar a programar sin pensar en objetos. No lo digo yo (que también), lo practica hoy la propia universidad que inventó en los 70 la programación orientada a objetos.

'...Java no está mal, y mejoró mucho en los últimos años, pero exige un IDE, lo que os hace demasiado dependientes de él y no sabéis ni sangrar...'


Falso. Java puede programarse desde cualquier editor de texto, desde cualquiera, VIM incluido. El IDE es completamente opcional, aunque pueda ayudar mucho a gente que empieza más que nada por los autocompletados opcionales.

No es una critica, en la mayor parte de consejos lleva razón, pero no todos conocen como se tratajan en otros paises estos temas de primera mano.

RivaSilvercrown

lo triste es que el mejor código que estoy viendo últimamente son... exploits. Y cosas en ruby y python.

D

Respecto al tema de si PHP es un mal lenguaje no estoy de acuerdo. Los lenguajes de programación son simplemente un medio de comunicación simplificada entre el hombre y la máquina. Al igual que sucede en los distintos idiomas cada uno tiene sus propias particularidades y características. Por ejemplo en francés el número 90 se escribe "quatre-vingt-dix", que representa cuatro por veinte más diez. Ésto no es nada óptimo ni ventajoso frente a como se escribe en español o en inglés (ninety). Algunos podrían decir algo similar a los que critican ciertos lenguajes de programación: "¡el francés es una m***da! Pero lo cierto es que a pesar de esa supuesta desventaja Francia ha conseguido estar muy por delante de nosotros en ciencia y tecnología. Para ellos no ha supuesto ninguna problema porque lo importante es el uso que se hace. Lo mismo se puede decir acerca de las grandes obras de la literatura o de la música realizada por distintos intrumentos o incluso de las distintas formas de codificación de las notas musicales.

En realidad un buen programador lo es independientemente del lenguaje que use. Se pueden encontrar verdaderas maravillas en PHP y verdaderos bodrios en Python y viceversa. Un lenguaje no evita usar malas prácticas y otro sí pero eso no quiere decir que el programa final vaya a estar mal hecho. Cada lenguaje tiene sus puntos fuertes y sus puntos débiles y lo bueno es saber elegir el adecuado para cada proyecto y programar de forma óptima, sencilla, clara y ordenada.

D

Si estáis aprendiendo a programar, directo al Python y evitad PHP (enseña malas prácticas y es un lenguaje sin siquiera coherencia).

Curioso consejo de alguien que desarrolla en PHP.

PHP a partir de la versión 5.4/5.5 es homologable a otros lenguages scripts del lado del servidor. Aungue entiendo el consejo de Phyton, el problema es que hay menos librerías en este lenguaje y no todo el mundo tiene ganas de reinventar la rueda.

zoezoe
kaoD

#35 un emulador lo puedes hacer hasta con chips TTL. Yo hablo de comodidad y facilidad de mantenimiento, no de potencia.

#36 en el C++ que se usa de verdad no tocas punteros, todos son referencias gestionadas. Es prácticamente Java.

La cuestión de C++ es que es fácil dispararte en el pie. Por poner un ejemplo... ¿cada vez que implementas destructor, constructor copia o el operador de copia por asignación, implementas los otros dos?

http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)

D

No sé la manía a C++, si decimos Objective C, pero C++... con su STL y no tener que preocuparse de los malloc ni los delete cada vez que defines un string o una lista.

miguelpedregosa

#2 discrepo, el problema de PHP es que se popularizó demasiado y la cantidad de código basura que puedes encontrar en Internet es abrumadora.

Eso sí, hasta PHP 5.3 ni siquiera lo puedes considerar como lenguaje de programación.

D

#1 Pues hay un sub para estas cosas raras vuestras

M

No estoy de acuerdo en lo de que C++ sea un "pain in the ass".

En mi opinión, los mejores lenguajes son principalmente C como lenguaje estructurado y C++ como lenguaje orientado a objetos.

D

#85 Mmmm todos los ejemplos que expones son de CGI's para web.

Python está en web, juegos, CUDA, administración de sistemas, inteligencia artificial, cálculo avanzado... mediante librerías, como comenta #89.

La lista donde se usa Python es enorme. Empezando por el gestor de paquetes de Fedora, Yum.

D

#93 http://en.wikipedia.org/wiki/List_of_Python_software

PHP está lejos de ser un lenguaje de propósito general.

#94 Sobre proyectos serios...

Blender. Reddit. Enough said.

kaoD

#47 "no tienes por qué irte a Haskell o Clojure, que son muy duros"

¡Pero si Clojure es un amor! A mí me parece sencillísimo. Haskell tampoco es difícil, sólo está mal explicado.

"puedes usar Scala como alternativa intermedia."

Ugh, aquí va a haber hostias

Odio Scala, entre otras cosas porque se queda en "el intermedio" y hereda lo malo de ambos paradigmas. ¡Ojo! Yo empecé con Scala, leyéndome el libro de Odersky del tirón, pero me he dado cuenta a la larga de que meter POO en funcional no sólo es innecesario sino que es contraproducente. Vale, es mejor que POO a secas (bueno, ahora con Java8 ni siquiera) pero es que te cargas todos los beneficios de la PF de un plumazo. IMHO una vez entiendes la PF la POO sólo complica la estructura del programa.

"Lo digo más que nada porque entrar de golpe en la programación funcional viniendo de imperativa, estructuras de datos mutables y POO se hace cuesta arriba."

Pues yo lo que normalmente veo es que la gente razona mejor las estructuras de datos inmutables que las mutables... aunque tienes mucha razón en que cuando ya vienes con la mentalidad imperativa se hace duro.

A mí la PF pura me resultó un cambio radical. Ya no imagino tener que tirar de POO. Me parece mucho más cercano a lo que realmente quiero expresar, más cercano a como funciona el mundo y, sobre todo, mucho más útil en cuanto a reutilización del código.

"(monads, je)"

Esa es una de esas cosas de Haskell que son sencillísimas y la gente las complica tanto al explicarlas que parecen salidas del infierno.

frankiegth

Para #50. '...Saber qué hace la máquina por debajo es lo de menos. Y te lo dice alguien que aprendió con C y fue fan de ASM en su día...'

Me pongo bastante triste cada vez que se ataca de forma totalmente injusta al ensamblador.

Sin ensamblador ni se podrían programar lenguajes de alto nivel ni se podrian compilar (ni ejecutar). En fin, que sin ensamblador digamos que no tendriamos ni los chips del PC ni PC.

Sin ensamblador no podriamos literalmente hablar directamente con el 'hardware', algo que los sistemas operativos a ciertos niveles agradecen profundamente.

Programar es un campo de muchos ámbitos.

Para resolver problemas de la vida cotidiana la orientación a objetos es perfecta porque el mundo está lleno de objetos reales (e imaginarios) que pueden representarse facilmente.

Para resolver problemas relacionados directamente con los propios ordenadores, tan necesarios ellos, para comunicarse directamente con su hardware, para diseñar cierto tipo de hardware, para facilitar la vida de los humanos via compilarores, para comprender y desarrollar areas básicas de las ciencias de la computación saber que hace la máquina es imprescindible.

Seta_roja

Ya que estamos y creo que viene al caso:

En inglés: https://www.coursera.org/course/algo

En spanglish: https://www.coursera.org/course/pealgoritmico

e

#143 Discrepo parcialmente: en mi trabajo una de las cosas a las que me dedico, que por suerte no es la única :), es a optimizar trozos de código. Y no lo hago en ensamblador, pero si que me miro el que genera el compilador para comprobar que todo es correcto: que la vectorización está bien hecha, que hay prefetchers donde toca, que los bucles están desplegados, que se usa precisión simple en vez de doble y un montón de cosas más. Y no, no siempre el compilador lo hace bien, hay que mimarlo un poquito y darle las cosas bien masticadas.

En general aquí todo el mundo barre para casa pensando que lo que él hace es lo correcto, cuando en realidad hay un montón de campos distintos y lo que es necesario y funciona en una especialidad no tiene porque hacerlo en otra.

D

#92 Estamos en 2014. Vamos, que en nuestro mundo lo que haya pasado hace 2 años es irrelevante, pues imaginate si hablamos de hace 15 años.

ktzar

#49 para hace gráficas PHP es una pasada. Yo hice hace ya casi una década una web de monitorización de consultas de usuarios para la dgt con carreteras y provincias marcadas por colores en función del uso. Y con PHP. El lenguaje no suele ser importante... Yo uso en el dia a dia 4 o 5 y en mi poco tiempo libre otros 3. Todos tienen esa base común que no hay que reaprender, luego cada uno con particularidades que le dan mucha potencia. Por ejemplo esto de ruby es una pasada:

`6.upto(10) `

Incluso objective c tiene perlitas, una vez superado el periodo de pánico.

Para ser buen programador, por otro lado, leerse Clean Code. Lo demás son tonterías http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

D

#111 "Claro hay genios que pueden hacer programas decentes"

Falso. Yo hago programas decentes en PHP y no soy un genio.

D

#169 Cógete un emulador de Spectrum y crea código ASM para Z80.

Ahí vas a optimizar por cojones tu código.

Hay gente que se ha hecho hasta un Doom en 3D.

Y bueno, si ves programas como Elite en 48k... es para pensárselo.

D

#139 "
El inglés es claro y conciso en estos temas, te sale más a cuenta meterte de cabeza en el inglés que permitir que te lien las ciencias en computación con retorcida prosa española. "

He ahí mi problema con las mates en secundaria. En inglés, pillaba todo a velocidad supersónica.

En castellano (y euskera igual), dan 50 vueltas para explicar una simple ecuación.

Por eso, en Code Academy, cuenta en inglés. No quiero leer cuarenta frases subordinadas como si fuera una obra de Cicerón para saber como se asigna usa simple variable.

D

No sé qué pinta esto aquí. Aquí somos todos los mejores programadores de la galaxia y parte del extranjero. Y los rabos nos llegan por la rodilla.

frankiegth

Para #159. Cuando vivía en España pensaba igual que tu, que empezar con la programación a objetos antes que la estructurada era un error, pero hoy lo veo completamente al revés.

Java no es un lenguaje complicado, es infinitamente más sencillo que el imprescindible ansi C en muchos aspectos, y no se necesita entender todo desde el principio para empezar a escribir código que haga algo.

Si quieres ver las prácticas que realicé desde el primer curso puedo pasarte un enlace en un privado, lo tienen todo online y las prácticas suelen colgarlas también en inglés. Es un problema de metodología en la enseñanza y clases de apoyo con estudiantes de cursos superiores, no es más complicado aprender Java que Ada, en absoluto. La orientación a objetos, los conceptos básicos de las internalidades de Java y ejemplos sencillos de implementación de código están al alcance de cualquiera si se sabe como impartirlos, y de ahí hacia adelante.

Amandy

#160 Yo empecé de cero con Java. Incluso, mi sobrino con 12 años está aprendiendo a programar en Java gracias a un juego. Y le ha ido muy bien.

RivaSilvercrown

#12

noexisto

#16 Creo que las más grande fue una de JavierB en una noticia chorra que se tatuaba en semejante parte no sé qué frase (es un mnm clásico) lol lol

D

#25 Pues puestos a elegir elijo Go. Antes que C++ prefiero C, me parece más facil que C++ incluso siendo este orientado a objetos.

c

#91 Déjate de chorradas. Una biblioteca/librería es una cosa, y un proyecto/framework/herramienta es otra. Moodle no es una librería, no intentes hacer lo blanco negro. Y sí, Python tiene más librerías que PHP, sobre todo porque el soporte de módulos es una cosa que está en el lenguaje desde el principio y no un addendum a posteriori como en el caso de PHP.

Con lo de que nadie utiliza Python para proyectos serios ya te retratas tú solito. Sería muy fácil ponerte ejemplos de cómo Python ha eclipsado a MatLab en desarrollos científicos, pero el dominio de Python en ese área es tan OBVIO que no me voy a molestar. Por lo demás, échale un ojo a este artículo de la Wikipedia http://en.wikipedia.org/wiki/Python_(programming_language)#Use entiendo que nombres como NASA, Google y tal te sonarán.

Sobre tu último párrafo, pues sí coincido contigo. Python no tiene ni mucho menos la veteranía de PHP en cuanto a desarrollo web, por lo que te comenté en #89, ya que PHP se creó para eso y Python no. Pero es normal, lo raro sería al contrario. Y al tiempo, porque en cuanto el desarrollo web con Python despegue un poco más, no habrá escasez de recursos. Ya para django hay apps de todo lo que comentas, por poner un ejemplo.

D

Si alguien empieza a programar por lo que más quiera que empiece por donde hay que empezar, C, todo lo demás son abstracciones y más abstracciones. Pero lo primero es entender lo que hay debajo no hacer todo en 4 líneas. Cuando aprendes C y entiendes lo que estás haciendo ya lo demás viene solo.

Yo creo que es mil veces mejor que te expliquen que es un puntero y una dirección de memoria que que te digan tu pon este código para hacer esto y ya lo entenderás.

D

#33 No es porque se usen o se dejen de usar los punteros, tu en Java usarás punteros también, pero te lo camufla como si fuera una variable del tipo en cuestión. Si uno sabe lo que es realmente que cuando creas un array o una cadena tienes un puntero, pues genial porque no tienes que estar teniendo en cuenta que es un puntero y que esa memoria hay que liberarla.

El problema viene cuando uno no entiende que no es lo mismo un array de enteros que un entero, que ese nombre de variable en realidad lo único que contiene es una dirección de memoria y no el contenido de la misma.

Esas pequeñas sutilizas que en C aprendes cuando quieras volver atrás te vas a hacer un lio porque tu estás acostumbrado a manejar variables y no diferencias entre la pila y el montón. Si no sabes como se maneja la máquina interiormente jamás serás un buen programador.

D

PHP es el demonio.

Que más de la mitad de las webs de internet estén escritas en PHP es la prueba de la gran conspiración urdida por el maligno.

Apartaos de PHP mientras podáis, antes de que sea demasiado tarde.

D

#2 Hay que distinguir:
- Python es un lenguaje "educativo", junto a Modula, Pascal y alguno más. Te obligan a hacer las cosas bien sí o sí.
- PHP, Perl, C, etc. son en cambio lenguajes "productivos", tienes que venir aprendido de casa o te la pegas de lleno.

Y luego hay cosas como Java, que intentan ser uno y otro, pero que al final acaban siendo más tocapelotas que otra cosa, y cosas como Visual Basic, que no son ni uno ni otro (fuego, mátalo con fuego).

d

#111 PHP es malo, punto, está mal diseñado, está mal implementado,

M

#28 ¿Que complicación ves en C++? http://en.wikipedia.org/wiki/C%2B%2B_classes

Yo aprendi POO con Java y cuando vi C++ no tuve ningun problema en pasarme a C++, yo veo una sintaxis muy clara y sencilla. Aparte de tener la potencia de C y la potencia de orientacion a objetos...

D

#56 no te digo que no... infinitamente menos que en php, pero no te digo que no, y seguro que es un gran lenguaje aunque he visto videos comparando los 2 lenguajes y criticando php (nunca he visto el video contrario) y las criticas eran absurdas, normalmente pq el que programaba en python no conocia bien php...
Si mucha gente dice que phyton mola, que ruby mola, que node.js mola... pero aun no he encontrado motivos suficientes para pasarme.
A lo mejor con node.js con eso de que es multihilo se podria jugar bastante para por ej. lo de domotica que tengo que hacer priulas acojonantes en php
Y eso que antiguamente lo hacia muchas partes en shellscript pero al final estoy pasando todo el codigo a php....

D

#65 Ya pero si tu te vas a PHP y puedes hacer esto:

$a = 5;
$b = "Hola";

Es más difícil explicarle el sentido de tipo de datos a alguien y porque necesita hacer conversión de tipos que si empezó con C y aprendió que si quería crear una variable de entero debía hacer:

int a = 5;

Las dos variables a son de tipo entero, los dos lo sabemos, un novato no puede captar esas abstracciones en PHP y no entender la diferencia.

D

#31 yo uso el sistema con procesadores x86 y con arm y con distribuciones variopintas y todos tienen php es decir que no he encontrado sistemas donde no pueda hacer funcionar php bien integrado con linux, si puedo ejecutar linux en un aparato puedo ejecutar php... no se si te refieres a eso... ej: portatiles y pcs x86, con arm cubox, raspberri py, udooo

habitante5079

#c-25" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/2177644/order/25">#25 Hay más alternativas que C++ como lenguaje orientado a objetos con compiladores muy trabajados, está el tan olvidado Eiffel, un lenguaje muy completo y elegante y con excelentes compiladores (pocos eso sí).
Luego C# es un gran lenguaje pero la falta de compiladores optimizados a lenguaje máquina lo limitan a desarrollos dónde la velocidad ni el consumo de memoria sean críticos.
Me ha gustado lo que ha dicho sobre las estructuras algorítmicas básicas, son esenciales y ayudan a mantener un código coherente y fácil de leer.
Con lo único que jamás estaré de acuerdo es con lo que dice de Javascript, con los años le he cojido manía pero siempre me ha parecido un lenguaje de script extraordinariamente malo.
Hace años tuve que trabajar con Smalltalk en VisualAge y le acabé cojiendo cariño por la facilidad que tenía para manipular datos.

chepas08

Al final esto de comparar lenguajes en sí tiene su gracia, pero es bastante mas importante todo el "contexto" que rodea una plataforma. El IDE/Debugger, Frameworks y librerías. Vamos ya puede ser la ostia el lenguaje que como no tenga un IDE que vaya bien no lo pienso usar en el mundo real, y si luego tienes que picarte una librería para generar pdfs ya ni te cuento..

Yo puedo comparar trabajar profesionalmente con Java y Php con Eclipse y cada uno tienes sus ventajas y desventajas. Prefiero Java como lenguaje, debo ser cuadriculado, me gustan los lenguajes tipados, si tengo un array con peras no quiero meter manzanas, luego el open call hierarchy funciona de lujo y se donde se usa esa función. Pero el no tener que re-arrancar el maldito servidor cada vez que hago un cambio en una clase me hace querer a PHP..

kaoD

#142 para aclarar algo más mi posición (maldito tiempo de edición lol) cuando digo "saber un lenguaje" distingo entre "saber" y "conocer".

Saber ASM es saber TODAS las instrucciones (o la mayoría) de tu arquitectura de pe a pa, no conocer un poco cómo funciona. Por ejemplo, ¿qué hace PAVGW en SSE de x86? Yo ni puta idea e imagino que tú tampoco, así que ninguno de los dos realmente sabemos ASM 686.

Del mismo modo que saber C y aprender a crear clases NO es saber C++.

frankiegth

Para #161. '...pero pequeño, sólo 2200-2500 líneas de código...'

Y es que cuesta. Al inicio y durante el proceso de aprendizaje Ansi C es duro, pero fue fantástico sentirse tan cerca del metal, de la máquina.

d

#195 Ese artículo en la mayoría de los casos lo que viene a decir es que si no lees la documentación, te puedes encontrar con "sorpresas". Pero dichas "sorpresas" lo que vienen a decir es que la lógica de uno no tiene porque ser la válida.

Por ejemplo:
array_search, strpos, and similar functions return 0 if they find the needle at position zero, but false if they don’t find it at all.
...
In C, functions like strpos return -1 if the item isn’t found. If you don’t check for that case and try to use that as an index, you’ll hit junk memory and your program will blow up. (Probably. It’s C. Who the fuck knows. I’m sure there are tools for this, at least.)


Si, es un fastidio que no pueda venir directamente de C y ponerme a programar con PHP. Pero personalmente, si no se encuentra algo, prefiero que se me devuelva una excepción, o de no ser así, un tipo que sea completamente distinto al resultado que espero cuando la función opera correctamente.
Si no fuera porque en C las funciones tienen que devolver siempre el mismo tipo si no quieres trabajar con void *, seguramente utilizarían un formato similar a PHP, o eso creo.
En fin, que comparar estrictamente (===) con false en lugar de con -1 me parece más elegante.

[] cannot slice; it only retrieves individual elements.
Si, es una pena. Pero eso el único lenguaje que lo soporta tal cual es Python, de los que yo conozca. ¿Son los demás lenguajes una basura por no tenerlo?
Para los que no tenemos la piel tan fina: http://es1.php.net/array_slice

En otro casos, podemos ver que hablar es gratis, y no hace falta investigar lo más mínimo:
include() and friends are basically C’s #include: they dump another source file into yours. There is no module system, even for PHP code.

Supongamos que tenemos un fichero entero.php con el siguiente contenido "

E

#c-198" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/2177644/order/198">#198 Anda, no esperaba una respuesta así, y como ves me conecto muy de vez en cuando.

Lo que es aprender a programar puede hacerse con cualquier lenguaje, ahora, para hacerlo bien como dice el título, es mejor conocer las bases, la barrabasada que mencioné antes fue en un programa "profesional", así que para simplemente trabajar se ve que llega.

Con Python tengo poco contacto, pero he visto de todo, gente a la que le ha ayudado por su rigidez estructural y gente que lo detesta y aborrece por la falta de identidad y flexibilidad. Es un lenguaje interesante pero supongo que se aprende lo mismo que con Java.

Yo recomendaría empezar por los que son la base de todo lo que hay ahora en cuanto a lenguajes de programación, los tradicionales, tipados, declarativos, incluso sin orientación a objetos... Fortran es un poco suyo y tiene peculiaridades propias, COBOL era de enfoque muy específico y está en proceso de extinción (Alguien me comería por decir eso ), así que me quedaría con C o Pascal, Pascal no deja de ser un C azucarado, sustituyendo las llaves por "END" y "BEGIN", añadiendo una palabra para identificar las funciones... en el fondo, la mayoría de lenguajes que han ido surgiendo copian sintaxis e ideas de C (C también copió en su día, pero sus precursores están caput), añadiendo luego sus dulzores propios.

Ahora, entiendo que es mucho más frustrante que Java o C# (o PHP o JavaScript...) que llenas una pantalla y ya puedes ver resultados rápidamente. También es más gratificante cuando ves resultados por eso mismo, claro que eso ya es personal y tiene que gustarte esto de controlar al ordenador.

Yo diría que cosas que hay que hacer, ya en cualquier lenguaje, pero es que hacerlas en Java es un poco "tontería" y no se aprecia tan bien el resultado son:
- Implementa por tu cuenta (y ayuda de tutoriales para saber cómo son) tipos de dato avanzados: listas enlazadas, arrays con memoria dinámica (de varias dimensiones a poder ser), diccionarios. Si te gusta hasta puedes implementar objetos por tu cuenta Esto ayuda luego a pelearse con lenguajes no tipados o de tipado no explícito, saber cómo lo hacen es muy útil cuando no hacen lo que tu esperabas.
- Hacer aritmética de punteros y casting, por eso mi lenguaje predilecto para empezar es C, te deja ver todo esto claramente, y que no casque. Algunos te dirán que eso no lo vas a volver a tocar en la vida (ya lo han dicho), es cierto si acabas en la típica consultora haciendo webs en .NET o Java. Pero estamos hablando de ser bueno en lo nuestro, y si un día ofrecen 100K por meterle mano a un driver, poder decir "pallá que me voy, vamos que lo parto".
- Ver ensamblador, una tarde o dos basta, no se trata de que aprendas a programar ensamblador si no de que sepas como es y veas qué tipo de instrucciones hace una CPU realmente. Un tutorial, ves un par de ejemplos, flipas en colores intentando entender qué diablos hace y ya Así se aprecia también la diferencia entre trabajar en C y trabajar en Java, cuánto más cerca estás de la máquina con el primero y cuántas cosas suceden por cada línea que pones en el segundo.

Si te llama Pascal, que se supone que está muerto desde hace años pero ahí sigue, no uses el GNU Pascal, usa el FreePascal, que además tiene un entorno de desarrollo de aplicaciones gráficas imitando a Dolphin: Lazarus. Pese a lo que digan, está vivo y coleando y sigue en desarrollo, es un lenguaje muy válido, denostado por su intención original de ser de aprendizaje y por la presencia de nuevos lenguajes más simplificados (Es decir, quiso ser simple, pero su simplicidad quedó obsoleta por otros lenguajes que ahora se consideran profesionales y por tanto han calado más)

Para evitar la frustración también recomendaría tocar programas ya hechos, hacerles pequeños cambios, yo que se, te descargas el código fuente de gedit (o notepad++ si usas Windows) y cada vez que escriban tu nombre que lo subraye o remarque. A mi me pasa que al principio como es mucho código y todo nuevo me saturo, pero es muy útil para el trabajo real luego cuando tienes que retomar la aplicación de otro, y para ver distintas formas de estructurar y distintas etiquetas (códigos de conducta) programando. Muchas veces cada lenguaje tiene las suyas, que si las variables se declaran en un sitio, que si se pone un prefijo en función del tipo...

Y nada, podría escribir un libro así que lo dejo por aquí, evidentemente son todo mis opiniones y no tienen garantía ninguna de ser correctas.

Ah, y luego te metes a un lenguaje con tipado dinámico y flipas ¿PHP? Magia diría más bien. Lo que antes parecía tan normal ahora entiendes todo lo que implica y el trabajo que tiene por debajo.

Y si tienes narices, y te gusta mucho esto, luego puedes darle a caml u otro lenguaje funcional, especialmente si te gustan las matemáticas, así por cambiar un poco de paradigmas y no estar siempre con las mismas estructuras. Eso si que es magia. Es una forma completamente distinta de diseñar el algoritmo.

También es interesante un lenguaje orientado a objetos sin recolector de basura como Java (p.ej: C++) si algún día te chocas con problemas del recolector, aplicaciones que requieran alto rendimiento y mover muchos datos, o programar sin recolector de basura directamente... pues varios golpes de frente que te ahorras.

Como ves, al final, mi recomendación es empezar de abajo con C e ir subiendo para probar un poco de todo Además si un día te dejan elegir puedes elegir el mejor para el caso concreto.

musg0

#203 Quizás con algo tipo Scala o Clojure veamos programación funcional en las empresas. Se supone que con el paradigma funcional es más fácil paralelizar. Quizás por ahí sería una punta de lanza, y aunque no se use para un proyecto completo, quizás se pueda usar en partes concretas o para implementar algoritmos del núcleo de un desarrollo.
Al estar basados en la máquina virtual de Java, muchas empresas pueden seguir aprovechando lo que ya tienen y no partir de cero.

Por otro lado en juegos casi todos tienen un lenguaje de scripting para la IA de los personajes y ahí también parece que podría ser útil un lenguaje funcional, porque crearía un código compacto y relativamente ligero.

D

#30 no tienes por qué irte a Haskell o Clojure, que son muy duros, puedes usar Scala como alternativa intermedia. Lo digo más que nada porque entrar de golpe en la programación funcional viniendo de imperativa, estructuras de datos mutables y POO se hace cuesta arriba (monads, je).

Respecto a Go, obviamente te voy a decir otra vez que prefiero Scala + Akka.

Estoy de acuerdo en lo de empezar por C (o ensamblador) y subir para arriba absorbiendo las abstracciones de cada generación de lenguajes. Y también con lo de estudiar estructuras de datos, algoritmos y las matemáticas necesarias para calcular complejidades. Aunque el resto son un poco consejos de perogrullo.

D

#99 Cualquiera que lleve un tiempo trabajando con PHP sabe que:
- PHP es un basurero (*)
- Puedes pillar módulos, paquetes, etc. de aquí y de allá, y en una tarde montarte una aplicación de 100.000 líneas.
- Sigue siendo mejor que Perl.

*: y eso que no has comentado el basurero de las interfaces, los fallos de punteros como en foreach, y detalles parecidos.

outofmemory

Yo resumiría todos los consejos en uno: "cada vez que toques algo, no solo tiene que funcionar, sino que lo tienes que entender y no aumentar la complejidad más de lo necesario". Cuando llegas al punto que implementar algo en tu programa es más complicado que el problema que quieres resolver, lo estás haciendo mal

D

#50 Hablo de aprender, no digo que los punteros sean buenos manejarlos para usarlos siempre (se usan cuando se tienen que usar) digo que se debe aprender como funciona C antes que empezar con las abstracciones de otros lenguajes.

Dices que apra ser un buen programador hay que "Saber algoritmia" y digo yo que para hacer buenos y eficientes algoritmos necesitarás saber como funciona la máquina a bajo nivel para poder optimizar el algoritmo.

D

#75 "Si empezamos con el "mejor no enseñar lo mágico" empiezas a bajar por una pendiente resbaladiza y les acabas enseñando física y diseño de chips."

Y es lo que hacen en ingeniería informática lol

n

#38 No puedo estar más de acuerdo contigo.

La condena que se hace a PHP en este articulo por el Doctor, es como tirarse de cabeza a una piscina vacía. Creo que lo más importante es, antes de ponerse manos a la obra, buscar, comparar y tomar la mejor decisión de usar las librerías/lenguajes apropiado para el problema que tenemos, ahorrando lo máximo en costes y esfuerzo. Para ello suelo buscar por la red y hacer caso omiso a este tipo de condenas personales que se hacen sin aportar ningún dato objetivo. Lo mismo con XML/JSON, me encanta JSON, pero no ofrece la misma robustez que un XML validado con un DTD. no? es un ejemplo.
Tengo experiencia y multitud de proyectos desarrollados en PHP, MySql, javascript que dejarían a menéame en la lógica de un hello world B) :P. Por el lado de procesado/servidor me encanta Perl, la potencia de las bases de datos orientadas a columnas, estudio y selección de algoritmos, procedimientos almacenados, programación del cron de linux, la escalabilidad de las máquinas virtuales, y, sobre todo, la multitud de soluciones libres que disponemos.
Hoy en día no nocesitamos ser Oracle, Microsoft o SAP para hacer algo muy muy grande. Con conocimiento de lo que hay disponible y perdiendo el miedo, eres capaz de hacer casi cualquier cosa.
PD: Me esperaba un articulo que algo sobre buenas practicas, código limpio, control de versiones, entornos colaborativos, etc. En fín, decepción

sleep_timer

Poner nombres de variables indentificables, como algunas grandes consultoras obligan a sus picateclas:
XJP005AH116, por ejemplo, que se ve claramente que es para almacenar el apellido.

D

#41 ya te digo en todos los cacharros que te le listado ej: portatiles y pcs x86, con arm cubox, raspberri py, udooo
he podido funcionar perfecto con php, normalmente van en sus repositorios... solo tengo que... yum install php o sudo apt-get install php etc... no tengo ni que bajarme el codigo y compilarlo

Y como framework uso gedit

D

#75 ya no me acuerdo de todo eso, me he hecho un choni de la programación con php

D

Los libros sobre algoritmos aue recomidnda gallir estan en ingles.

Aqui va la heregia, ¿alguno reclmendable y mas o menos basico en español?

No me importa tragarme documentacion o ejemplos en ingles pero ponerse con algo asi sin base alguna, si es en tu lengua materna mucho mejor.

Yo es que soy un negado en matematicas, y aunque para muchos programas no me ha hecho falta para otroa si es muy necesario( ya de paso cualquier cosa relacionada con matematicas para tontos aplicables genial)


Por cierto yo creo que se le tiene tirria a php porque cualquiera programa en php y ademas es un lenguaje muy extendido

chepas08

#106 Eso es cierto, desde que programo en PHP pienso menos, busco en google y acabo en stackoverflow.

chepas08

#125 126 comentarios y sólo uno rajando de Javascript? Donde iremos a parar..

musg0

#47 Hice un curso de programación básica en Coursera porque lo hacían en Racket y me pareció muy cómodo para aprender programación funcional.

El lenguaje tiene niveles y puedes empezar por lo más básico y luego ir subiendo de complejidad. Además puedes usar primitivas de dibujo directamente como tipos de datos lo que hace que sea más entretenido. Me dió la sensación de ser un "Logo" pero en funcional.

Lo malo es que fuera del ámbito del apredizaje no parece que haya proyectos complejos hechos en Racket y se queda como un mero entretenimiento para pasar luego a lenguajes aparentemente menos de juguete.

D

Y quizá no hubiese sido mejor hacer un articulo que tropecientos twitts? quisir cada cosa sirve pa lo que sirve, twitter pa una cosa y los artículos pa otra.

gallir

#160 Varias preguntas:

1. ¿Sabes C? Si es así, ¿para qué, si no hace falta?

2. Java y su entorno de programación está diseñado para evitar los errores estúpidos de programadores, que me pases una práctica (que son programas pequeños) en Java no demuestra nada, mis alumnos también las tienen desde primero y no tienen idea de programar con punteros, ni hacer debug si no tienen el IDE que los haga.

3. Pásame una práctica más o menos compleja en C (por ejemplo mis alumnos de SO2 hace un sistema de ficheros completo, pero pequeño, sólo 2200-2500 líneas de código, y les cuesta mucho) y podré evaluar mejor tus conocimientos y buena programación. ¿Lo espero? gallir en gmail.com.

gallir

#163 No puedo publicar código que no es mío, y mucho menos si es de alumnos. Pero aquí tienes la guía de desarrollo por semanas para el sistema de ficheros (es un copy&paste del campus virtual, el formato queda una mierda):

https://dl.dropboxusercontent.com/u/13267747/so2-guia.odt

Patxi_

#91 ¿Que Composer es mejor que los "gestores de paquetes" de Python?

Patxi_

#86 vamos, que han hecho un

gcc python.c -O php

Patxi_

#183 Si tampoco digo lo contrario, simplemente que yo no suelo tener problemas con pip, aunque no lo he probado mucho bajo Windows. Y sin embargo Composer tiene más pinta de "inacabado" cuando lo he usado.

D

#29 Yo no usaría PHP en sistemas...

Por mantener la compatibilidad y demás. Y depender de un intérprete que no forma base del sistema.

Perl sería mas correcto. Está en todas partes y forma parte de la base de todos los Unix.

D

#9 Jojojo ¡queremos foto! lol

a

Para programar bien lo que hay que hacer es practicar, practicar y practicar. Como toda actividad compleja requiere años y años de practica hasta que se va desarrollando un nivel aceptable (la famosa teoría de las 10.000 horas).

Muy importante también es no practicar siempre sólo, practicar con otros, sentarse con otros programadores a resolver un problema, aprender como otros afrontan los problemas y como van desarrollando las soluciones, no sólo aprender del resultado final sino sentarse con otros y aprender el proceso para alcanzar esos resultados. Participar de comunidades de desarrollo, participar en proyectos open source ayuda en este objetivo.

Y leer, leer y leer buenos libros sobre programación, y por supuesto, no ser tan idiotas de caer en fanatismos y flames ridículos y meter en nuestra caja de herramientas todo lo que pueda ser de utilidad.

d

#151 Si el motor de plantillas en cuestión, implementa sistemas de caché, implementan funciones que facilitan el desarrollo de las mismas y que permiten que se el diseño de plantillas se aleje de la programación pura y dura y se centre más en el desarrollo de las plantillas propiamente, puede que no lo sea tanto.

1 2 3