martes, 5 de octubre de 2010

Scala Solutions


El 4 de octubre Martin Odersky, creador del lenguaje Scala, anunció la fundación de Scala Solutions. "Hemos fundado Scala Solutions para proveer las herramientas y servicios avanzados que los desarrolladores de Scala necesitan para hacer realidad la creación de aplicaciones de misión crítica, un desarrollo rápido y un mantenimiento fácil".

Compañías como Twitter, LinkedIn, Foursquare, The Guardian, Xerox, Sony, Siemens, Novell y EDF utilizan ya Scala para implementar partes críticas de su negocio. Scala Solutions proveerá herramientas y servicios que facilitarán el uso de Scala para crear y mantener aplicaciones de negocio.

Este es un paso fundamental para la expansión y la adopción del lenguaje de forma masiva. Sus capacidades están fuera de toda duda, sólo quedaba tener una corporación detrás que diera las máximas garantías para que las empresas se embarquen en desarrollar utilizando toda su potencia.

Scala Solutions







El 4 de octubre Martin Odersky, creador del lenguaje Scala, anunció la fundación de Scala Solutions. "Hemos fundado Scala Solutions para proveer las herramientas y servicios avanzados que los desarrolladores de Scala necesitan para hacer realidad la creación de aplicaciones de misión crítica, un desarrollo rápido y un mantenimiento fácil".

Compañías como Twitter, LinkedIn, Foursquare, The Guardian, Xerox, Sony, Siemens, Novell y EDF utilizan ya Scala para implementar partes críticas de su negocio. Scala Solutions proveerá herramientas y servicios que facilitarán el uso de Scala para crear y mantener aplicaciones de negocio.

Este es un paso fundamental para la expansión y la adopción del lenguaje de forma masiva. Sus capacidades están fuera de toda duda, sólo quedaba tener una corporación detrás que diera las máximas garantías para que las empresas se embarquen en desarrollar utilizando toda su potencia.

jueves, 23 de septiembre de 2010

Sobre la muerte de Java


Mucho se ha elucubrado sobre la muerte de Java, sobre los nuevos lenguajes que superan con creces sus características, la compra de Sun...

Java, hoy por hoy, es el líder indiscutible en el desarrollo de aplicaciones empresariales, esto es innegable, y lo seguirá siendo por mucho tiempo. Cuenta con el mayor pool de desarrolladores, el mayor ecosistema que ha tenido ningún lenguaje jamás y la empresa está de su lado, muchos productos han evolucionado hacia sus tecnologías.

Si analizamos por ejemplo el lenguaje C que lleva con nosotros desde 1972 y sus estadísticas de uso según Tiobe, está en segundo lugar con un 17,147%, poco detrás de Java. Su evolución, C++ se encuentra en tercer lugar con un 9,81%.

Java podrá gustar más o menos a la gente, pero el éxito de un lenguaje no depende sólo de sus características, si no estaríamos programando todos en LISP desde hace mucho tiempo. Depende en su mayor medida de las relaciones entre empresas, software opensource, productos que lo utilicen... El lenguaje que sustituya a Java probablemente sea una nueva versión del mismo Java ampliada soportando y simplificando lo que actualmente Java es. Es lo que hizo Java en su momento:

1. Respetar todo lo posible la sintaxis del lenguaje precedente C/C++.
2. Simplificar la gestión de memoria, concurrencia y modelo de objetos.
3. Facilitar el desarrollo multiplataforma.

El siguiente killer language tendrá que soportar los problemas actuales:

1. Simplificar el desarrollo distribuido desde el propio lenguaje
2. Simplificar y potenciar la concurrencia.
3. Respetar todo lo anterior.

Se me viene a la cabeza ahora mismo Erlang como mayor valuarte, pero debería respetar la sintaxis y la orientación a objetos del mismo modo que lo hizo Java en su momento, el cambio drástico hacia la programación funcional es duro de asumir por el grueso de desarrolladores.

Quizá sea el propio Java el que evolucione en este sentido... el futuro nos dirá.

viernes, 13 de agosto de 2010

Oracle demanda a Google por Java en Android

Oracle ha presentado una demanda contra Google por violación de derechos de propiedad intelectual de Java en el desarrollo de la plataforma Android.

