Github Copilot

4분

2/19/2022

Thumbnail

Your AI pair programmer - github copilot

Github Copliot이 github preview로 나온지 8개월이 지났습니다.(2021.06.29)

처음 런칭을 발표했을 때는 그렇게 큰 기대를 갖고 있지 않았습니다. 원하는 코드를 적절하게 잘 작성해주기 보단 이상한 제안을 더 많이 하지 않을까? 더 도움이 될까? 라는 의구심이 처음엔 들었습니다. 무엇보다 바로 직전에 tabnine 이라고 하는 Machine Learning 기반이 AI IntelliSense 플러그인을 사용한 적이 있었는데 생각만큼 좋지 않았고 오히려 코드를 작성할 때 방해만 되는 느낌이 강했습니다. 이러한 경험이 선입견이 되어 아마 의구심이 좀 더 크게 있었던 것 같습니다.

그런데...Github Copilot Review 영상들이 하나 둘 씩 올라오게 되고, 후기들도 몇 가지 보게 되었습니다.

많은 의견들이 있었지만 대부분 첫인상은 "굉장히 놀라웠다" 라는 것이었습니다. 저도 궁금증이 더 커지기도 하고 신청을 하고 승인을 받아야 쓸 수 있다는 말에 바로 preview waitlist에 제 이름을 올렸습니다. 그리고 대략 2~3달 정도 걸린 시점에 메일이 하나 왔습니다.

copilot_agreement

위 메뉴얼 대로 설치를 했습니다. 그 이후로 쭉 Github Copilot을 사용했고 반년정도 사용한 것 같습니다.

What is Github Copilot?

GPT-3 모델을 기반으로 하는 OpenAI Codex를 이용하여 만든 프로그램입니다.

OpenAI Codex를 통해 Github Copilot이 만들어졌고, 학습할 때 사용된 traning data는 Github에 오픈된 모든 코드가 사용되었습니다.

GitHub Copilot을 AI Pair 프로그램이라고 소개합니다. 주석과 코드에서 컨텍스트를 가져와 개별 라인과 전체 함수에 대해서 실시간 제안합니다. GitHub Copilot은 현재 Visual Studio Code, Neovim 및 JetBrains IDE 에서 사용 가능하고 현재 저는 VS Code에서 사용 중입니다.

vscode-copilot-test

How it works?

copilot-work-flow

선언한 변수, 함수 명이나 주석을 보고 Github Copilot이 다음을 예측, 제안합니다. 프로젝트에서 이미 작성한 코드를 컨텍스트로 보고 최대한 일치하는 코드를 생성하려고 시도합니다.

IDE copilot 플러그인을 통해서 사용자의 주석이나 코드를 Github Copilot 서비스로 보내고, 이 서비스는 OpenAI Codex를 사용하여 코드를 합성하고 제안합니다.

또한, 작성 중인 파일의 다른 코드와 변수 이름과 상호작용하여 동작합니다. 반복적인 패턴을 형성하는 여러 라인을 입력하면 copilot은 동일한 패턴에 대해 더 많은 제안을 합니다.

image.png

개발자를 대체할까?

github copilot이 개발자를 대체하거나 자리를 위협할 거라고는 생각하지 않습니다.

copilot은 엔지니어가 아닙니다. 개발에 있어서 자동화는 항상 따라다니는 수식어 같습니다. 그러나 프로그램은 그렇게 간단하지 않습니다. 항상 컨텍스트를 염두해 두어야 합니다.

수 많은 제약사항을 파악하여 제공해주지 않습니다. 적절한 정답을 제안해주는 탁월한 능력은 있지만 그 정답이 해당 프로그램에서 적절한 수단임은 알려주진 않습니다.

어느 프로그램이나 마찬가지겠지만 copilot 또한 만능은 아니며, 누군가의 코드에 의해 생성된 AI라고 한다면 더 버그에 신경써야 합니다. 사용하면서 느꼈지만 copilot이 제공해준 코드가 늘 완벽하진 않기 때문에 그 부분은 늘 신경써야 합니다.

이슈

라이센스, 버그, 오래된 코드...

가장 큰 이슈는 라이센스 문제입니다. github의 오픈된 모든 코드를 이용했다고 했지만 라이센스 문제가 있습니다.

  • GPL 라이센스를 가진 코드를 가지고 학습한 모델이 생성한 코드는 GPL 라이센스를 따라야 하는건가?
  • 라이센스를 가진 코드를 이용해 학습하고 생성한 코드는 라이센스는 누가 가지는가?
  • 등등

또한 insecure 코드나 악의적인 코드, 또는 버그 들이 포함될 가능성, parroting(학습 데이터가 그대로 나오는 현상) 등이 있습니다.

이런 문제를 해결하기 위해 지금처럼 preview를 진행하는 것으로 생각됩니다.

Review

Amazing

첫 인상은 "매우 놀랍다" 였습니다.

누군가가 코딩을 옆에서 누가 도와주는 느낌이었습니다. 내가 다음에 무엇을 할지 알고 있는 듯한 느낌이 들었던 적도 있습니다. AI Pair 프로그래밍에 걸맞게, 정말로 누군가와 페어 프로그래밍을 한다면 이런 느낌일까? 라는 생각도 들게 되었습니다.

1. 컨텍스트 유지

