PDA

Ver la Versión Completa : En que programar?


maxi915
19-09-2012, 04:10:22
Hola, soy estudiante de analista de sistemas, estoy en segundo año, me falta un año para terminar.
Actualmente estoy programando todo en delphi, y muy poco de base de datos, puros DER hacemos en clase.

Les queria hacer una consulta, hoy estube en una libreria, y vi un libro de User sobre Java, al lado uno de C++, otro de php, MySql, y alguno mas que no recuerdo, me llamo mucho la atencion el de java porque es de lo que todo el mundo habla sobre programar, pero me gustaria saber las diferencias entre cada uno de estos lenguajes, y para que conviene cada uno, estoy en una etapa de que nose bien lo que quiero programar, pero lo que si sé es que kiero programar.

Por mi carrera solo vimos delphi hasta ahora, nose que veremos en tercer año, pero por si acaso algo de esto queda afuera del temario, me gustaria ir conociendolo y aprendiendo.

Me gustaria comprarme un libro de estos o similar y empezar a aprender y descubrir de que se trata, pero el tema es que nose bien la diferencia entre ellos.
Hablan de VB.net, VB, php, intregrado con MYsql, por otro lado SQL solo.

cualquier ayuda es bienvenida, pero estoy seguro que me van a lograr ayudar porque hasta ahora no me han defraudado, un lujo el foro!!!!

muchas gracias!! y disculpe mi ignorancia ;)

maxi915
19-09-2012, 04:12:57
JavaScript me quedo sin nombrar, hay muchos nombres raros!

dec
19-09-2012, 04:53:15
Hola,

¡No te conformes con un libro! Ni tampoco con un lenguaje. :)

mamcx
19-09-2012, 05:31:02
En terminos generales, es bueno aprender mas de un language (de hecho diria que es fundamental para volverse buen programador).

Pero es importante saber mezclarlos. No tiene mucha gracia aprender Java y C# (muy parecidos). Es mejor aprender lenguajes opuestos, o que te introduzcan a formas muy diferentes de hacer las cosas.

Por ejemplo, luego de usar Delphi, empeze con python: http://www.python.org/. Delphi y python son muy diferentes, pero complementarios.

Con Delphi, aprendes mucho sobre estructuras estaticas, la importancia de predefinir todo y de usar lenguajes estaticos y compilados, ademas de RAD. Python es inverso: Es dinamico, es scripting, es definir por codigo y no por IDE.

Otros combos interesantes para combinar con Delphi:

Haskell: http://learnyouahaskell.com/

Te quita el concepto de la programacion OO y te introduce a su opuesto natural: Programacion funcional

C# o Java: Para conseguir un trabajo

Ruby: Metaprogramacion y magia. El opuesto en estilo de python, tirando mas a lenguaje funcional. Muy popular entre desarrolladores web

