19년 차 개발자가 말하는 개발자와 인공지능(ChatGPT)
F-Lab : 상위 1% 개발자들의 멘토링
📌 글 작성
성장에 관심이 많은 F-Lab 백앤드 멘토 Elkein
아주 작은 스타트업 여럿과 NHN, 넷마블, 크래프톤 등을 거쳤으며
게임 산업, 클라우드 플랫폼 개발, 웹 개발 등을 두루 경험한 개발자
개요
최근 인공지능에 대한 이야기가 아주 핫하다.
알파고 때의 충격 그 이상이 세상에 다가온 듯하다.
ChatGPT가 대중적으로 쓰이기 이전에도 GPT를 사용해 보는 개발자가 많았는데 많은 사람들에게 유행이자 충격으로 다가간 것 같다.
그리고 그 퀄리티에 놀란 사람들은 많은 불안감을 표출하고 있는데, 개발자 관점에서의 ChatGPT의 연관성에 대해서 이야기해 보고자 한다.
개발자는 인공지능에 대체될까?
결론부터 말하자면 현재까지의 인공지능의 궤와 원리로는 어렵다.
그렇지만 PaaS, SaaS를 통해 회사나 부서마다 필요한 개발자의 수가 감소하는 데에는 영향을 줄 것이다.
ChatGPT의 원리는 어떻길래 이렇게 추정하는 것일까?
ChatGPT의 원리
아주 쉽게 요약하자면 학습 기반으로 어딘가에 혹은 대화를 통해 제공된 정보가 존재해야 한다.
이러한 정보 습득 과정에서 몇 가지 단서와 전제가 필요한 상황에 대한 판별이 쉽지 않다.
물론 이는 보정을 통해서 개선될 수 있다지만 어떠한 답변 하나마다 왜 이런 대답을 했는지 부연 설명을 한다면 대화가 매끄럽지 않기에 생략된다.
즉 현재는 유효하지 않거나 많은 전제가 필요하거나 잘못된 학습을 했거나 몇몇 단어로 인해 질문을 혼동했거나 하면 잘못된 답변을 하기 쉽다.
근본적으로 챗봇이기 때문에 가지는 한계를 여전히 가지고 있고, 학습된 정보를 바탕으로 새로운 정보를 만들어 내기보다는 정보를 찾아서 답변한다에 가깝다고 볼 수 있다.
ChatGPT가 개발 시장(개발자)에 영향을 줄까?
개발자가 필요 없어진다는 의견은 지나친 비약이라고 생각하지만 개발자들의 퍼포먼스를 향상시키거나 인사이트를 얻는 데에 활용될 수 있다고 생각한다.
IDE나 IDE의 Plugin 들이 도와주는 것과는 다른 궤지만 비슷하게 실력 있는 개발자를 돕는 수단으로써 작용할 것이다. 여러 커뮤니티 사이트나 유튜브 등지에서 ChatGPT로 코딩 하는 법 같은 영상이나 글도 많이 올라왔지만 사실은 Stackoverflow나 Googling한 정보와 크게 다르지 않다.
다만 복잡한 지문을 조금 더 잘 해석할 확률이 높아지는 수준이다.
Copilot을 쓴다고 ChatGPT를 쓴다고 개발자가 필요하지 않을까? 그렇진 않지만 훌륭한 개발자의 퍼포먼스가 올라가면서 전체 개발자 수요는 줄어들 여지가 있을 수는 있다.
그렇기 때문에 우리는 주어진 환경을 잘 활용해서 퀄리티 있는 개발자가 되는 방향을 목표해야 한다.
개발자가 ChatGPT를 활용하는 방법
1. 퍼포먼스를 높이는 데에 도움을 얻는다.
- 사수나 동료가 바쁠 때 코드 리뷰
Q. Can you improve my code?
import 'dart:convert';
import 'package:http/http.dart';
import 'package:flutter_live_score_app/models/soccer_match.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
class SoccerApi {
final String apiUrl =
"https://v3.football.api-sports.io/fixtures?season=2022&league=39";
static Map<String, String> headers = {
'x-rapidapi-host': "v3.football.api-sports.io"
};
static void setup() {
headers["x-rapidapi-key"] = dotenv.get("RAPID_API_KEY");
}
Future<List<SoccerMatch>> getAllMatches() async {
Response res = await get(apiUrl, headers: headers);
var body;
if (res.statusCode == 200) {
body = jsonDecode(res.body);
List<dynamic> matchesList = body['response'];
print("Api service: $body");
List<SoccerMatch> matches = matchesList
.map((dynamic item) => SoccerMatch.fromJson(item))
.toList();
return matches;
} else {
return <SoccerMatch>[];
}
}
}
A. Your code looks good and there are only a few minor suggestions I would like to make:
- Move the setup() method outside of the SoccerApi class and make it a top-level function. This is because the setup() method is only related to setting up the headers and not related to any instance of the SoccerApi class.
- Use final instead of var for body. Since body is only assigned once and its type is already known to be dynamic, using final will make your code more concise and easier to read.
- Instead of using List<dynamic> for matchesList, use List<Map<String, dynamic>>. This way, you can better communicate that each item in the list is a map with string keys and dynamic values.
Here is the modified code:
import 'dart:convert';
import 'package:http/http.dart';
import 'package:flutter_live_score_app/models/soccer_match.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
final String apiUrl =
"https://v3.football.api-sports.io/fixtures?season=2022&league=39";
final Map<String, String> headers = {
'x-rapidapi-host': "v3.football.api-sports.io"
};
void setupHeaders() {
headers["x-rapidapi-key"] = dotenv.get("RAPID_API_KEY");
}
class SoccerApi {
Future<List<SoccerMatch>> getAllMatches() async {
setupHeaders();
final res = await get(apiUrl, headers: headers);
final List<SoccerMatch> matches = [];
if (res.statusCode == 200) {
final body = jsonDecode(res.body);
final List<Map<String, dynamic>> matchesList = List<Map<String, dynamic>>.from(body['response']);
print("Api service: $body");
matches.addAll(matchesList
.map((item) => SoccerMatch.fromJson(item))
.toList());
}
return matches;
}
}
2. 구글링 대신 사용한다.
- Q. 컴퓨터 과학 기초가 중요한 이유가 뭐야?
- A. 컴퓨터 과학 기초는 현대 사회에서 필수적인 기술과 지식을 제공합니다. 다양한 분야에서 사용되는 컴퓨터 기술은 컴퓨터 과학의 기초 개념과 이론을 기반으로 발전하고 있습니다. 따라서 컴퓨터 과학 기초를 학습함으로써 컴퓨터 기술을 보다 깊이 이해할 수 있고, 새로운 기술을 학습하는 데도 용이합니다. 컴퓨터 과학 기초는 다음과 같은 이유로 중요합니다.
- 문제 해결 능력 강화: 컴퓨터 과학에서는 문제를 해결하는 데 필요한 알고리즘과 자료 구조를 학습합니다. 이를 통해 복잡한 문제를 분해하고, 이를 해결하기 위한 최적의 알고리즘과 자료 구조를 설계할 수 있습니다.
- 프로그래밍 능력 향상: 컴퓨터 과학 기초를 학습하면 프로그래밍에 대한 이해도가 높아지며, 이를 바탕으로 보다 효율적이고 안정적인 프로그램을 작성할 수 있습니다.
- 기술 발전 파악: 컴퓨터 과학에서는 최신 기술과 동향을 연구하고 있습니다. 컴퓨터 과학 기초를 학습하면 이러한 기술의 개념과 구조를 이해할 수 있으며, 이를 바탕으로 새로운 기술을 학습하고 활용할 수 있습니다.
- 산업에서의 경쟁력 강화: 현대 산업에서는 IT 기술이 매우 중요한 역할을 합니다. 컴퓨터 과학 기초를 학습하면 IT 기술을 보다 깊이 이해할 수 있으며, 이를 바탕으로 현업에서 일하는 데 있어 경쟁력을 갖출 수 있습니다. 따라서 컴퓨터 과학 기초는 컴퓨터 분야에서 일하는 사람이라면 누구나 반드시 학습해야 하는 필수적인 지식입니다.
- Q. float나 double에서 오차가 발생하는 이유가 뭐야?
- A. float나 double에서 오차가 발생하는 이유는 컴퓨터에서 실수를 표현하는 방식 때문입니다. 실수를 이진수로 변환해서 저장하는데, 이진수로 정확하게 표현할 수 없는 일부 실수 값들은 근삿값으로 저장되기 때문에 오차가 발생할 수 있습니다. 예를 들어, 0.1을 이진수로 정확하게 표현할 수 없기 때문에 근삿값으로 저장됩니다. float는 32비트, double은 64비트를 사용하는데, float는 소수점 이하 6–7자리까지, double은 소수점 이하 15–16자리까지 정밀도가 있습니다. 그러나 이진수 근삿값이므로 정밀도가 높을수록 더 많은 자릿수에서 오차가 발생할 수 있습니다. 예를 들어, 1/3을 소수점 이하 3자리까지 반올림해서 계산하면 0.333이 됩니다. 그러나 0.333을 이진수로 근사하면 0.010101010101…과 같이 무한 소수로 표현됩니다. 이런 이진수 근삿값을 계산할 때 오차가 발생하게 됩니다. 따라서, float나 double에서 오차가 발생하는 이유는 컴퓨터에서 실수를 이진수로 근사하여 저장하기 때문입니다. 이러한 오차를 최소화하기 위해서는 실수 연산을 할 때 가능한 한 정밀한 자릿수에서 계산하고, 오차를 고려하여 코드를 작성해야 합니다.
- Q. float나 double이 오차 때문에 돈을 해당 타입으로 저장하는 것은 걱정되는데, 어떤 대안이 있을까?
- A. 실수형 타입(float, double)을 사용해서 돈을 저장하는 것은 정확성을 보장하기 어려울 수 있습니다. 대신, 정수형 타입을 사용하여 돈을 저장하고, 화폐 단위를 나타내는 정숫값과 실제 금액 간의 관계를 정확하게 처리하는 것이 좋습니다. 예를 들어, 대부분의 화폐 시스템에서는 최소 화폐 단위를 사용합니다. 예를 들어, 미국 달러에서는 센트(1/100)를 사용하고, 일본 엔화에서는 엔(1/100)를 사용합니다. 이렇게 최소 화폐 단위를 정수형 변수로 나타내고, 계산할 때 이 값에 10의 거듭제곱을 곱해 실제 금액을 나타내는 방식을 사용할 수 있습니다. 예를 들어, 미국 달러에서 1달러는 100센트이므로, 1달러를 정수형 변수로 나타내기 위해서는 100을 곱합니다. 이렇게 하면 1달러를 나타내는 정수형 변수에 100을 곱하면 실제 금액인 1달러를 얻을 수 있습니다. 이런 방식을 사용하면 실수 연산을 하지 않아도 되므로 정확성을 보장할 수 있습니다.
3. 인사이트를 얻는 데에 사용한다.
- Q. 컴퓨터 과학 기초 공부를 어떻게 해야 돼?
- A. 컴퓨터 과학 기초를 공부하는 것은 컴퓨터 과학을 이해하고 프로그래밍을 개발하는 데 필수적인 기초적인 지식을 습득하는 것입니다. 이를 위해 몇 가지 조언을 드리겠습니다.
- 기초 개념 학습: 컴퓨터 과학에서 사용되는 개념과 용어에 대해 이해해야 합니다. 이를 위해 컴퓨터 과학 개론 책이나 강의를 추천합니다. 대학교에서 배우는 컴퓨터 과학 기초 과목을 참고해도 좋습니다.
- 프로그래밍 언어 학습: 프로그래밍 언어를 학습하면 컴퓨터 과학의 기초 개념을 더욱 명확하게 이해할 수 있습니다. 많은 언어들이 컴퓨터 과학에서 사용되므로, 기초적인 프로그래밍 언어들을 공부해 보세요. 파이썬, 자바, 자바스크립트 등이 대표적인 언어입니다.
- 알고리즘과 자료 구조 학습: 알고리즘과 자료 구조는 컴퓨터 과학의 핵심 개념입니다. 알고리즘과 자료 구조를 학습하면 프로그램을 효율적으로 작성하는 방법을 배울 수 있습니다. 책이나 강의를 통해 공부해 보세요.
- 문제 해결 능력 향상: 컴퓨터 과학에서는 문제를 해결하는 능력이 매우 중요합니다. 프로그래밍 대회나 문제 해결 사이트를 활용해 문제를 해결하는 능력을 향상시켜 보세요.
- 프로젝트 수행: 컴퓨터 과학을 공부하면서 학습한 내용을 바탕으로 프로젝트를 수행해 보세요. 프로젝트를 통해 학습한 내용을 실제로 적용하고 문제를 해결하는 방법을 배울 수 있습니다.
- 이러한 방법을 통해 컴퓨터 과학 기초를 공부하면서, 매일 조금씩 학습하는 것이 중요합니다. 컴퓨터 과학은 넓고 깊은 분야이기 때문에, 지속적인 학습이 필요합니다.
- Q. C언어 포인터와 메모리를 공부해두면, 자바나 코틀린 같은 언어를 쓸 때도 도움이 돼?
- A. 네, C언어에서 포인터와 메모리를 공부하면 다른 프로그래밍 언어를 학습할 때 도움이 됩니다. 포인터와 메모리는 C언어에서 중요한 개념이며, 다른 프로그래밍 언어에서도 사용됩니다. 예를 들어, 자바에서는 객체를 다룰 때 메모리 할당과 해제를 관리해야 합니다. 이때 포인터 개념을 사용하지는 않지만, 메모리를 어떻게 사용하고 관리해야 하는지 이해할 수 있습니다. 또한, 자바에서는 가비지 컬렉션 기능을 제공하여 메모리 누수를 방지하지만, 메모리 사용과 관련된 이슈가 발생할 수 있으므로 C언어에서의 메모리 관리 방법을 이해하면 자바 프로그래밍에서 유용합니다. 또한, 코틀린도 자바 가상 머신에서 동작하므로 자바에서와 마찬가지로 메모리 사용과 관련된 이슈가 발생할 수 있습니다. 또한, 코틀린에서는 널 포인터 예외를 방지하기 위한 널 세이프티 연산자 등이 있지만, 여전히 포인터 개념을 이해하면 코틀린 프로그래밍에서도 도움이 됩니다. 따라서, C언어에서 포인터와 메모리를 공부하면 다른 프로그래밍 언어를 학습하는 데 도움이 되며, 이 개념을 이해하면 프로그래밍에서 발생할 수 있는 메모리와 관련된 이슈를 더욱 잘 이해할 수 있습니다.
4. 각종 선택지에 대한 가이드라인을 제시받는 데에 쓴다.
- Q: 축구 경기 일정 어플을 만들려고 하는데, 무슨 언어랑 프레임워크 쓰면 좋을까?
- A: 축구 경기 일정 어플을 만들기 위해서는 다양한 언어와 프레임워크 중 선택할 수 있습니다. 선택하게 될 언어와 프레임워크는 프로젝트의 크기, 복잡성, 개발자의 기술 수준, 개발 비용 등을 고려하여 결정해야 합니다. 일반적으로 웹 어플리케이션 개발에는 다음과 같은 언어와 프레임워크를 사용합니다.
- Python + Django: Python은 간결하면서도 가독성이 높은 언어로, Django는 Python으로 만들어진 웹 프레임워크 중 하나입니다. Django는 ORM(Object-Relational Mapping)을 지원하여 데이터베이스와의 상호작용이 용이하며, 다양한 기능을 제공하여 웹 개발에 유용합니다.
- JavaScript + React: JavaScript는 웹 프론트엔드 개발에 필수적인 언어입니다. React는 JavaScript로 만들어진 웹 프론트엔드 라이브러리 중 하나로, 컴포넌트 기반의 구조를 갖추고 있어 유지보수가 용이합니다.
- Java + Spring: Java는 대규모 웹 어플리케이션 개발에 많이 사용되는 언어입니다. Spring은 Java로 만들어진 웹 프레임워크 중 하나로, 다양한 모듈과 기능을 제공하여 웹 어플리케이션 개발에 용이합니다.
- Ruby + Ruby on Rails: Ruby는 간결하고 직관적인 언어로, Ruby on Rails는 Ruby로 만들어진 웹 프레임워크 중 하나입니다. Ruby on Rails는 MVC(Model-View-Controller) 아키텍처를 기반으로 한 구조를 갖추고 있으며, 개발 속도가 빠르고 코드의 가독성이 높아 유용합니다.
- PHP + Laravel: PHP는 대표적인 웹 언어 중 하나입니다. Laravel은 PHP로 만들어진 웹 프레임워크 중 하나로, MVC 아키텍처를 지원하여 유지보수가 용이하며, 다양한 기능을 제공합니다.
- 축구 경기 일정 어플을 만들 때, 언어와 프레임워크를 선택할 때 프로젝트의 규모, 개발 기간, 개발자의 기술 수준, 운영체제, 서버 환경 등을 고려하여 결정하는 것이 중요합니다.
- Q. 난 지금 코틀린이나 C#을 제일 잘 쓰거든? 그런데 프론트 엔드 개발을 해야 해. 앱도 만들어지면 좋고. 생산성이 중요하다면 어떤 언어랑 프레임워크를 배우는 게 좋을까?
- A. 프론트 엔드 개발과 앱 개발을 위해서는 JavaScript와 React Native, Flutter, Xamarin과 같은 다양한 기술을 배우는 것이 좋습니다. JavaScript는 프론트 엔드 개발에서 가장 많이 사용되는 언어 중 하나입니다. JavaScript를 사용하면 React, Vue.js, Angular와 같은 프레임워크를 배우고 이를 통해 웹 애플리케이션을 개발할 수 있습니다. React Native는 Facebook에서 개발한 모바일 앱 프레임워크로, JavaScript와 React를 사용하여 iOS 및 Android 애플리케이션을 개발할 수 있습니다. Flutter는 Google에서 개발한 UI 프레임워크로, Dart 언어를 사용하여 iOS, Android, 웹 및 데스크톱 애플리케이션을 개발할 수 있습니다. Xamarin은 Microsoft에서 개발한 모바일 앱 프레임워크로, C# 언어를 사용하여 iOS, Android, 웹 및 데스크톱 애플리케이션을 개발할 수 있습니다. 생산성을 중요시한다면, Flutter와 React Native가 좋은 선택일 수 있습니다. 이 두 가지 기술은 쉽고 빠른 UI 개발과 모바일 앱 개발을 위한 높은 생산성을 제공합니다. 하지만 기존에 알고 있던 언어와는 조금 다른 개념을 배워야 할 수도 있으므로 학습 곡선이 있을 수 있습니다.
앞으로 개발자에게 중요한 역량은 무엇이고, 어떻게 개발할 수 있을까?
사실 개발 분야에서도 반복 작업이 적지 않다.
이에 ChatGPT가 아주 적절한 대안이 되기에는 어려운 것은 사실이다.
ChatGPT가 현재 상황에 맞는 적절한 자동화를 해주기는 어렵고 완결성 있는 어플리케이션을 퀄리티 있게 만들어주지도 않는다.
그럼에도 ChatGPT가 도움을 줄 수 있는 부분이 많은 것은 사실이고 이와 별개로 PaaS, SaaS의 발전이 가져다줄 생산성 향상 Copilot 같은 도구의 발전 이외에도 수많은 도구나 기술들이 앞으로도 계속 발전할 것이다.
그렇기에 특정 기술을 사용해서 반복 작업으로 대체 가능한 기술 검색으로 쉽게 구현 가능한 기술을 넘어 원리를 이해하고 디테일을 끌어올리고 자동화 기술들이 채워주지 못할 빈틈과 퀄리티 통찰력 및 판단력을 길러야 한다.
이러한 통찰력과 판단력을 기르기 위해서는 다양한 도구를 활용해서 많은 경험을 해야 하고 그 경험의 효율도 높여야 하며 옳은 방향성으로 공부해야 한다. 또 잘못된 정보를 습득하는 케이스도 줄여야 한다.
복잡한 비즈니스 로직, 특정 도메인에 종속된 노하우, 현재 복잡한 이슈들이 얽매여 있는 상황에서의 장애 원인 파악과 디버깅 등에는 ChatGPT가 도움이 한정되는데 이를 돕는 수단으로써 활용하고 자신의 통찰력을 키워야 한다.
그리고 그 통찰력을 근거한 판단력, 유연함이 당신을 훌륭한 개발자로 만드는 중요한 핵심 역량이라고 볼 수 있다.
ChatGPT 이후에도 계속 새로운 변화가 우리에게 다가올 것이다.
그런 변화를 두려워하기보다는 그 기술의 원리를 이해하고 기술의 한계와 장단점 그리고 활용 방법을 고민해 보고 잘 활용하는 개발자가 되자.
이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.