Amassando ideas

Introducción

Creo que una de las formas más importantes de mejorar el mundo es aumentando el conocimiento de las verdades que gobiernan nuestra existencia. Entendiendo cómo funciona nuestro mundo (y nuestro universo) tendremos las herramientas para solucionar los problemas que lo aquejan y encontrar oportunidades para hacer de este un lugar mejor. También creo que saber la verdad, es decir, coincidir nuestras creencias con la realidad, es en sí un bien a alcanzar. Por todo eso es que en este artículo busco trazar un camino sobre el cual poder acercarnos lo más posible a la verdad.

Primero modelemos

Como soy computín, he pensado en concebir cada ser como un objeto. No me refiero a deshumanizar a la gente, sino a usar los principios de la Programación Orientada a Objetos. Cada objeto tiene un conjunto de atributos y valores asociados a esos atributos. Por ejemplo, agarremos una persona adulta ordinaria de nuestro tiempo y país. Esta persona:

  • Nombre: Juan Gutiérrez
  • Edad: 38
  • País: Chile
  • Previsión de salud: Fonasa
  • etc
  • etc
  • etc

En este caso Nombre sería un atributo, y Juan Gutiérrez sería el valor asociado a dicho atributo.

También podemos usar un modelo inspirado en el realismo aristotélico, en el que cada ser es una substancia con esencia y accidentes. Cada atributo sería ya sea parte de la esencia o de los accidentes, pero no en ambos.

Personalmente pienso que debemos tener una consideración por todos los seres conscientes, es decir, aquellos que pueden pensar sobre si mismos, reflexionar sobre su propia existencia. No tienen que ser humanos necesariamente. El ideal es que todos ellos encuentran las respuestas a todas las preguntas universales. Veamos a qué me refiero con ésto.

Con preguntas universales, me refiero a las preguntas que todo el mundo puede hacerse. Las preguntas estereotípicas como ¿Quién soy?, ¿De dónde vengo?, ¿Para dónde voy? son ejemplos clásicos de preguntas universales, pero también pueden haber preguntas menos conocidas, tal como “¿Cómo garantizo mi supervivencia el mayor tiempo posible?” Esta pregunta tan cotidiana también es universal pues todos los seres vivos buscan sobrevivir.

¿Debemos saberlo todo?

Bajo este modelo, yo me he preguntado si es que tener respuestas a todas las preguntas universales implica conocer todo lo que existe. Usemos el modelo que acabo de exponer para responder a esta interrogante.

Entendamos el universo como lo que contiene todo lo existente. Entonces cada ser existente, existe dentro del universo. Por tanto, conocer el valor del atributo “Descripción completa de todo lo existente en el universo al que pertenezco” implica saber todo lo existente. Quizá no contenga lo no existente, pero si podemos imaginar lo no existente entonces lo no existente existe en nuestra imaginación.

Si consideramos lo anterior, y como cada ser existente pertenece a este mismo universo, entonces ¿Cuál es la descripción completa de todo lo existente en el universo al que pertenezco? es una pregunta universal y responderla significa tener una respuesta para todo lo existente.

Pero saberlo todo es una tarea titánica! ¿Será posible que algún día lo sepamos todo?

En la vida hay que ser pragmátic@s, rayemos la cancha

Encontrar las respuestas a todas las preguntas universales parece una tarea imposible, pues tomaría demasiado tiempo, y hay preguntas que podrían ser imposibles de responder. Entonces, llegar lo más posible a la verdad no consiste en saberlo todo. Propongo una forma de medir el progreso en esta materia según qué tanto nos distanciamos de la verdad.

¿Cuánto cuesta llegar a la verdad?

Daré un ejemplo de lo anterior. ¿Sabes cuánto es 2+2? Asumo que sí. ¿Pero podrías memorizar el valor de a+b para cualquier par de números enteros a y b? Obvio que no porque existen infinitos números enteros. Existen infinitas proposiciones verdaderas, así que en vez de intentar de memorizar todas las sumas, que es imposible, mejor creemos un método eficaz para conocer el valor de a+b para los valores de a y b que queramos o necesitemos. Actualmente es muy fácil hacerlo con ayuda de la calculadora, pues ésta combina una implementación de un algoritmo genérico que sirve para calcular sumas de números y un inmenso poder de cómputo. Pero antiguamente no era el caso y era necesario que los humanos calculáramos la suma usando nuestro cerebro como computador, lo que era mucho más lento. Lo que hicimos como especie fue reducir el costo de acceder a la verdad. Esta reducción de costos también ocurrió con la masificación de internet, la educación pública, etc.

Materia pasada, materia olvidada!

Ya tenemos el costo de acceder a la verdad, que claramente nos distancia de ésta. Ahora la educación es mucho más accesible, ¿pero qué tan efectivo es meter en la cabeza de las personas los contenidos? Seguramente has olvidado gran parte de lo que aprendiste en el fomegio (me refiero al colegio xd) o universidad. ¿Entonces de qué te sirvió pasar tantas horas estudiando esas materias obligatorias, aparte de obtener una buena nota? Por eso, otro factor que considero de suma importancia considerar, es la retención de las verdades que aprendemos. Existen técnicas para no olvidar, como la repetición espaciada, y se ha estudiado qué es lo que se recuerda mejor a largo plazo, por tanto ya hemos tenido avances al respecto.