La mayor parte de los post que versan sobre este tema indican que se ha perdido el espíritu de Sun por el que Java triunfó. Pienso que ese mismo espíritu es el que le llevó a Sun a no saber rentabilizarlo y a acabar en manos de Oracle. Si por algo se caracteriza Oracle es por saber rentabilizar sus inversiones, es posible que si Java hubiera nacido en el seno de Oracle no hubiese llegado a nada, pero ahora que es la plataforma más extendida de desarrollo de aplicaciones empresariales, no se van a dejar escapar el monetizar lo que Sun no supo como manejar.

Por otro lado, uno de los mayores impulsores de Java siempre ha sido Google (GWT, Android...) ¿Apostará Google por otra plataforma que le de menos quebraderos de cabeza? Otro lenguaje que siempre ha tenido presente Google ha sido Python, muy maduro, omnipresente en Linux y con un ecosistema igual o mayor que el de Java.


miércoles, 11 de agosto de 2010

C para todos por el MIT opencourseware

Muy buen curso de C para Linux en el que se cubre desde el comienzo hasta los aspectos prácticos de programación de red, concurrente y entrada/salida asíncrona. Proporcionado por MIT opencourseware.


viernes, 28 de mayo de 2010

Competitividad en el sector TIC de servicios informáticos

A continuación voy a exponer 3 puntos que permitirían ofrecer mejores precios para que los clientes vieran viables las inversiones en nuevos servicios y que reducirían los costes significativamente, aumentando el beneficio en el sector de los servicios informáticos:

1. Opensource: Esta es la evidente y más clara, presentar una oferta en la que el cliente debe hacer un desembolso en licenciamiento en estos tiempos tira para atrás cualquier tipo de nueva implantación. De muestra, un botón, aquí podéis comprobar las tarifas que tiene Oracle.

2. Commodity Hardware: Con el desembolso que el cliente realizará en servidores de medio rango y mainframes se pueden desplegar infraestructuras basadas en commodity hardware utilizando las técnicas de computación distribuida que permitirán una mayor escalabilidad, mejor rendimiento y un descenso significativo en la inversión a realizar. Esto sólo tiene sentido si se utilizan soluciones opensource, porque el coste de licenciamiento sería desproporcionado.

3. Remote work: La oficina debe ser un centro de reunión para tratar temas concretos, con las infraestructuras de telecomunicaciones domésticas existentes actualmente los empleados pueden ejercer su trabajo desde su casa probablemente en condiciones de mayor productividad y aprovechamiento del tiempo que en la propia oficina. Este punto quizá sea el más difícil de implantar dada la cultura empresarial y laboral que existe, en la que se mide a la gente por cuando entra o cuando sale, en lugar de fijar objetivos muy concretos de cumplimiento. El ahorro de costes en emplazamientos sumados a un estricto control de los objetivos supondría también un incremento sustancial del beneficio.

jueves, 27 de mayo de 2010

Tutorial de Erlang (1) Básico


Este es el primero de una serie de guías esquemáticas que realizaré mientras me introduzco en el apasionante mundo de Erlang:




1. Funciones y módulos

Con este primer programa veremos como se desarrolla con erlang:

test1.erl:
---------------------------------------------
-module(test1).
-export([sumar/2, restar/2, factorial/1]).

% Funcion sumar
sumar(X, Y) ->
X + Y.
% Funcion restar
restar(X, Y) ->
X - Y.

% Funcion factorial
factorial(1) ->
1;
factorial(X) when X > 0 ->
X * factorial(X - 1).
---------------------------------------------


Situar el fichero test1.erl en el bin donde reside el programa erl (erl.exe en windows).

---------------------------------------------
C:\Program Files\erl5.7.5\bin>erl.exe
Eshell V5.7.5 (abort with ^G)
1> c(test1).
{ok,test1}
2> test1:sumar(3,5).
8
---------------------------------------------

Con c(test1). realizamos la compilación del módulo.


Elementos que hemos visto:

- module(test1)
Nombre del módulo. El fichero que lo contenga debe llamarse igual que el módulo con la extensión .erl. Para llamar a las funciones que exporte el módulo la sintaxis es modulo:funcion(param1, param2).

