Top 10 problemas más comunes para desarrolladores TI

Preguntándole a la AI: top 10 problemas más comunes que enfrentan los desarrolladores de TI en las empresas

En esta oportunidad se me ocurrió preguntar a la IA cuales son los problemas más comunes a los que nos enfrentamos en el desarrollo de código a nivel empresarial, para contrastarlo con mi experiencia personal, fue interesante porque, a decir verdad, si es bastante acertada la respuesta, aunque es difícil decir cuál es la que más se repite, bajo mi experiencia personal yo diría que la más frecuente (y la que más dolores de cabeza dan) son las variables y funciones con nombres que no son descriptivos, luego le seguiría la falta de documentación y comentarios, como tercero en mi ranking personal seria el código complejo que es extremadamente difícil de rutear. Sin más acá la respuesta de Gemin

Top 10 Problemas de Código Comunes que Enfrentan los Desarrolladores

Los desarrolladores de software encuentran una variedad de problemas de código en su trabajo diario. Estos problemas pueden surgir de diferentes fuentes, incluyendo errores de sintaxis, lógica incorrecta, malas prácticas de desarrollo y código heredado complejo.

A continuación, se presenta una lista de los 10 problemas de código más comunes que enfrentan los desarrolladores:

  1. Errores de sintaxis: Estos errores son los más básicos y suelen ser fáciles de identificar. Se producen cuando el código no cumple con las reglas gramaticales del lenguaje de programación.
  2. Lógica incorrecta: Este tipo de error es más difícil de detectar, ya que el código puede tener una sintaxis correcta pero no producir el resultado esperado. Se debe a errores en la lógica del programa.
  3. Mala indentación y formato: Un código mal indentado y formateado puede ser difícil de leer y comprender, lo que aumenta la probabilidad de errores.
  4. Nombres de variables y funciones no descriptivos: Los nombres de variables y funciones deben ser claros y descriptivos para que el código sea más fácil de entender y mantener.
  5. Falta de comentarios: Los comentarios son esenciales para explicar el propósito del código, especialmente para código complejo o poco intuitivo.
  6. Duplicación de código: El código duplicado es ineficiente y difícil de mantener. Se debe refactorizar el código para eliminar la duplicación.
  7. Falta de pruebas: Las pruebas unitarias y de integración son cruciales para garantizar la calidad del código y detectar errores tempranamente.
  8. Código heredado complejo: El código heredado puede ser difícil de entender y modificar, lo que aumenta la probabilidad de errores. Se debe documentar y refactorizar el código heredado para mejorar su mantenibilidad.
  9. Dependencias desactualizadas: Las dependencias desactualizadas pueden causar problemas de seguridad y compatibilidad. Se debe actualizar las dependencias regularmente.
  10. Falta de estándares de codificación: La falta de estándares de codificación consistentes puede llevar a un código inconsistente y difícil de mantener. Se deben establecer y seguir estándares de codificación claros.

Recursos adicionales

Esta lista no es exhaustiva, pero sí incluye algunos de los problemas de código más comunes que enfrentan los desarrolladores. Al comprender estos problemas, los desarrolladores pueden mejorar sus habilidades de codificación y escribir código más limpio, eficiente y mantenible.

Convertir Celsius a Fahrenheit con TensorFlow: Primeros pasos en IA

letter blocks

¡Hola a todos! Me complace compartir mi primer proyecto de inteligencia artificial usando TensorFlow: una función para convertir grados Celsius a Fahrenheit. Este es un paso emocionante en mi viaje para comprender y aplicar esta tecnología fascinante.

Me basé en este video para inciar el uso de la herramienta.. es muy fácil de seguir y entender, muy recomendable

Introducción

Si estás empezando en el mundo de la IA, este proyecto es ideal para familiarizarte con TensorFlow y el desarrollo de modelos básicos. La conversión de Celsius a Fahrenheit es una tarea sencilla que te permitirá explorar los conceptos fundamentales de la inteligencia artificial y poner en práctica tus habilidades de programación.

Requisitos

Para seguir este tutorial, necesitarás:

Desarrollo del modelo

  1. Definir los datos: Comenzaremos creando un conjunto de datos con valores de temperatura en Celsius y Fahrenheit. Puedes encontrar ejemplos en línea o crear tu propio conjunto de datos.
  2. Construir el modelo: Utilizaremos una red neuronal simple con una capa lineal para aprender la relación entre Celsius y Fahrenheit. TensorFlow nos facilita la creación y entrenamiento de este tipo de modelos.
  3. Entrenar el modelo: Alimentaremos el modelo con nuestro conjunto de datos y lo entrenaremos para que aprenda la función de transformación. Este proceso puede tomar algunos minutos, dependiendo de la cantidad de datos y la potencia de tu equipo.
  4. Evaluar el modelo: Una vez entrenado, podemos evaluar el rendimiento del modelo utilizando métricas como la precisión o el error cuadrático medio.
  5. Utilizar el modelo: Finalmente, podemos usar el modelo para convertir cualquier valor de Celsius a Fahrenheit.

Recursos adicionales:

Acá el codigo generado en GIST para que lo revises

Link de colab con la implementación para que puedas revisar cada paso

https://colab.research.google.com/gist/donpandix/2b125f863c7f678249ac5a865b2892fc/formula-conversi-n-calcius-a-fahrenheit.ipynb

Conclusión

Este proyecto es una introducción práctica al mundo de la inteligencia artificial con TensorFlow. Convertir Celsius a Fahrenheit es solo un primer paso, pero te abre las puertas a un sinfín de posibilidades. Te animo a seguir explorando, experimentar con diferentes proyectos y desarrollar tus habilidades en esta apasionante área.

Usando IA para obtener estructura de carpetas

pile of folders

Usando la IA Gemini de Google para estandarizar mi estructura de las carpetas de mis aplicaciones java de acuerdo a los standares generales.

Durante mi carrera he armado mi propia estructura de carpetas AD-HOC usando como ejemplo las diversas aplicaciones que tenido que intervenir, finalmente llegé a una estructura que si bien es cómoda para mí, posiblemente sea algo compleja o poco natural para quien deba modificarla en el futuro, es por eso que me propuse ordenar de una forma más general y standard los archivos de mis futuros trabajos, si bien, era algo que hace tiempo deseaba hacer, por lo que preguntaba a otros colegas la forma en que ordenaban las carpetas.. pero vi que todos tenían sus propias formas de estructurar, ya sea por las características de los frameworks o simplemente por comodidad, finalmente llegé al mismo punto inicial.

Una idea interesante que tuve hoy fue la de consultar a la IA la respuesta a mi problema, esperando que esa voz inparcial me diese una solución sin sesgos y directa y quiero compartir este desarrollo por si alguien tiene esta misma duda y desea usar (o incluso complementar) esta respuesta, sólo por motivos de contextualizar el ejemplo le pedí que usara como base una aplicación SpringBoot Java:

Bash
├── app
   ├── controllers
      ├── HomeController.java
      └── UserController.java
   ├── entities
      ├── User.java
      └── ...
   ├── repositories
      ├── UserRepository.java
      └── ...
   ├── services
      ├── IUserService.java
      ├── UserService.java
      └── ...
   └── utils
       ├── AppConfig.java
       └── ...
└── src
    ├── main
       ├── java
          ├── com
             ├── example
                ├── App.java
                └── ...
          └── ...
    └── resources
        ├── application.properties
        └── ...

Explicación:

  • app: Contiene el código fuente de la aplicación.
  • controllers: Contiene los controladores MVC.
  • entities: Contiene las clases de modelo que representan las entidades del sistema.
  • repositories: Contiene los repositorios que implementan el patrón Repository para abstraer la lógica de acceso a datos.
  • services: Contiene los servicios que encapsulan la lógica de negocio de la aplicación.
  • utils: Contiene archivos de utilidades comunes a toda la aplicación.
  • src/main/java: Contiene el código fuente de la aplicación Java.
  • src/main/resources: Contiene los archivos de configuración y recursos de la aplicación.

Ejemplo de código:

Java

// UserController.java

@RestController
public class UserController {

    @Autowired
    private IUserService userService;