¿Bajo costo o alta retención?

Escribiendo sobre los dos factores anteriores, consideré la posibilidad de que una alta retención de una verdad requiera un mayor costo de adquirir dicha verdad. Por ejemplo, si aplicamos la técnica de la repetición espaciada, tendremos que repasar varias veces lo que estamos aprendiendo, lo que incrementaría el costo de conocer esa verdad si queremos conocerla por más tiempo. No obstante, el beneficio obtenido de cada repaso es mayor porque con cada repaso el cerebro retiene lo aprendido por más tiempo. Por tanto, a largo plazo sí vale la pena invertir ese tiempo.

Importancia y alcance de lo que aprendemos

Con los dos primeros puntos satisfechos, ya tendríamos una forma fácil y rápida de saber las cosas que necesitamos y recordarlas a largo plazo. ¿Pero de qué sirve memorizar una bolsa de Oreo cualquiera? ¿Qué tanto nos va a ayudar para otras cosas? ¿No sería mejor aprender algo más útil? A continuación mostraré qué verdades son, a mi juicio por supuesto, las que por lo general más valen la pena encontrar para llegar a la verdad, sin considerar las ventajas no intrínsecas de saber la verdad.

Volvamos al ejemplo de las sumas: ¿Qué es mejor? ¿Memorizar un montón de sumas, o dominar un método general para calcular cualquier suma? Claramente la segunda opción es superior, porque para cualquier suma, se reduce el costo de llegar a su resultado. ¿Notas qué es lo que hace que sea mejor? Es su generalidad. Mientras más general sea una respuesta, mejor será porque reducirá el costo de llegar a verdades particulares. Las verdades más generales de todas son las verdades universales. Por eso creo que conocer respuestas a verdades universales ayudará mucho a acercarnos a la verdad.

Pero por otra parte, en algunos casos puede ser mejor trabajar en llegar a verdades particulares. En el ejemplo anterior sí convenía encontrar un método general porque hay infinitos números, pero si el costo de encontrar una verdad general es demasiado alto y no reduce suficientemente el costo de llegar a una verdad particular, será mejor trabajar en encontrar respuestas a varias preguntas de carácter más específico. Debido a esto es que no considero que la generalidad de las verdades sea un factor intrínseco a considerar para determinar qué tanto la población ha llegado a una verdad, sino que sirve en la medida que ayude a reducir el costo o aumentar la retención de otras verdades, pero aún así reconozco que la verdad general es una verdad en sí misma.

Cada quién es la medida de su verdad

Hay afirmaciones verdaderas para todo el mundo (¿o casi?), como que 2+2=4, pero también hay algunas que son muy relativas. Por ejemplo, para mí hace frío en Concepción pero para una familiar mía, más acostumbrada al clima, no hace frío en Concepción, sino que hace calor. Entonces, ¿la afirmación “Hace frío” es verdadera o falsa? La respuesta es depende, porque alude a una experiencia subjetiva del que emite dicha afirmación.

A pesar de que muchas verdades son subjetivas, es posible establecer un punto de partida para acercarnos a la verdad, o mejor escrito, a nuestra verdad. El objetivo entonces, es aumentar la retención y la generalidad y reducir el costo de llegar a nuestra verdad.

¿Lo sé de corazón, de cerebro, o de guata?

Me ha pasado muchísimas veces que he fracasado, ya sea en un concurso de programación o en el amor romántico, y he llegado a sentir que nunca voy a tener éxito. Claramente es falso, pues he llegado a obtener buenos resultados con práctica y perseverancia y otras personas también. El punto es que sé que es falso pero aún así se siente real, desde el estómago. Si dentro de nosotr@s hay múltiples “yo” conscientes, entonces hay que tener en cuenta todos esos “yo” existentes, tanto el consciente como el inconsciente, que al menos en los seres humanos es mucho mayor que la parte consciente. Aún no puedo afirmar mucho más al respecto porque no sabría identificar los “yo” existentes dentro mío, o al menos no todavía.

¿Y las mentiras y falsedades?

Hasta ahora he propuesto una referencia para medir qué tanto la gente se acerca a las verdades. ¿Pero qué pasa con las creencias falsas? Fácil, basta con invertir los dos factores que presenté antes: hay que aumentar la dificultad y el costo de llegar a creencias falsas y reducir la retención de dichas creencias.

Conclusión

He introducido factores a considerar para construir un punto de partida para acercarnos a la verdad. El ideal es conseguir, para la mayor cantidad de seres conscientes posible (incluso de los que no sepamos), una máxima retención y mínimo costo, y viceversa en el caso de lo que es falso.

Dentro de la comunidad de programación competitiva existen varias guías acerca de como mejorar y prepararse resolviendo problemas. Esta pequeña guía pretende hacer algo distinto, una lista de comprobación de cosas que hacer antes y durante una competencia de programación.