-export([sumar/2, restar/2]).
Exportación de funciones del módulo al exterior con el número de parámetros esperados

factorial
Define dos comportamientos en función del parámetro de enrada para limitar la recursividad, el ";" separa las múltiples definiciones de la misma función.

%
Comentario, acaban con el retorno de carro


2. Variables, Atomos, Tuplas y Listas


Variables
Empiezan por mayúscula, pueden asignarse, pero sólo una vez.

Atomos
Comienzan por minúscula y se reducen a un literal que podrá ser utilizado en el programa.

Tuplas:
Compone un tipo de dato mediante un número fijo de términos:
{Term1,...,TermN}
Cada término en la tupla se llama elemento. El número de elementos es el tamaño de la tupla.
Hay funciones predefinidas para manejarlas (BIFs: built-in functions).

Examples:

1> P = {adam,24,{july,29}}.
{adam,24,{july,29}}
2> element(1,P).
adam
3> element(3,P).
{july,29}
4> P2 = setelement(2,P,25).
{adam,25,{july,29}}
5> tuple_size(P).
3
6> tuple_size({}).
0

Listas:
Compone un tipo de datos mediante un número variable de términos
[Term1,...,TermN]
Cada término de la lista se llama elemento. El número de elementos es la longitud de la lista.

Examples:

37> L = [a, b, {1, 2}].
[a,b,{1,2}]
38> [H|T] = L.
[a,b,{1,2}]
39> H.
a
40> L.
[a,b,{1,2}]
41> T.
[b,{1,2}]
42> length(H).
** exception error: bad argument
in function length/1
called as length(a)
43> length(T).
2
44> length(L).
3
45> L2 = [a, b | T].
[a,b,b,{1,2}]
46> L2.
[a,b,b,{1,2}]
47> T.

test2.erl:
---------------------------------------------
-module(test2).
-export([contar_lista/1, invertir_lista/1]).

% Funcion contar_lista
contar_lista([]) ->
0;
contar_lista([H|T]) ->
1 + contar_lista(T).

% Funcion invertir_lista interfaz
invertir_lista(L) ->
invertir_lista(L, []).

% Funcion invertir_lista implementacion con variable auxiliar de arrastre
invertir_lista([H|T], Lista_Invertida) ->
invertir_lista(T, [H | Lista_Invertida]);
invertir_lista([], Lista_Invertida) ->
Lista_Invertida.
---------------------------------------------


3. Salida por el terminal


1> io:format("salida").
salidaok
2> io:format("salida~n").
salida
ok
3> io:format("salida ~w~n", [hola]).
salida hola
ok
4> io:format("salida ~w ~w ~w~n", [hola, adios, 1]).
salida hola adios 1
ok


4. Control de flujo (if/case)

test3.erl:
---------------------------------------------
-module(test3).
-export([encontrar_elemento/2, encontrar_elemento_case/2]).

% Funcion encontrar_elemento
encontrar_elemento(A, []) ->
false;
encontrar_elemento(A, [H|T]) ->
if
A == H ->
true;
% El else aqui seria true ->
A =/= H ->
encontrar_elemento(A, T)
end.
encontrar_elemento_case(A, []) ->
false;
encontrar_elemento_case(A, [H|T]) ->
case A of
H ->
true;
_Else ->
encontrar_elemento_case(A, T)
end.
---------------------------------------------

5. Expresiones


5.1. Comparación de términos

Expr1 op Expr2
op Descripción
---------------------------
== igual
/= distinto
=< menor o igual
< menor
>= mayor o igual
> mayor
=:= exactamente igual
=/= exactamente distinto


5.2. Operadores aritméticos

op Expr
Expr1 op Expr2

op Descripción Tipo de arg
-----------------------------------------------
+ operador unario + number
- operador unario - number
+ number
- number
* number
/ división en coma flotante number
bnot not unario a nivel de bit integer
div división entera integer
rem resto entero de X/Y integer
band and a nivel de bit integer
bor or a nivel de bit integer
bxor xor a nivel de bit integer
bsl desplazamiento a la izq. integer
bsr desplazamiento a la dcha. integer


5.3. Expresiones booleaneas

op Expr
Expr1 op Expr2

op Descripción
---------------------
not unario not
and and lógico
or or lógico
xor xor lógico