종종 쓰이는 문법이나 함수들에 대해서 항상 기억하지 못하기에 매번 구글링을 통해서 진행한적이 있지 않으신가요? 저는 그런 경우가 꽤 있습니다. 언어를 바꾸어 사용하거나 서버 프로그램, 클라이언트 프로그램을 동시에 작업을 하거나 이런 경우 그렇게 되는 것 같습니다.

  • 이 언어에서는 이 syntax는 어떻게 작성하지?
  • 이 프레임워크에서는 라우트 설정은 어떻게 진행하더라?
  • 등등

머리가 부족해서 이런 경우가 꽤 되는데 그럴 때마다 구글링을 하고 오면(시간이 꽤 걸리기도 하고) "음... 내가 무엇을 하고 있었더라?" 라는 컨텍스트 유지가 어렵습니다.

copilot은 꽤 정확도가 높은 제안을 통해서 제 컨텍스트를 유지할 수 있게 도와주는 점에서 좋았습니다.

2. Chore

번거러운 설정파일, 실행 문법, 도커 설정, DB 설정 등

웹팩이나 바벨 같은 설정이나 config파일, yaml 문법 등 다양한 곳에서도 copilot의 도움을 받을 수 있어서 좋았습니다.

매 번 설정할 때마다 100을 모두 다 검색했다면, 50정도는 copilot을 통해서 "아 맞다 이거였지?" 하며 부드럽게 넘어갈 수 있었던 게 좋았습니다.

3. Code Convention

누가 읽어도 이해가능한 변수명, 함수명, 클래스명 등 가독성 있는 코드를 작성하는 규칙

copilot이 제 머리속을 뒤지지 않는 이상 제 코드에서 분석할 수 있는 요건은 정해져있습니다.

파일명, 모듈병, 변수명, 클래스명, 함수명, 주석 등이 copilot에게 제공되는 INPUT 입니다. 그래서 누구라도 읽어서 이해할만한 convention으로 작성해야만 정확한 copilot 제안을 OUTPUT으로 얻을 수 있습니다.

이런 점이 code convention을 자연스럽게 익히고 연습하도록 하는 점이 좋았습니다.

4. At least

copilot이 늘 정확한 제안을 하는 것은 아닙니다. 위에도 작성했듯이 프로그램 내에서 이 코드가 적절한 것 까지는 판단해주진 않습니다.

그러나 최소한 어느 길로 가야하는지, 즉 어떤 함수나 로직들이 사용되는지에 대한 최소한의 안내는 받을 수 있었던 것 같습니다. 그래서 검색할 때 시간을 줄여 빠르게 코드로 돌아올 수 있도록 해주었던 것 같습니다.

5. 학습 도구

range

Array range를 얻기 위한 함수를 작성하려 했는데 위와 같은 제안을 해주었습니다. 이전에 알지 못한 문법으로도 배열을 만들 수 있구나 라는 것을 배울 수 있었습니다.

postgres

postgres db를 처음 사용했는데 db command는 전혀 모르는 상태였습니다. 그러나 위와 같이 주석을 달고 copilot에게 제안을 받아 무리없이 사용했습니다.

6. 단점

인터넷에서 copilot의 결과를 가져오기 때문에 입력을 시작하고 실제로 제안을 받는 데는 딜레이가 있습니다. 간단한 코딩을 짜는데 copilot의 결과를 기다리느라 시간을 낭비하지 않아야 합니다.

tab 단축키가 제안을 적용하는 키로 설정되어있는데, 종종 짜증(?)나게 하는 경우가 있습니다. 내가 지금 누른 tab키는 indent tab으로 쓴건데 종종 copilot 적용이 되어버려 고통을 겪었던 적이 몇 번 있습니다.

위에도 작성되어 있지만 라이센스 문제가 아직 완전하게 해결된 것 같지는 않습니다. 기업에서 사용해야 될 때 항상 라이센스 문제를 생각해야 합니다.

현재 Preview 단계이기 때문에 많이 사용해보고 많이 피드백하여 쓰는 것이 좋을 것 같습니다.

마무리

저는 주로 javascript, typescript 언어를 쓰며 react, node 등을 사용합니다. docker를 쓰기도 하며, nginx, db, ci/cd 설정도 작성할 경우도 있습니다. 자주 쓰지 않거나 전혀 모르는 부분은 항상 구글링을 하며 시간을 많이 사용했었는데, copilot을 통해서 그 시간이 조금은 준 것 같습니다.

copilot이 완벽한 것도 아니며 프로그래머를 대체할 것이라고 생각도 하지 않습니다. 오히려 우리의 프로그래밍 효율성을 더 높게 만들어 더 나은 경험을 제공해줄 것이라고 생각합니다. 저 또한 그랬구요. 말그대로 CO-PILOT(부조종사) 처럼 생각하면 좋을 것 같습니다.

github은 개발자들에게 더 나은 DX(개발자 경험)를 제공하기 위한 로드맵을 가지고 있습니다. github.blog 에 그와 관련한 글들이 있으니 읽어보시는 것도 좋을 것 같습니다.

reference

마지막 업데이트

2/19/2022


Avatar

JHSeo

배우는 것을 좋아하고 관심이 많은 웹 엔지니어 입니다. 느리더라도 꾸준하게 성장하려고 노력하는 개발자입니다.