Antes del contest

  • No tener hambre ni sed
  • No tener ganas de ir al baño
  • Tener agua u otro bebestible a mano
  • Tener snacks a mano por si me de hambre
  • Entrar a Codeforces (o el sitio donde se aloje la competencia) e iniciar sesión.
  • Abrir un archivo de texto para cada problema con la plantilla a usar para la competencia
  • Abrir emulador de terminal en el directorio asignado para la competencia
  • Abrir esta lista de comprobación

Al resolver un problema

  • Leer el enunciado cuidadosamente
  • Determinar exactamente qué es lo que tiene que hacer el programa (matemáticamente si es posible)
  • Comprobar límites de la entrada, de tiempo y de memoria

Encontrar la solución

  • Buscar patrones (programación dinámica, búsqueda binaria, grafos, etc)
  • Reducir a casos sencillos

Implementar la solución

  • Escribir grandes pasos
  • Escribir el código
  • Probar con los casos de ejemplo
  • Probar con pequeños casos borde

Si da Wrong Answer

  • Probar con distintos casos de prueba en los que conozcamos la salida esperada. Si son grandes, generar los casos con números aleatorios y comparar nuestro programa con una solución de búsqueda exhaustiva
  • Inspeccionar el código en busca de errores
  • Intentar demostrar la solución
  • Cambiar los ints por long longs por si hay un overflow escondido.
  • Si todo lo anterior falla, implementar la solución de una forma diferente
  • Si aún así nada funciona, cambiar de problema.

Si da TLE/MLE

  • Reducir constantes
  • Hacer pequeñas optimizaciones (arrays en vez de vectores, uso de variables globales, etc)
  • Si aún así nada funciona, cambiar de problema.

Si da RE

  • Fijarse en los subíndices de los arrays y vectores
  • Evitar divisiones por 0
  • Si todo lo anterior falla, implementar la solución de una forma diferente

Hoy termina mi cuarta semana estudiando en la FCFM. Como prometí que haría, escribiré sobre mi experiencia y mis impresiones de la universidad. El post no está tan estructurado como otros artículos porque lo escribo con menor planificación.

Primeros días

El primer día amanecí antes de las 6AM. Estaba muy emocionado, en contraste con los días previos en los que no tenía ganas de nada. Ordené mis cosas y me dirigí a caminando a la facultad (afortunadamente vivo relativamente cerca).

Como me había levantado temprano, aproveché de pasear por la facultad. Me encantó el edificio antiguo de Beauchef y el patio que tenía adentro. El problema era que no encontraba la sala y llegué un poco tarde a mi primera clase. Tuve que haber intuido que la “G” como la primera letra del nombre de la sala era de “Geología”.

Cerca del mediodía tuve clase en el edificio nuevo. Me gustó el contraste entre ambos edificios aunque no me gustó tanto la idea de tener que salir de la facultad hacia la calle para luego volver a entrar.

En los días siguientes pasaron hartas cosas buenas pero tenía una ensalada de emociones. Conocí en persona a algunos compañeros de programación en el patio. También pude colarme en el DCC (Departamento de Ciencias de la Computación) y sentí que era mi lugar, como que pertenecía ahí. No obstante, me sentía algo irritado y con pocas ganas de esforzarme, lo que hizo que me atrasara en algunos ramos.

Tengo muchos problemas para concentrarme en clase. Mi cerebro se distrae fácilmente pensando en cualquier otra cosa. Últimamente he estado pensando mucho en mi propósito y en cómo aportar de la mejor manera al mundo con algo que me guste. Y parece bastante complicado.

Impresiones de los ramos

Tengo una carga académica normal (30 créditos), pero siento que me quita demasiado tiempo. A continuación los ramos que tomé para este semestre:

Cálculo Avanzado y Aplicaciones

Aquí vemos Cálculo vectorial, Variable Compleja, series de Fourier y ecuaciones en derivadas parciales. Parece que se aplica mucho en física, pero parece una excusa para aplicar lo que vimos en Cálculo en Varias Variables y en Ecuaciones Diferenciales Ordinarias.

Sobre mi desempeño en el ramo, no hemos tenido evaluaciones aún pero voy bastante atrasado y me cuesta entender la materia del apunte.

Inglés 4

Estas clases son como las que tenía en el instituto de idiomas, sólo que esta vez son con más gente. La profesora es chilena pero eso no es un problema para mí. Creo que el nivel que busca que obtengamos es B2 en todo excepto en escritura, pero no estoy completamente seguro.

Introducción a la Física Moderna

Aquí estudiamos ondas, sonido, relatividad, etc. El profesor es algo sarcástico y honestamente no aprendo mucho con él en clase. Afortunadamente los tests son fáciles y me ha ido muy bien en ellos.

Probabilidades y Estadística

El curso está dictado por un profesor que ganó el premio nacional en ciencias exactas. El profesor dio una motivadora primera clase explicando varios casos y situaciones que inspiraron la creación de distintas teorías de probabilidad. Sus clases se basan en copiar texto del pizarrón pero se toma el tiempo de explicar los conceptos. Quiere que preguntemos sobre nuestras dudas pero suele regañar a algun@s que lo hacen, ya sea porque el o la estudiante asume algo que no sale escrito o por otros motivos que no recuerdo. Aún así me cae muy bien.

Proyecto de innovación en Ingeniería y Ciencias