    @GetMapping("/")
    public String index() {
        return "Hola Spring Boot!";
    }

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userService.findAll();
    }

}

// UserService.java

@Service
public class UserService implements IUserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> findAll() {
        return userRepository.findAll();
    }

}

// UserRepository.java

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

}
Java

En este ejemplo:

  • La clase UserController es un controlador MVC que expone dos endpoints: / e /users.
  • La clase UserService es un servicio que encapsula la lógica de negocio para la gestión de usuarios.
  • La clase UserRepository es un repositorio que implementa el patrón Repository para acceder a los datos de la entidad User.

Conclusión:

La estructura de carpetas propuesta para una aplicación Spring Boot es similar a la estructura de carpetas para una aplicación MVC con Model DAO Services. La principal diferencia es que la capa de acceso a datos se implementa utilizando la tecnología JPA (Java Persistence API).

Nota: Esta es solo una estructura de ejemplo, y puede ser modificada para adaptarse a las necesidades específicas de cada proyecto.

Clase simple para convertir String a Fechas

a calendar page on a clipboard

Clase simple que valida la entrada de la cadena con un formato de fecha, si cumple con los formatos esperados, entonces crear el objeto LocalDate, de lo contrario retorna un nulo

Este es un ejemplo simple del uso de expresiones regulares para validar la forma de la cadena de entrada antes de ejecutar la conversión de la información, lo cual da un primer manejo simple de la información al momento de evaluar el dato a convertir, aunque regexp no evalúa la validez de la fecha (por ejemplo si es 32 de enero lo toma como verdadero) evalúa realmente que la forma de la cadena sea correcta.


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.regex.Pattern;

/**
 * Simple class to handle the date objects and
 * parse from string to LocalDate
 */
public final class DateUtil {

    /**
     * Parse a String to DateLocal object in several formats
     * @param inputDate String with in date shape
     * @return LocalDate from the input string, null if is not valid
     */
    public static LocalDate parseFromString (String inputDate) {

        DateTimeFormatter standardFormat;

        LocalDate parsedStringDate = null;

        // Validate date format d/MMM/yyyy ex. 24/Apr/2021
        if (Pattern.compile("^[0-9]{2}\\/(\\w)+\\/[0-9]{4}$").matcher(inputDate).matches()) {
            standardFormat = DateTimeFormatter.ofPattern("d/MMM/yyyy", Locale.ENGLISH);
            parsedStringDate = LocalDate.parse(inputDate, standardFormat);
        }

        // Validate date format d-MMM-yy ex. 24-Apr-21
        if (Pattern.compile("^[0-9]{2}\\-(\\w)+\\-[0-9]{2}$").matcher(inputDate).matches()) {
            standardFormat = DateTimeFormatter.ofPattern("d-MMM-yy", Locale.ENGLISH);
            parsedStringDate = LocalDate.parse(inputDate, standardFormat);
        }

        // Return date object or Null
        return parsedStringDate;
    }
    
}

Acá dejo un ejemplo de uso de esta clase


public class Main {

    public static void main(String[] args) {
        String stringDate = "24-Apr-21";
        System.out.println( DateUtil.parseFromString(stringDate).toString() );
    }

}

Conversión de cadena de texto a DATETIME

Consultas que convierten y manipulan un objeto DATETIME de SQL Server

Una de las funcionalidades que , aunque en ocasiones son un dolor de cabeza, son interesantes de conocer, ya que nos permiten manejar de mejor forma la información que tenemos en base de datos, ya sea para mostrar por pantalla o para la exportación de datos para ser consumidos por alguna persona, y siempre es bueno que lo entreguemos la información en el formato más natural posible, ya que la gran mayoría de los usuarios son personas comunes y corrientes y no seres sobrenaturales a-dimensionales como los informáticos que entendemos el glorioso valor de un TIMESTAMP. Es por ello que presento la siguiente funcionalidad que he ocupado por mucho tiempo y no había notado que no lo había compartido, es por ello que les presento una pequeña porción, pero muy útil, del uso de unas funcionalidades muy básicas en el manejo de fechas usando como fuente una fecha que viene en cadena de texto, esto porque en muchas ocasiones me he topado con el hecho que los datos vienen desde la fuente en String del tipo YYYYMMDD, pero, calma, que no panda el cúnico… porque hay solución.