5.4. Expresiones (short-circuit) evaluación perezosa

Sólo se evalúa la 2 si es estrictamente necesario.

Expr1 orelse Expr2
Expr1 andalso Expr2


5.5. Operaciones sobre listas

Expr1 ++ Expr2
Concatenación de listas
1> [1,2,3]++[4,5].
[1,2,3,4,5]

Expr1 -- Expr2
Substracción, elimina la primera aparición de cada elemento de la segunda lista de la primera, opera en modo foreach
1> [1,2,3,2,1,2]--[2,1,2].
[3,1,2]


5.6. Guard Sequences (secuencias de guardia)

Una secuencia de guardia es una secuencia de guardias, separadas por punto y coma (;). La secuencia de guardia es true si al menos una de sus guardias (elementos) es true. Cuando una lo cumple, las restantes, si las hubiera, no son evaluadas:

Guard1;...;GuardK

Una guardia es una secuencia de expresiones de guardia separadas por coma (,). La guardia es true si todas las expresiones evaluadas son true

GuardExpr1,...,GuardExprN

Expresiones válidas de guardia son las siguientes:

El atom true, otras constantes (términios y variables establecidas), comparaciones de términos, expresiones aritméticas, booleanas y short-circuit, y las siguientes funciones predefinidas:

BIFs de chequeo de tipos
-------------------------
is_atom/1
is_binary/1
is_bitstring/1
is_float/1
is_function/1
is_function/2
is_integer/1
is_list/1
is_number/1
is_pid/1
is_port/1
is_record/2
is_record/3
is_reference/1
is_tuple/1

BIFs aritméticas
--------------------------
abs(Number)
bit_size(Bitstring)
byte_size(Bitstring)
element(N, Tuple)
float(Term)
hd(List)
length(List)
node()
node(Pid|Ref|Port)
round(Number)
self()
size(Tuple|Bitstring)
tl(List)
trunc(Number)
tuple_size(Tuple)


5.7. Funciones de orden superior

fun
(Pattern11,...,Pattern1N) [when GuardSeq1] ->
Body1;
...;
(PatternK1,...,PatternKN) [when GuardSeqK] ->
BodyK
end

Una función de orden superior (fun expression) empieza con la palabra reservada "fun" y acaba con la palabra reservada "end". Entre ellas aparece la declaración de la función, similar a una declaración de función estandar excepto que no aparece el nombre de la función especificado.

1> Fun1 = fun (X) -> X+1 end.
#Fun
2> Fun1(2).
3
3> Fun2 = fun (X) when X>=5 -> gt; (X) -> lt end.
#Fun
4> Fun2(7).
gt

foreach y map son dos funciones estandar que operan de este modo, la primera aplica la función a cada elemento de la lista y la segunda genera una nueva lista como resultado de aplicar la función a cada elemento de la lista.

92> Add 3 = fun(X) -> X + 3 end.
#Fun
93> lists:map(Add 3, [1,2,3]).
[4,5,6]



6. Programación concurrente


6.1. Procesos

Los procesos Erlang son como los threads pero sin datos. La función predefinida "spawn" es utilizada para crear nuevos procesos.

spawn(Módulo, Función exportada, Lista de argumentos)

Retorna el identificador del proceso Pid.

test4.erl:
--------------------------------------------
-module(test4).
-export([start/1, funcion/2]).

funcion(Palabra, Proceso) ->
io:format("~w - ~w~n", [Palabra, Proceso]).

start(0) ->
done;
start(A) ->
Pid1 = spawn(test4, funcion, [hola, A]),
io:format("Proceso ~w arrancado~n", [Pid1]),
Pid2 = spawn(test4, funcion, [adios, A]),
io:format("Proceso ~w arrancado~n", [Pid2]),
start(A - 1).
--------------------------------------------


6.2. Paso de mensajes:

--------------------------------------------
-module(test5).
-export([start/0, funcion/0]).

funcion() ->
receive Mensaje ->
io:format("Proceso recibe el mensaje: ~w~n", [Mensaje]),
funcion()
end.

1>Pid = spawn(test5, funcion, []).

2>Pid ! hola
3>Pid ! adios
--------------------------------------------

Patrón de recepción de mensajes:

receive
patron1 ->
acciones1;
patron2 ->
acciones2;
....
patronN ->
accionesN
end.

Paso de mensaje: Pid ! mensaje

self(): Función que da el Pid del proceso actual


6.3. Registrar nombres de procesos

register(pong, spawn(tut16, pong, []))

pong ! mensaje

register(Name, Pid) Asocia un átomo con un Pid
registered() Retorna una lista de nombres registrados.
whereis(Name) Retorna el Pid del nombre buscado si está registrado


miércoles, 26 de mayo de 2010

Programadores vocacionales

En las empresas de tecnología actuales hay una serie de personas, entre un 5/10% según Coding Horror que son programadores de élite. Según mi opinión este tipo de personas cumplen la mayor parte de los siguientes 10 puntos:

1. Programador
No necesitan etiquetarse de arquitectos, analistas o nada similar. Son PROGRAMADORES. Analizan, diseñan, codifican, prueban y despliegan. Concibiendo el desarrollo de software desde el sentido más amplio.

2. Generalista
Conocimiento de diferentes paradigmas y lenguajes de programación que le dan una perspectiva amplia para la conceptualización, resolución y detección de problemas. Utilizan la mejor opción para cada tarea (Best tool for the job), su perfil se lo permite. No están restringidos a la resolución de problemas en un sólo lenguaje o plataforma que limite su capacidad creativa.

3. Multiplataforma
Capacidad de manejo y administración sobre sistemas Unix y Windows. Conocimiento y administración de múltiples gestores de bases de datos. Entendimiento y configuración de elementos de red (firewalls, routers, gateways).

4. Agestión
No llevan gente, no delegan, su cometido es la resolución directa de problemas de alta complejidad.

5. Literatura
Los libros que leen se centran en temas directamente relacionados con el trabajo.

6. Autocrítica
Siempre ponen en tela de juicio su nivel de conocimiento, nunca es suficiente y hay que seguir alimentándolo. Jamás presumen de su conocimiento y no tratan a sus compañeros como si fuesen basura ignorante... este es otro perfil que veremos otro día... Al contrario que estos, suelen estar siempre dispuestos a echar un cable a quién lo necesite.

7. Autonomía
No preguntan si no es estrictamente necesario, utilizan su propio conocimiento para buscar la solución utilizando todos los medios a su alcance.

8. End2End
Conocimiento del entorno completo de despliegue. Diseñan, codidifican y prueban pensando en el entorno de producción. Son capaces de montar entornos completos desde cero, desde la instalación del sistema operativo, servidores de aplicaciones, bases de datos... lo que sea necesario.

9. Obsesión
Los problemas se convierten en retos personales que ocuparán su actividad mental hasta el momento de la resolución que es la mayor recompensa que pueden obtener.

10. Adaptación
Pueden ser productivos en nuevos entornos que desconocen completamente en menos de dos semanas, sin necesidad de formación.

La estructura de las carreras profesionales en las TIC españolas condena a este tipo de perfiles tan valiosos al ostracismo. Y sobreviven como soldados de fortuna ;-) en diferentes proyectos donde destacan por solventar marronazos de cuidado en "heroic mode" de cuando en cuando.

En otros mercados, la cosa es muy diferente, forman parte del staff de la compañía y son determinantes en el éxito de los proyectos, lanzamiento de nuevos productos e incremento sustancial de beneficios. Las compañías son conscientes de ello, son remunerados y reconocidos hasta niveles ejecutivos.

Pero aquí, donde lo que se factura es el calentamiento de silla y el reconocimiento no tiene nada que ver con los méritos, seguirán ocultos... esperando que algún día algo cambie y la profesión que tanto aman sepa reconocer y explotar su potencial.

miércoles, 5 de mayo de 2010

Bloom - Cloud programming


Cada año el MIT en su publicación Technology Review selecciona las 10 tecnologías emergentes más importantes según sus editores. Este año aparece Cloud programming basándose en los avances realizados en la Universidad de Berkeley por el grupo de Joseph Hellerstein y un nuevo lenguaje llamado Bloom.