Tod@s parecen odiar este ramo, pero a mi me gusta la idea de aprender cómo aportar a la sociedad mediante la ingeniería. Uno de l@s profesores es muy agradable de escuchar, hace aportes entretenidos e interesantes.

Química

Tod@s parecen odiar este ramo también. Me tocó con un profesor francés y se le nota al hablar, pero eso me agrada. Lamentablemente me fue mal en la primera tarea, pero no sé por qué pues no he visto la corrección. Espero que me la den para la revisión, porque creo que merezco una mejor nota aunque no esté seguro.

Taller de Inducción a Competencias Docentes para Auxiliares

La docencia me llama la atención así que decidí pedirle al CAD que me inscribiera a este ramo para ser auxiliar. Me he imaginado siendo auxiliar de Intro al Álgebra y de Intro a la Progra. Lo malo es que es necesario ver vídeos de Youtube por EOL, lo que requiere descargar JavaScript privativo, por lo que le pedí a los profesores que enviaran los enlaces a los vídeos directamente para poder verlos desde Invidious.

Últimamente he estado practicando mucho en Codeforces, pero lamentablemente no me ha ido tan bien como esperaba. De hecho, me ha ido bastante mal. También me he sentido muy ansioso en general porque pienso mucho sobre si mis metas (como la de ser red coder) son las adecuadas para mí.

Para ayudarme con lo anterior, me he preguntado por qué quiero ser red coder en Codeforces, y he identificado tres motivos principales:

1) Quiero ser muy bueno en algo, y ya soy medianamente decente en programación competitiva por lo que el camino a recorrer es aparentemente más corto.

2) Me gustaría ver a Chile con un red coder y con gente más habilidosa en general. Con mis habilidades obtenidas también podría ayudar a otras personas a mejorar en programación.

3) Pienso muy seguido en que me fue mal en la IOI y debería haber entrenado más, por lo que esto me serviría como una forma de redención conmigo mismo.

A ver, pensemos un poco. ¿Son estos motivos suficientes para querer dedicarle cientos de horas de tu vida a ProgComp?

Definitivamente el tercer motivo no es válido para mí, porque quiero tomar la mejor decisión dadas las circunstancias. Así que me enfocaré en los dos primeros motivos.

Respecto del primero, disfruto pensar y resolver problemas que requieran una mezcla entre creatividad y pensamiento sistemático, y la programación competitiva ofrece justamente eso. Me apasiona la idea de volverme muy bueno en Codeforces. No obstante, hay otras cosas en las que puedo ser bueno, y quizás en ellas le haría un mayor bien a la humanidad, como dedicarme a un proyecto real de software.

Respecto del segundo motivo, nuestro país tiene problemas grandes dónde la informática puede contribuir a su solución, problemas aparentemente más importantes que unos puntos en una página de internet o la habilidad de un@s cuant@s en una actividad en concreto, sobretodo si consideramos que la programación competitiva no es un fin en sí mismo sino que tiene el objetivo de generar mejores ingenier@s de software y científic@s en computación.

En conclusión, me gusta resolver problemas algorítmicos, pero el fin es ser bueno en informática para un bien social, por lo que abandonaré mi objetivo de ser red coder (aunque seguiré mejorando en Codeforces por diversión y un sentimiento de crecimiento personal) y buscaré algo en lo que pueda aportar con mis conocimientos y habilidades (presentes y futuras).

Hace algunos años postulé y entré como alumno a estudiar Ingeniería y Ciencias en la Universidad de Chile. Lamentablemente, la pandemia arruinó mi expectativa ya que todas las actividades se volvieron online. Lo bueno es que este año volveremos a las actividades presenciales (¡por fin!), y estaré escribiendo mis experiencias en este blog. Aunque no lo parezca, no me siento muy motivado, porque en general no ando con muchas ganas de hacer cosas, y porque hay otras cosas que quiero hacer este año y siento que la universidad me quitará bastante tiempo. A pesar de eso, espero tener una buena experiencia: aprender mucho y conocer gente buena onda.

Pronto competiré en una ronda de Codeforces hecha por un Argentino. Espero remontar lo que perdí durante el mes. Luego de eso me iré a Santiago.

Últimamente me he sentido mal conmigo mismo. Me he propuesto la meta de ser el primer red coder chileno de la historia. Parece una meta difícil de alcanzar, y lo es. Durante este mes he estado resolviendo muchos problemas de programación para mejorar mi nivel, pero lo único que gano es perder rating (que es como el ELO del ajedrez, solo que en este caso se calcula en base al rendimiento de tod@s l@s participantes). Después del concurso consigo resolver el problema con una solución relativamente sencilla. En parte me alegra porque pude conseguir lo que me había costado tanto antes, pero por otra parte me frustra el no poder resolver cosas que deberían ser fáciles para mi, sobretodo considerando que llevo años en programación competitiva.

No sé si considerar la frustración como un problema de autoestima. Por un lado me pregunto si realmente podré ser red coder y me siento como un tonto cuando leo el tutorial y la solución es muy simple, pero por otro sigo intentándolo porque en el fondo me gusta hacer esto y siento que no quiero dejar atrás algo que llevo haciendo durante mucho tiempo. De todas formas, tengo otras virtudes aparte de programar, y puedo ser un gran informático sin necesidad de tener un buen rendimiento en esta clase de competencias.