Para la transformación del dato de texto a Datetime usé la función CAST de SqlServer y luego de transformarlo a fecha, le resté un mes con la función DATEADD y finalmente le di un formato como yo necesito. Sin más acá les dejo el código sencillo y espero que más que útil para más de alguno.

-- Obtención de un objeto DATETIME desde una cadena de texto

SELECT CAST('20200101' AS DATETIME)  AS fecha

-- resultado 
-- 01/01/2020 0:00:00


-- Resta de un mes a la fecha obtenida desde una cadena de texto

SELECT dateadd(month, -1, CAST('20200101' AS DATETIME))  AS fecha

-- resultado
-- 01/12/2019 0:00:00
                               
                               
-- Formatea una fecha a un patrón de fecha definido por el usuario
                               
SELECT format( dateadd(month, -1, CAST('20200101' AS DATETIME)), 'dd-MM-yyyy HH:mm:ss')  AS fecha

-- resultado
-- 01/12/2019 0:00:00

Dibujos para pasar la cuarentena

Caricatura de Don Ramón

Estos son algunos de los dibujos que he realizado durante un día de mucho aburrimiento en el periodo de la cuarentena, no tienen otra finalidad que ayudarme a no volverme loco en el confinamiento

Dibujos domingueros

Acá unos dibujos que hice para pasar el domingo y soltar la mano, la verdad que de hace un rato no dibujaba y necesitaba retomar este hobbie que por lo general lo uso para reducir la ansiedad y el stress cuando estoy programando.. y necesito un poco de aire porque me he quedado estancado.

Crear tablas temporales SQLServer

Ejemplo para crear tablas temporales para la base de datos SQLServer (versión 2012) pero que tanbién sirve para versiones más actualizadas

En muchas ocasiones para resolver un problema en SQLServer en el cual debo extraer información desde una o varias tablas de la base de datos, necesito crear tablas temporales dentro de los procedimientos almacenados, esto para el cruce de información más ordenado y eficiente. a continuación les dejo un ejemplo de script sencillo que tiene por objetivo la creación de una tabla temporal que implementa unos indices que son necesarios para que el motor de base de datos busque al información dentro de esta tabla de forma rápida y eficiente.

CREATE TABLE #tabla_temporal (
	 id_tabla BIGINT
	,cd_columna_01 BIGINT
	,gl_columna_02
)
CREATE NONCLUSTERED INDEX idx_tabla_temporal ON #tabla_temporal ([id_tabla])


-- Otras formas de definir indices

-- Indice no ordenado
CREATE INDEX idx_tabla_temporal ON #tabla_temporal (id_tabla);

-- Indice a partir de 2 columnas
CREATE UNIQUE INDEX idx_tabla_temporal ON #tabla_temporal (id_tabla asc, cl_columna_01 asc)

Lista de meses del año en arreglo con PHP

person encoding in laptop

Clase útil con método para el retorno de una lista Tupla de código-descripción del mes

Esta es una de esas cosas que son simples de hacer… pero si están en Internet ya creadas es mejor cortar y pegar, por esta razón he disponibilizado esta información para quien la necesite, es básicamente una clase UTIL con un método estático para su llamada directa que retorna una lista tupla con el código del mes y el nombre descriptivo, a continuación su implementación y llamada al método

/**
 *  Listado de meses en español
 */
 
class Util {

    /**
     * Lista de meses
     */
    public static function Meses () {
        return  [
                  '01' => 'Enero'
                 ,'02' => 'Febrero'
                 ,'03' => 'Marzo'
                 ,'04' => 'Abril'
                 ,'05' => 'Mayo'
                 ,'06' => 'Junio'
                 ,'07' => 'Julio'
                 ,'08' => 'Agosto'
                 ,'09' => 'Septiembre'
                 ,'10' => 'Octubre'
                 ,'11' => 'Noviembre'
                 ,'12' => 'Diciembre'
                ];
    }

}

// USO Util::Meses() retorna un arreglo de tuplas donde el id es el código y el valor en nombre