Esperan tener una early release de la sintaxis y una beta del intérprete a finales de este año. Básicamente se trata de realizar un lenguaje centrado en el dato para simplificar la implementación de las tecnologías de computación distribuida con las que ya contamos, como: MapRedurce, HadoopFS y Paxos. Permitiendo centrarse en el problema del análisis de los datos y no en el microtratamiento de los mismos que tanta complejidad introduce en este tipo de sistemas.

Podéis leer una entrevista completa que le realizan en HPC in the Cloud

martes, 27 de abril de 2010

James Gosling se pira de Oracle

No deja claros los motivos, pero en su nuevo blog lo comunica. Sin duda es una noticia fatídica para Java, si James se va será porque no comulga con la visión estratégica que Oracle tiene pensada para Java.

No queda más que esperar, supongo que en menos de un año empezaremos a ver por donde va la cosa. Toda la suerte del mundo para James.

miércoles, 10 de febrero de 2010

Institucionalizacion en la programación


Parafraseando a Morgan Freeman en la película de "Cadena Perpetua", la institucionalización es el proceso por el cual una persona acepta su existencia en un entorno determinado y acotado. Se trata de vivir en un mundo con unas reglas determinadas y sin plantearse otras opciones, porque fuera de ese entorno no existe nada más.

Inicialmente cuando te contratan en una empresa, el proceso de selección, se basa en gran medida, en el cumplimiento de una serie de skills que aportan valor añadido a algún proceso de su negocio. Transcurrido un tiempo las personas se van institucionalizando. Es normal, pero hay que alcanzar un equilibrio y establecer unos límites que no se deben sobrepasar. Si esas fronteras son traspasadas y el valor de tu trabajo se reduce, en un alto porcentaje, al conocimiento específico de procesos, metodologías, contactos... pero solo y exclusivamente en ese entorno, tienes un problema. Las opciones de movilidad laboral son prácticamente nulas, los skills por los que entraste seguramente esten obsoletos, y conociendo esto, la capacidad de presión de los managers puede ser mucho mayor, ya que tu valor en el mercado es nulo.

Extrapolándolo al mundo de la programación, esto ocurre con los productos. En la carrera, módulo o formación que se haya tenido, la enseñanza es generalista. El aprendizaje de algoritmos, estructuras de datos, paradigmas de programación... es enfocado desde un punto de vista generalista creando perfiles abiertos y adaptables a cualquier entorno. En el mundo empresarial, la cosa cambia radicalmente cuando tienes la mala suerte de acabar especializado en un producto determinado.

En los últimos años me he encontrado con muchos perfiles para los que tiene sentido la programación dentro de un producto concreto (BPMs, CRMs, ERPs...), no saben a qué se traduce, ni donde se ejecuta, ni si hay otras opciones de hacerlo... Son analistas en el producto X. Eso sí, cuando van a realizar un despliegue y ven un petardazo java o un core de un programa C, no saben ni por donde agarrarlo. Por supuesto hay de todo, hay gente que viene del mundo generalista que se ha especializo en un determinado producto por demanda del mercado.

Si estás empezando en esto, no caigas en las garras de un producto, como dice Peter Norvig en teach yourself programming in 10 years, hay que tener una perspectiva abierta y amplia de diferentes lenguajes y paradigmas para llegar a ser un buen programador y caer en un producto de este calado cuando estás empezando puede acabar con tu crecimiento.

sábado, 6 de febrero de 2010

Estimix - ¿Cuánto vale un website?

Estimix es una web que combina información de diferentes fuentes y aplica cálculos tomando en consideración la antigüedad, estructura demográfica, origen del tráfico, popularidad en diferentes países y segmento al que van dirigidos para estimar el tráfico diario en páginas vistas y usuarios únicos. Además ofrece también la estimación del valor del website analizado.





viernes, 5 de febrero de 2010

Jonathan Schwartz deja Sun

Jonathan Schwartz CEO de Sun Microsystems anunció ayer en twitter que era su último día en Sun. Johnathan fue el impulsor de la conversión en opensource de OpenSolaris, OpenJDK, PhoneME...

¿Acabara la política de Oracle con las innovaciones que Sun ha aportado a la industria durante los últimos años? ¿Refactorizará los productos Sun al estilo Bea o Siebel? ¿Que sucederá con MySQL?