Lo bueno es que al escribir estas palabras me he sentido algo mejor. Eso significa que escribir ayuda a despejarse. Pero no debo relajarme tanto si quiero ser el primer red coder chileno. Debo disfrutar del proceso, no sentirme mal por tener que leer la solución, y sobretodo ayudar a alguien con lo que estoy haciendo. Estoy trabajando en un proyecto relacionado, y tengo pensados otros más que espero sean de su agrado.

Un problema muy común es el de calcular la potencia de un número $b$ con exponente $n$, es decir, calcular $b^n$. La forma obvia de hacerlo en programación consiste en multiplicar $b$ por si mismo unas $n$ veces con un bucle. Esta solución requiere de $O(n)$ operaciones, lo que puede ser demasiado para determinados contextos. En este artículo expondré sobre una forma más eficiente de resolver el problema, aunque sólo aplica para números .

La idea

Sea $b$ la base y $n$ el exponente (un entero no negativo) al que queremos elevar el número $b$. El algoritmo de exponenciación binaria nace de una simple observación: Si $n$ es par entonces $b^n = (b^2)^{\frac{n}{2}}$, y si $e$ es impar entonces $b^n = b \times b^{n-1}$. Por lo tanto el problema se puede expresar de forma recursiva:

potencia(b, n):
    // Caso base
    Si es es nulo:
        retornar 1

    Si e es par:
        retornar potencia(b*b, n/2)
    Si e es impar:
        retornar b * potencia(b, n-1)

Complejidad temporal

La exponenciación binaria es mucho mejor que la lineal, sobretodo si se implementa de forma iterativa y usa con exponentes grandes. Se puede demostrar que ejecuta $O(\log{n})$ operaciones.

Bibliografía

La semana pasada se aprobó en la Comisión Sistemas de Conocimientos, una norma constitucional para modernizar la legislación sobre derecho de autor, equilibrando los derechos morales y patrimoniales de los autores y autoras con el derecho del público general a acceder a la cultura. Ahora vayamos al grano: uno de los artículos aprobados obliga al estado a “utilizar y promover recursos y herramientas de libre acceso y distribución, así como aquellas que permitan la innovación por medio de su modificación”. En la discusión de la norma se hizo mención al posible uso de software libre (programas informáticos que otorgan las libertades de usarlos para cualquier propósito) por parte del estado en lugar de software privativo (programas que no otorgan alguna de las libertades mencionadas) debido a este artículo. Lo anterior nos daría más soberanía como país ya que el estado podría auditar la seguridad de los programas informáticos que ocupa y adaptar dichos programas a sus necesidades. Además podría ahorrar miles de millones de pesos que se gastan en licencias de uso de software privativo.

Mi preocupación radica en que el artículo de la norma es demasiado débil para “abrirle la puerta” al software libre en el estado. No consigue que el estado priorice el software libre por sobre el que no lo es, ya que el artículo puede interpretarse de modo que se usen sólo algunos programas libres y que el resto sean privativos. Por tanto, no se conseguiría el objetivo de incrementar la soberanía informática. Desconozco si es posible, pero en caso de serlo, espero que el pleno pueda corregir el artículo para que obligue al estado a priorizar el uso de recursos de libre estudio, modificación y distribución.

Aquí publico un comentario de una cita que escribí para una asignatura en la Universidad. Defiende la idea de que las necesidades en el ser humano no son necesariamente ilimitadas y que el deseo de maximizar las propias riquezas no es hegemónico en todas las culturas.

Cita a comentar

“Deberá dependerse siempre del principio de acción cuya influencia sea la más poderosa, constante, uniforme, permanente y más generalizada entre la humanidad. Ese principio es el interés personal [egoísmo o maximización]; el sistema de economía que se construya sobre cualquier otra base, se edifica sobre una base falsa” Jeremy Bentham, filósofo utilitarista La psicología del hombre económico

Introducción

La cita a comentar fue escrita por Jeremy Bentham, un filósofo importante en la formulación del utilitarismo, corriente filosófica cuyo principio fundamental es que la medida del bien y del mal es la máxima felicidad del máximo número de personas (Cortina, 1994, p. 29-30). Desde esta perspectiva, en la cita se plantea que los sistemas económicos deben basarse en el interés personal de quienes lo componen, es decir, suponer que todas las personas buscan maximizar su propia felicidad sin tomar en cuenta la del prójimo (Bentham, 1786). No obstante, es legítimo preguntarse si el interés personal es el motor principal de la conducta humana en todas las culturas. En el presente comentario se intentará dar respuesta a la problemática anterior, explorando las necesidades humanas, la moral imperante en algunas sociedades que existieron en el pasado, y las causas y consecuencias de la ayuda mutua y cómo éstas están relacionadas con el altruismo y con el propio bienestar.

Desarrollo