Go (http://golang.org/): Programacion multi-hilos, mas simple.

------
Pero es ideal saber manejar bien uno primero antes de aventurarse a aprender los demas. Lo que aprendes en la U tiende a ser una muy escueta introduccion a la programacion, y hasta que no desarrolles software no vas a enfrentarte a los desafios necesarios que construiran la experiencia que necesitas para poder realmente decir que sabes programar.

Asi que yo empezaria por saber a donde te quieres enfocar, y un proyecto X en concreto. Luego ejecutarlo y terminarlo.

roman
19-09-2012, 15:43:55
C# o Java: Para conseguir un trabajo


:D

¿De plano es su única virtud?

// Saludos

Casimiro Notevi
19-09-2012, 16:16:55
Esa ha sido buenísima :D:D:D

roman
19-09-2012, 16:56:24
Otros combos interesantes para combinar con Delphi:

Haskell: http://learnyouahaskell.com/

Te quita el concepto de la programacion OO y te introduce a su opuesto natural: Programacion funcional


Y esto, ¿no es como un retroceso? ¿De qué va este haskell? ¿Es similar a lisp? ¿En qué áreas se usa?

// Saludos

mamcx
19-09-2012, 19:03:27
Y esto, ¿no es como un retroceso? ¿De qué va este haskell? ¿Es similar a lisp? ¿En qué áreas se usa?

// Saludos

Retroceso en que?

Algo que me tomo tiempo entender es que no existe una linea ascendete tipo:

Programacion Imperativa < Estructural < Objetos

Sino familias de lenguajes. Por lo tanto, no hay retroceso en pasar de una familia a otra (algo que hacemos todo el tiempo, por ejemplo al usar un lenguaje declarativo como SQL o HTML).

La programacion funcional es la OPUESTA a la orientada a objetos. En OO se tiende a enfatizar todo en el sustantivo, mientras en la funcional en el paso de datos.

La primera vez que entendi la diferencia fue leyendo:

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

P.D: Al igual que todo "estilo", la programacion funcional puede ser incorporada en otros lenguajes que son OO, y la OO se puede introducir en otros lenguajes no OO (como por ejemplo, cuando se simular OO en C).

Esto significa que no hay que sacrificar -del todo- la herramienta que conozco ahora, por una totalmente diferente.

Un ejemplo simple, en python (python es multi-paradigma (http://docs.python.org/howto/functional.html): OO, procedural, funcional, imperativo):

Tradicional, imperativo (con efectos colaterales):

amigos = ['a','b','c']

amigos.sort()

for amigo in amigos:
print amigo.upper()


Funcional (sin efectos colaterales):

amigos = ['a','b','c']

[amigo.upper() for amigo in sorted(amigos)]


Una buena discusion de cuando se usa un estilo u otro:
http://stackoverflow.com/questions/2078978/functional-programming-vs-object-oriented-programming

La programacion funcional ha sido casi siempre un "nicho" oscuro, ppalmente porque sus proponentes son muy de la academia y meten una terminologia y casos de usos muy cienti/matematico/esoterico que es dificil de resonar con el programador promedio, pero ultimamente sus conceptos mas utiles se han ido pegando en varios lenguajes. Por ejemplo:

Soporte a Closure (http://en.wikipedia.org/wiki/Closure_(computer_science)) y funciones de primero orden

Uso de funciones anonimas (http://en.wikipedia.org/wiki/Anonymous_function)/ lambdas

Tambien han ido surgiendo lenguajes como F#, Scala, Clojure que tiene un punto de vista mas "normal" de la programacion funcional y que como corren sobre un runtime como .NET/Java permiten importar codigo OO.

Julián
19-09-2012, 19:18:15
amigos = ['a','b','c']

amigos.sort()

for amigo in amigos:
print amigo.upper()
Funcional (sin efectos colaterales):

amigos = ['a','b','c']

[amigo.upper() for amigo in sorted(amigos)]



Y ¿Cuales son eso efectos colaterales?
Y por cierto, el segundo ejemplo parece mucho mas retorcido, en el peor sentido, que el de php.

Un saludo!

roman
19-09-2012, 19:32:57
Y por cierto, el segundo ejemplo parece mucho mas retorcido, en el peor sentido, que el de php.


Me parece que ambos ejemplos están en python.

// Saludos

maxi915
19-09-2012, 20:13:43
ajam, todo muy bien, pero sigo sin saber las diferencias claves en los lenguajes ..muy buenos aportes de todas formas

mamcx
19-09-2012, 20:29:26
Y ¿Cuales son eso efectos colaterales?


http://docs.python.org/howto/functional.html

In a functional program, input flows through a set of functions. Each function operates on its input and produces some output. Functional style discourages functions with side effects that modify internal state (http://en.wikipedia.org/wiki/Side_effect_(computer_science)) or make other changes that aren’t visible in the function’s return value. Functions that have no side effects at all are called purely functional. Avoiding side effects means not using data structures that get updated as a program runs; every function’s output must only depend on its input.


El efecto colateral es este: amigos.sort()

Supongamos que el codigo que puse (ambos son python, pongo etiqueta PHP por los colores, ya que no hay para python) fuera una funcion:


def listarAmigos(amigos):
amigos.sort()

for amigo in amigos:
yield amigo.upper()


amigos = ['b','a','c']

print list(listarAmigos(amigos))
>> RESULTADO: ['A', 'B', 'C']
print amigos
>> RESULTADO: ['a', 'b', 'c']


Como ves, al invocar listarAmigos ocurrio un efecto colateral: La funcion altero los datos/objetos.

En la programacion funcional se busca que con la MISMA entrada ocurra EXACTAMENTE, SIEMPRE, la MISMA salida. Esto ayuda a que el programa sea mas confiable, correcto y sin sorpresas inesperadas.

O en otras palabras, se busca la inmutabilidad de los datos, y se prefiere retornar copias nuevas de los datos transformadas por funciones.

En forma funcional:


def listarAmigos(amigos):
for amigo in sorted(amigos):
yield amigo.upper()


amigos = ['b','a','c']

print list(listarAmigos(amigos))
>> RESULTADO: ['A', 'B', 'C']
print amigos
>> RESULTADO: ['b', 'a', 'c']


No se altero la estructura inicial (amigos).

Los efectos colaterales son causas de muchos errores y dificultad en depurar los programas, porque en cualquier momento, una estructura cambia su significado e informacion al ir pasando de un lado al otro, y el manejo del estado se debe chequear manualmente (recordar que si paso un objeto mutable lo que envie me puede devolver algo inesperado).


Functional programming can be considered the opposite of object-oriented programming. Objects are little capsules containing some internal state along with a collection of method calls that let you modify this state, and programs consist of making the right set of state changes. Functional programming wants to avoid state changes as much as possible and works with data flowing between functions. In Python you might combine the two approaches by writing functions that take and return instances representing objects in your application (e-mail messages, transactions, etc.).

Por lo tanto, se puede decir que OO es manipular maquinas de estado, donde cada "palanca" y "boton" representa un conjunto de datos y operaciones diferentes, mientras en funcional, cada funcion representa una transformacion de datos.

En OO se puede llegar a cosas raras como:


class BD:
conexion = ...
esActivo = false

def open(self):
self.conexion = Conexion()
self.esActivo = true

def consulta(self, sql):
#Esto es un error en potencia. El significado
#de consulta depende de que previamente se abra
#la conexion! Se debe colocar guardas
return self.conexion.ExeSql(sql)
#Ok, una guarda
if self.esActivo:
#El colocar una guarda NO garantiza la ejecucion! El estado esta desconectado de los datos!
return self.conexion.ExeSql(sql)

bd = new BD()

bd.open()

#ERROR. No hay garantia del manejo de estado, sin
#programacion cuidadosa
bd.conexion = None

print bd.consulta("SELECT 1")


Este es un ejemplo de como los estados con efectos colaterales complican la programacion y generan potenciales errores.