Sun ha sido de las compañías que más ha aportado a la industria informática y la noticia de la adquisición por IBM en primera instancia y, en segunda y definitva, por parte de Oracle me parecieron un barapalo para los que amamos la tecnología. Tendremos que esperar evoluciones...

Plan de estudios del charcutero


Con el Plan Bolonia y la entrada de grados de informática, se debería plantear la inclusión del Grado en Charcutería, para que estos profesionales de la gestión llegaran ya formados a la gerencia de este tipo de empresas.

Un posible plan de estudios podría ser este:

PRIMER CURSO
  • Fundamentos de la Programación: Principios mentales de un subcontratado, un Indio o un Chino.
  • Fundamentos Físicos: Aprendizaje de la anatomía de la longaniza: dos brazos, 10 dedos, una cabeza, dos ojos. Aumento de la productividad del consultor.
  • Álgebra: Cálculo de beneficio por salchicha.
  • Fundamentos de Economía y Empresa: Gestión cárnica y otra casquería
  • Matemática Discreta: Aplicación de la subida salarial.
  • Estructura de computadores: Caja, teclado, monitor y ratón
  • Análisis matemático: Excel avanzado, entendiendo el IVA.
  • Aspectos jurídicos, profesionales, éticos y sociales: Estudio de los límites en la presión aplicada sobre los recursos.
  • Programación orientada a objetos: Colocación de objetos en clientes.
  • Estructura de datos: Organización del escritorio de Windows.

SEGUNDO CURSO
  • Estadística: Extracción de gráficas a partir de excels de incurridos
  • Sistemas Operativos: Instalación de windows en la caja
  • Ingeniería del Software: El MS Project
  • Teoría de la Gestión de la Información (BD): Access avanzado
  • Algorítmica: Funciones excel
  • Teoría de los Lenguajes de Programación: El lenguaje directivo: la risa "sincera" y la palmadita en la espalda.
  • Fundamentos de Seguridad de la Información: El candado del explorer y la ocultación de la tabla de tarifas.
  • Programación Orientada a Objetos Avanzada: Referencias avanzadas, enchufe de objetos de menor perfil en puestos superiores.
  • Redes de Computadores: El cable y el router
  • Arquitectura y Diseño Software: J2EE y .NET, conocimiento del termino para contratación
  • Integración de Sistemas y Software: el webservice y el bus (del cole)

TERCER CURSO
  • Gestión de Proyectos y del Riesgo: MS Project avanzado
  • Pruebas del Software: El excel, aplicación de fondo verde, amarillo y rojo a las celdas.
  • Calidad del Software: Estudio del aguante y los límites de presión sobre un recurso

CUARTO CURSO
  • Prácticas en empresa / Optativas: Como alternar con el jefe, lenguaje avanzado y perfeccionamiento de la risa falsa.
  • Trabajo de Fin de Grado: Construcción de la tabla de carne

De esta forma tendrían un sólido conocimiento de la gestión humana y unos principios necesariamente indispensables para moverse en ese tipo de funciones. En la fotografía podemos observar tres estudiantes que se han decidido por una carrera de tipo técnico.

jueves, 4 de febrero de 2010

e-books en España

Hace unos meses me hice con un Kindle 2 y la verdad es que la experiencia de usuario es impresionante. La plataforma de venta de Amazon es una pasada y sin mediar con un PC puedes tener tu libro en unos segundos.

La pregunta es, ¿funcionaría este negocio en España?

El precio estandar por el que Amazon vende sus libros para Kindle es de 9,99$. Creo que en nuestro pais el éxito de este negocio sería bastante dudoso.

Al contrario que la música que en 3-4 minutos has podido disfrutar de una canción, un libro se tarda en leer días, dependiendo el tiempo que dispongas para ello. Según datos del 2006 de la Federación de Gremios de Editores, esto es lo que leemos:

>> "El porcentaje de lectores se sitúa en el 55,5% de la población, 21,1 millones de personas; de ellos, el 39,6% leen todos o casi todos los días y el 15,9% al menos una vez al mes"

>> "- El 28,0% lee entre 1 y 4 libros al año
- El 21,7% lee entre 5 y 12 libros al año
- El 10,1% leen más de 12 libros al año
- El 1,0% no sabe o no contesta"

