¿Es GitHub Copilot una bendición o una maldición?

Recorrido

Antes de sumergirnos en Copilot más profundamente, repasemos algunos ejemplos más de su uso en la práctica.

def tar_dir(dir, dest):
"Tar and optionally compress directory `dir` to `dest` in bz2, xz, or gzip format"
if dest.endswith('.bz2'):
with tarfile.open(dest,'w:bz2') as f: f.add(dir, arcname=os.path.basename(dir))
elif dest.endswith('.xz'):
with tarfile.open(dest,'w:xz') as f: f.add(dir, arcname=os.path.basename(dir))
elif dest.endswith('.gz'):
with tarfile.open(dest,'w:gz') as f: f.add(dir, arcname=os.path.basename(dir))
else: raise ValueError('bad dest: {}'.format(dest))
with TemporaryDirectory() as tmp:
write_text(os.path.join(tmp,'a.txt'),'hello')
write_text(os.path.join(tmp,'b.txt'),'world')
tar_dir(tmp,'out.tar.bz2')
assert os.path.exists('out.tar.bz2')
with tarfile.open('out.tar.bz2') as f:
assert f.getnames()==['a.txt','b.txt']

Problemas de código

El código que escribe Copilot no es muy bueno. Por ejemplo, considere la tar_dirfunción anterior. Hay mucho código duplicado allí, lo que significa más código para mantener en el futuro y más código para que el lector lo entienda. Además, la cadena de documentos decía "comprimir opcionalmente", pero el código generado siempre se comprime. Podríamos solucionar estos problemas escribiéndolo de esta manera en su lugar:

def tar_dir(dir, dest):
"Tar and optionally compress directory `dir` to `dest` in bz2, xz, or gzip format"
suf = ':' + Path(dest).suffix[1:]
if suf==':tar': suf=''
with tarfile.open(dest,f'w{suf}') as f: f.add(dir, arcname=dir)

Por qué Copilot escribe código incorrecto

Según el artículo de OpenAI, el Codex solo da la respuesta correcta el 29% del tiempo. Y, como hemos visto, el código que escribe generalmente está mal refactorizado y no aprovecha al máximo las soluciones existentes (incluso cuando están en la biblioteca estándar de Python).

Los problemas con el código generado automáticamente

Las herramientas de creación de código han existido casi desde que existe el código. Y han sido controvertidos a lo largo de su historia.

def finetune(folder, model):
"""fine tune pytorch model using images from folder and report results on validation set"""

Analizar Python con una expresión regular

Le pedí a la comunidad de fast.ai ejemplos de ocasiones en las que Copilot había sido útil para escribir código para ellos. Una persona me dijo que lo encontraban invaluable cuando estaban escribiendo una expresión regular para extraer comentarios de una cadena que contenía código Python (ya que querían asignar cada nombre de parámetro en una función a su comentario). Decidí probar esto por mí mismo. Aquí está el mensaje para Copilot:

code_str = """def connect(
host:str, # host to connect to
port:int=80, # port to connect to
ssl:bool=True, # whether to use SSL
) -> socket.socket: # the connected socket
"""
# regex to extract comments from strings looking like code_str
comment_re = re.compile(r'^\s*#.*$', re.MULTILINE)
code_str = """def find_tags(
input_str:str, # the string to search for tags
tag_prefix:str="#" # prefix marking the start of a tag
) -> List[str]: # list of all tags found

Programación de par de IA y sesgo cognitivo

Un programador de pares de IA necesita trabajar bien con humanos. Y viceversa. Sin embargo, los humanos tienen dos sesgos cognitivos en particular que dificultan esto: el sesgo de automatización y el sesgo de anclaje . Gracias a este par de debilidades humanas, todos tendremos la tendencia a confiar demasiado en las propuestas de Copilot, incluso si tratamos explícitamente de no hacerlo.

Ejemplos de uso de Stack Overflow, Google y API

Generalmente, si un programador no sabe cómo hacer algo y no está usando Copilot, lo buscará en Google. Por ejemplo, el codificador que discutimos anteriormente que quería encontrar parámetros y comentarios en una cadena que contiene código podría buscar algo como: “ Python extraer lista de parámetros del código regex “. El segundo resultado de esta búsqueda es una publicación de Stack Overflow con una respuesta aceptada que dice correctamente que no se puede hacer con expresiones regulares de Python. En cambio, la respuesta sugirió usar un analizador como pyparsing . Luego intenté buscar “ pyparsing python comments “ y descubrí que este módulo resuelve nuestro problema exacto .

Conclusiones

Sigo sin saber la respuesta a la pregunta del título de esta publicación: “¿GitHub Copilot es una bendición o una maldición?” Podría ser una bendición para algunos y una maldición para otros. Para aquellos para quienes es una maldición, es posible que no lo descubran durante años, porque la maldición sería que aprenden menos, aprenden más lento, aumentan la deuda técnica e introducen errores sutiles, son cosas que es posible que no se den cuenta. , especialmente para los desarrolladores más nuevos.

--

--

bootcampai.org

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store