En primer lugar, los seres humanos estamos programados por naturaleza para buscar nuestra propia supervivencia. En la Pirámide de Maslow, el primer peldaño está reservado para las necesidades relacionadas con la supervivencia, tales como la alimentación y el sueño (Maslow, 1943). Claramente la satisfacción de dichas necesidades contribuyen al propio bienestar personal del individuo, pero no son ilimitadas ya que existe un máximo nivel en el que éstas pueden satisfacerse. Por ejemplo, uno no puede comer ilimitadamente, sólo hasta la saciedad, y tampoco es necesario ingerir una cantidad infinita de alimento para vivir. De hecho, en su tratado sobre la política, Aristóteles asevera que los recursos necesarios para vivir “parecen constituir la verdadera riqueza, pues la propiedad de esta índole que basta para vivir no es ilimitada” (Aristóteles, Siglo IV a. C).

Por otra parte, la subsistencia no es la única necesidad del ser humano. Recordemos que las personas, en general, también necesitan recibir afecto, atención, respeto, y tener una sensación de libertad y seguridad (Maslow, 1943). Según los aristotélicos, “Los hombres tienden necesariamente a la felicidad” (Cortina, 1994, p. 29). Lo anterior podría hacernos pensar que Sin embargo, la felicidad, entendida como el estado de mayor satisfacción física y espiritual, y a la vez el fin último del ser humano, no se consigue con las riquezas naturales (que según San Tomás de Aquino, son las necesarias para vivir, “para subsanar las debilidades de la naturaleza”), pues “se las busca en orden a otra cosa; para sustentar la naturaleza del hombre y, por eso, no pueden ser el fin último del hombre, sino que se ordenan a él como a su fin.” (de Aquino, Siglo XIII), ni tampoco con riquezas artificiales, como el dinero, porque este tipo de riquezas se creó como un medio para conseguir riquezas naturales mediante el intercambio, tal como explica Aristóteles en el primer libro de su tratado sobre Política: cuando se dependió más del exterior para importar lo necesario y exportar lo que se tenía en abundancia, la necesidad hizo que se ideara la utilización del dinero por no ser fáciles de transportar todos los productos naturalmente necesarios. Por eso convinieron en dar y recibir recíprocamente en sus cambios algo que, siendo útil en sí mismo, fuera además de fácil manejo para la vida, como el hierro, la plata o algo semejante. (Aristóteles, Siglo IV a.C.)

Además, la satisfacción de ciertas necesidades como el afecto y el respeto, deben cumplirse de manera recíproca entre dos personas, por lo que su satisfacción requiere de un comportamiento no egoísta, pues se debe tener en consideración el bienestar del prójimo. De este modo, el ser humano no necesita maximizar sus riquezas ni ser completamente egoísta para alcanzar la felicidad.

Sumado a lo anterior, el comportamiento humano está sujeto a las expectativas culturales del entorno, y en distintas sociedades se han creado mecanismos, ya sea de manera consciente o inconsciente, para ayudar al prójimo y otros para evitar una excesiva acumulación de riqueza. A continuación estudiaremos algunos ejemplos de estos mecanismos en sociedades antiguas y medievales.

Un ejemplo de estos pueblos es el judío, cuyos integrantes no actúan basándose en el interés personal, o al menos no principalmente, sino de la voluntad y las normas marcadas por su dios, Yahvé. Por ejemplo, en el Deuteronomio se le impera a los fieles apartar la décima parte de su cosecha anual cada tres años para que el levita, los extranjeros, los huérfanos y las viudas que viven en su ciudad puedan alimentarse. También les ordena perdonar las deudas de sus deudores en el año sabático, es decir, cada siete años, y el párrafo siguiente apela a los fieles a ser caritativo y ayudar a los pobres: “Si hay junto a ti algún pobre de entre tus hermanos, en alguna de las ciudades de tu tierra que Yahvé tu Dios te va a dar, no endurezcas tu corazón ni cierres tu mano a tu hermano pobre; antes bien, le abrirás tu mano y le prestarás lo que necesite para remediar lo que le falta.”. A pesar de lo anterior, un contra-argumento en defensa del principio del egoísmo podría ser que los fieles no actúan de forma caritativa como un fin en si mismo, sino como un medio para conseguir la bendición de Yahvé, bendición que se menciona en el mismo libro. No obstante, ello no es a costa del prójimo sino que en su auyda.

En las ciudades medievales en Europa imperaba una jurisdicción propia y una organización autónoma dentro de las mismas, y ésta tenía en consideración el bienestar general de su población. Por ejemplo, todos los productos de primera necesidad debían llegar al mercado de la ciudad para que todos los habitantes pudieran abastecerse antes de que un comerciante pudiera adquirir los productos que sobraban, “y aún así su ganancia tenía que ser nada más una «ganancia honesta»” (Kropotkin, 1902). Sobre la Grecia Arcaica, Finley comenta que En el comercio o en cualquiera otra relación, había que acogerse al principio de igualdad y beneficio mutuo. La ganancia a expensas de otro pertenecía a un terreno diferente, al de la guerra y de la incursión, donde se obtenía por realización (o amenaza) de proezas, no por manipulaciones y regateos. (Finley, 1954)

Las normas mencionadas anteriormente no están basadas en la maximización, sino en el bien común y una limitación razonable de las ganancias que un comerciante podía obtener, o bien en el principio de beneficio mutuo en el caso de la Grecia Antigua, donde el lucro a expensas de otro griego iba contra la moral de dicha sociedad.

