lunes, marzo 20, 2023

GitHub Copilot (Go)

 Desde hace unas semanas en la StartUp que me encuentro trabajando surgió la idea de utilizar GitHub Copilot. La verdad que al principio no podía darme cuenta de como poder sacarle provecho a esta herramienta de AI.

Con el correr del tiempo me di cuenta que la herramienta analiza tu forma de programar y según el contexto de tu código le puedes sacar mas o menos provecho.  Lo bueno que esta herramienta te completo o sugiere el código que debes poner según el contexto de tu código.

En mi caso le pude sacar mucho provecho creando las pruebas unitarias ya que me proponía los test unitarios que me faltaban hacer o me los completaba.

Ejemplo:

Debía escribir prueba unitarias para encriptar y para desencriptar por lo que solo con el nombre que le puse a la func ya comenzó a proponerme código.  


func TestRsaEncrypt(t *testing.T) {
//GenerateKeyPair(2048)
pub, _, err := CreateKeys(2048)
if err != nil {
t.Error(err)
}
// encrypt
encrypted, err := RsaEncrypt([]byte("hello world"), []byte(pub.String()))
if err != nil {
t.Error(err)
}
assert.NotNil(t, encrypted)
}

Copilot detecto que quería realizar un test para hacer una encriptación RSA por lo que solo con nombrar la func el completo el código. En realidad solo escribí la primer línea y el resto me lo propuso. Hasta ahí me había sorprendido ya que me propuso el código de forma correcta pero mi sorpresa fue al hacer el unit test para el Decrypt.

func TestRsaDecrypt(t *testing.T) {
//GenerateKeyPair(2048)
pub, pri, err := CreateKeys(2048)
if err != nil {
t.Error(err)
}
// encrypt
encrypted, err := RsaEncrypt([]byte("hello world"), []byte(pub.String()))
if err != nil {
t.Error(err)
}
// decrypt
decrypted, err := RsaDecrypt(encrypted, []byte(pri.String()))
if err != nil {
t.Error(err)
}
assert.Equal(t, "hello world", string(decrypted))
}

Al poner el título de la función me propuso todo el código, solo con un error el cual tuve que corregir pero me ahorre de escribir mas de 15 líneas.


En síntesis:

La herramienta es muy potente, solo debemos ayudarla teniendo un buen código ya que toma como contexto el código de nuestro repo para proponer código siguiendo nuestra lógica. Es importante los comentarios y los nombres de las funciones o estructuras. Creo que este tipo de herramientas se están haciendo cada día mas populares y como desarrollador es importante que aprendamos a convivir con este tipo de ayuda dado que nos brinda la posibilidad de aumentar nuestra productividad.