Sólo un 10,1 % lee más de un libro al mes. ¿No sería mejor dar un servicio de tarifa plana de lectura y pagar a los editores/autores por descargas?. Esto acabaría con la piratería radicalmente. Nadie se va a poner a pasar pdf's de dudosa calidad a un formato epub o mobi si por un precio mensual asequible puede bajarse lo que le apetezca leer sin ninguna limitación y en formatos específicamente diseñados para su dispositivo.

Abrimos la encuesta para ver quién estaría dispuesto a pagar 9,99€ mensuales por tener acceso completo a una librería tipo Amazon.

Coders at work


Siempre me había intrigado saber como empezaron, trabajan y qué hacen actualmente algunos de los mejores programadores de todos los tiempos.

En Coders at Work, Peter Seibel nos desvela esta duda a través de entrevistas con algunos de ellos.

Personalmente me han gustado las realizadas a Peter Norvig (Director of Search Quality at Google) y el gran Ken Thompson (uno de los padres de Unix y en la actualidad también en Google integrando sistemas) con su perspectiva a bajo nivel de la vieja escuela de Ingenieros Eléctricos, que personalmente comparto (le mete caña hasta al compilador gcc).



miércoles, 3 de febrero de 2010

Frameworks de desarrollo vs DSLs

Absolutamente para todos los lenguajes de programación tenemos decenas de frameworks que realizan tal o cual tarea. En el mundo java, por ejemplo: Spring, Hibernate, iBatis, Struts, Webwork, Tapestry, JSF, GWT, Wicket...

En las ofertas de trabajo parece más importante el conocimiento de esta serie de software que la del propio lenguaje de programación sobre el que están implementados. No voy a negar que tienen su utilidad en según que situaciones.

Pero, ¿no sería mejor crear lenguajes de propósito específico (DSLs)?

Los framewoks tratan de proveer al lenguaje una abstracción para la realización de tareas complejas. Al tratarse de lenguajes de propósito general su implementación se convierte en una dura tarea, por eso los utilizamos. El precio que pagamos es una alta carga de configuración en forma de xml o anotaciones, que en ocasiones, francamente, los hace insufribles. Esto ocurre porque tratamos de modelar sobre un lenguaje de propósito general una serie de tareas para las que no ha sido concebido.



Formación - MIT / Stanford

Podemos acceder a materiales de formación de prestigiosos centros de forma completamente gratuita. A continuación listo los que más utilizo, tienen que ver con ingeniería informática, pero los podéis encontrar de muchos más temas:
En openculture tienen una lista bastante más amplia. Espero que os sean útiles.

domingo, 31 de enero de 2010

Arquitectura de software

El modelo de crecimiento profesional instaurado en España para la consultoría informática nos ha llevado a la situación actual en la que es muy difícil encontrar técnicos con experiencia. El progreso y la promoción en consultoría pasa por dedicarse a la gestión de proyectos dejando completamente de lado la carrera tecnológica.

Parece que desde hace unos años se empieza a instaurar la figura del Arquitecto, para intentar dar cordura tecnológica a verdaderas barbaridades que se observan en algunos proyectos. El problema es que este perfil tiene que ocuparlo gente con perfiles generalistas que entiendan de diferentes tecnologías para utilizar las mejores opciones en cada caso, deben entender las implicaciones que sus decisiones van a tener en la implementación.

La mayor parte de los arquitectos que me he encontrado no saben hacer ni un "hola mundo" en java, c, c++, python.... En sus tiempos a lo mejor lo hicieron en el lenguaje X, pero a día de hoy, no son capaces de hacerlo. Y esos perfiles son los que seleccionan productos carísimos para realizar tal o cual funcionalidad, para integrar este sistema con este otro... Cosas que si se tuviera un mínimo de conocimiento de programación no se atreverían a proponer por lo absurdo que resultaría.

En definitiva, al final se realiza un diseño de arquitectura que da toda la risa y que el equipo del proyecto tiene que sufrir. Elevando los costes de desarrollo y mantenimiento exponencialmente. Las direcciones de sistemas deberían empezar a contar con un staff tecnológico cualificado de nivel ejecutivo que fuera capaz de poner un poco de cordura, seleccionando gente adecuada para este tipo de puestos y auditando desde el punto de vista extrictamente tecnológico el impacto económico de las decisiones adoptadas.