No obstante, el concepto de maximización no estaba ausente en la totalidad de civilizaciones antiguas. Aristóteles escribió sobre dos tipos de crematística: una natural, cuyo fin era “el vivir bien”, y otra antinatural, cuya finalidad era maximizar las riquezas como un fin en sí mismo. Sobre la antinatural, el filósofo comenta: “aquella crematística es comercial y productiva de dinero, no en general, sino mediante el cambio. Esta crematística comercial parece tener por objeto el dinero, ya que el dinero es el elemento y el término del cambio, y la riqueza resultante de esta crematística es ilimitada. (…) Por un lado, pues, resulta claro que toda riqueza debe tener un límite, pero de hecho vemos [18] que ocurre lo contrario, pues todos los que trafican aumentan su caudal indefinidamente.” (Aristóteles, Siglo IV a.C.). Este tipo de crematística surgió años después del período estudiado por Finley en “El mundo de Odiseo”, pero de todas formas el filósofo griego mantiene una actitud crítica respecto de ella y de quienes la practican.

Conclusiones

El ser humano busca satisfacer sus necesidades, pero la cantidad de recursos necesarios para dicho fin no es infinita, por lo que no es siempre necesario adquirir la máxima cantidad de dichos bienes. Además, varias de las sociedades históricas que estudiamos han confeccionado y aplicado un sistema de normas que fomenta la cooperación, incluso entre individuos que no forman parte del mismo núcleo familiar. Y aunque de todas formas existían personas que buscaban maximizar sus riquezas, constituían sólo una fracción de su respectiva sociedad y eran mal vistas por ésta. Lo anterior nos permite concluir que el deseo de maximizar bienes que proporcionan placer o felicidad no es universal en todos los seres humanos, ni en todas las culturas. No obstante, las personas que componen los sistemas estudiados se benefician de dichos sistemas, por lo que el presente comentario no demuestra que el interés en uno mismo o una misma no es un universal cultural. Una reflexión en profundidad sobre la última problemática mencionada, desde un punto de vista antropológico, podría involucrar el estudio de sociedades cuyos individuos sean ajenos a sí mismos, en caso de que existan.

Bibliografía

Aristóteles (Siglo IV a.C.) POLÍTICA: La economía: propiedad y crematística

Bentham, J. (1786) La psicología del hombre económico

Cortina, A. (1994) Ética de la empresa: claves para una nueva cultura empresarial. Trotta, Madrid

Tomás de Aquino (Siglo XIII) Suma Teológica

Finley, M. (1954) El mundo de Odiseo

Kropotkin, P. (1902). Capítulo 5: Ayuda mutua en la ciudad medieval. En La ayuda mutua

En el mundo de la programación competitiva, es muy común practicar resolviendo problemas de concursos anteriores en un juez en línea al que se le envía el código fuente de la solución para que éste entregue el veredicto. Pero a pesar de que esta sea la forma de entrenar a la que estamos acostumbrad@s, y considerando esencial para la libertad el que podamos controlar las herramientas que ocupamos, es sensato preguntarse si los jueces en línea como los conocemos implican la renuncia por parte de l@s usuari@s al control de sus actividades informáticas por constituir un servicio que aparentemente podría ser fácilmente reemplazado por un programa libre en nuestro computador. En este artículo responderé a la interrogante ponderando cómo se beneficia y cómo se perjudica el usuari@ por el uso de un juez en línea en lugar de un juez local.

Conceptos previos

Para poder ejercer el control efectivo sobre nuestras actividades informáticas, es necesario que los programas que usamos vengan con al menos cuatro libertades:

  1. La libertad de ejecutar el programa para cualquier propósito
  2. La libertad de estudiar el código fuente del programa y modificarlo
  3. La libertad de distribuir copias exactas del programa
  4. La libertad de distribuir versiones modificadas del programa

Los programas que cumplen con las cuatro libertades se conocen como software libre. En artículos anteriores expuse sobre el tema y expliqué cómo afectan a las libertades de l@s usuari@s. Cuando una de las libertades es insuficiente, es una injusticia porque se le priva al usuari@ de una libertad que merece. Los programas sin las cuatro libertades se conocen como software privativo.

Otra forma de hacer que la gente ceda el control de sus actividades informáticas consiste en los servicios que sustituyen al software, servicios que consisten en programas que se ejecutan en el computador del proveedor del servicio cuando perfectamente l@s usuari@s podrían tener una copia de un programa libre que hiciese la misma tarea. En este caso l@s usuari@s dependen del proveedor del servicio para realizar la actividad, y sólo pueden hacerla de la forma en que el proveedor quiera. El proveedor también puede abusar de su poder para espiar a l@s usuari@s.

Al grano

En primer lugar, hay que dejar claro que los jueces en línea son servicios, por lo que debemos determinar si reemplazan un potencial programa libre que corra en el computador del usuari@. Para que un juez local pudiera hacer su trabajo, debería contar con los casos de prueba y scripts de evaluación de cada problema. Esta información debe ser sacada de internet (es posible generar los casos de prueba localmente, pero en ese caso el generador tendría que ser descargado de internet de todas formas). El caso es distinto al de un traductor o un editor de imágenes, en el que el usuari@ debe proveer todos los datos de entrada. Además, en los concursos es necesario estar conectad@ a internet para que nuestras soluciones puedan ser auditadas y así poder evitar y detectar a la gente que hace trampa.

Además de lo anterior, la delegación de la actividad de juzgar a un servicio puede parecer que reporta ciertas ventajas prácticas, aunque después explicaremos cómo se pueden incorporar en un potencial juez local:

  • Se puede acceder desde cualquier computador, pues basta con conectarse al servidor del juez en línea
  • Puede tardar menos tiempo en juzgar, dependiendo del poder de procesamiento de nuestro computador
  • Menos tiempo en descargar datos del problema, porque la mayoría están en el juez
  • Participar en la elaboración de estadísticas y en ciertos concursos, como el Coder del mes de OmegaUp (aunque esto no es necesariamente bueno)
  • Almacenar las soluciones y sus veredictos en un servidor remoto.

Por otra parte, el hecho de que los jueces en línea sean servicios genera cierta dependencia que se podría evitar con un juez local:

  • Es necesario que los servidores estén funcionando para poder resolver el problema, pues no todos los jueces tienen todos los problemas.
  • No siempre se puede saber como funciona, y en los casos en los que sí no se puede cambiar el funcionamiento del programa.
  • El proveedor del servicio puede espiar los hábitos de entrenamiento y las soluciones de l@s usuari@s, y a veces esos datos son visibles para todo el mundo. Esto es así porque l@s usuari@s están obligad@s a compartir cierta información que quizá no quieren compartir para poder resolver ciertos problemas, pues es poco práctico crear una cuenta distinta para cada solución que se desee enviar.

Reemplazar los jueces en línea por un juez local traería más independencia a l@s usuari@s, que podrían modificar el juez para tener ventajas prácticas respecto de los jueces en línea, tales como:

  • Nuevos lenguajes de programación
  • Menor tiempo en juzgar, al evitar las colas de subidas de soluciones
  • Tiempo límite diferenciado para lenguajes de programación más lentos, como Python
  • Mayor variedad en la naturaleza de los problemas de programación competitiva, en vez de únicamente problemas algorítmicos.

¿La solución?

Lo ideal sería dejar los jueces en línea sólo para los concursos porque requieren que l@s participantes estén conectad@s a internet, y para las otras cosas tener un juez local extensible que se ejecutara en la máquina del o la participante, que incorporara las ventajas prácticas de los jueces en línea a la vez que garantizara la independencia de l@s usuari@s. En particular, tendría las siguientes características:

Repositorios

Podrían crearse repositorios con conjuntos de problemas para que sean descargados por el juez local. La gente podría crear y subir problemas fácilmente con herramientas que automaticen parcialmente el proceso.

Descarga de problemas

El juez tendría facilidades para visualizar y descargar conjuntos de problemas desde repositorios destinados a ello. Los problemas vendrían en un formato especial para que el juez los detectara y procesara fácilmente.

Descarga rápida de casos de prueba

Al abrir un problema se descargaría primero el enunciado y el resto se descargaría mientras el usuari@ esté leyéndolo. El juez tendría la opción de eliminar los datos a petición del usuari@.

Estadísticas

El juez contaría con un generador y visor de estadísticas sobre los problemas resueltos y el rendimiento del usuari@. También podría recomendar problemas a resolver en base a estas estadísticas.

Sincronización con NextCloud

El juez contaría con la opción de enviar los códigos fuente de las soluciones de manera cifrada a un servidor con NextCloud (que es como Google Drive o Dropbox), para ser consultados y publicados según las necesidades de l@s usuari@s. Después de juzgar el problema, l@s usuari@s podrían decidir si quieren enviarlo o no.

Complementos

Actualmente existen servicios web y programas que sirven de suplemento para los jueces en línea más populares como Codeforces, que aportan funcionalidades como recomendaciones personalizadas de problemas a resolver. Lo ideal es que el juez sea fácil de extender con funcionalidades parecidas a la de estos servicios y programas.

Conclusiones

La mayor parte de las funciones de los jueces en línea podrían realizarse de forma local, pero aún así pueden existir algunas que no, por lo que los jueces en línea no son enteramente SaaSS (sería completamente SaaSS si, por ejemplo, el usuario o usuaria tuviese que enviar los checkers y los casos de prueba para los problemas que quisiera resolver, pero solamente se debe enviar el código de la solución). No obstante, un juez local otorgaría a l@s usuari@s un mayor control sobre las evaluaciones y sobre sus datos personales, aunque también es posible que los jueces permitan juzgar soluciones de manera anónima, sin registrarse.

Por tanto, los jueces en línea deberían tener la opción de descargar los enunciados, casos de prueba y soluciones de los problemas en un buen formato para poder entrenar de forma local, y al mismo tiempo habría que desarrollar un juez local extensible fácil y cómodo de usar, de modo que l@s usuari@s que no quieran ceder sus datos sobre su entrenamiento a un servicio o bien deseen usar sus propias herramientas en lugar de un juez online no sufran desventajas al no poder resolver ciertos problemas. Así se mejoraría la comunidad de programación competitiva.