반응형

AI가 뺏어간 일자리

작년 이맘때쯤이었다.

진행 중인 프로젝트가 없어 대기하던 중이었다.

같은 팀 사원 개발자가 노트북을 켜고 열심히 뭔가를 하고 있었다.

"뭐 해?"

"chatGPT로 개발 공부하고 있어요"

처음에 무슨 얘긴가 했다.

ChatGPT 붐이 일기 시작한 때라 나는 큰 관심이 없었던 시기였다.

그래서 확인해 봤다.

바이브 코딩?

AI에게 필요한 코드를 요청하면 만들어 준다.

무료이면서 쉽게 접할 수 있는 구글 Gemini, MS 코파일럿, ChatGPT로 한 번 만들어 보자.

"문장을 입력하면 영어 'e'가 몇 개인지 찾아주는 프로그램을 파이썬으로 만들어 줘"

구글 Gemini에게 문의하면 아래와 같이 코드를 만들어 준다.

def count_e_in_sentence(sentence):
    """
    입력된 문장에서 영어 'e'의 개수를 세어 반환합니다.
    대소문자를 구분하지 않습니다.
    """
    
    # 문장을 소문자로 변환하여 'e'와 'E'를 모두 찾을 수 있도록 합니다.
    sentence_lower = sentence.lower()
    
    e_count = 0
    for char in sentence_lower:
        if char == 'e':
            e_count += 1
            
    return e_count

# 프로그램 실행
if __name__ == "__main__":
    print("문장에서 'e'의 개수를 세어주는 프로그램입니다.")
    
    while True:
        user_input = input("문장을 입력해주세요 (종료하려면 'quit' 입력): ")
        
        if user_input.lower() == 'quit':
            print("프로그램을 종료합니다.")
            break
        
        count = count_e_in_sentence(user_input)
        print(f"입력하신 문장에 'e' 또는 'E'는 총 {count}개 있습니다.")
        print("-" * 30) # 구분선

심지어 코드 설명도 라인마다 상세히 설명해 준다.

이런 방식으로 프로젝트 개발 시 필요한 파트 코드를 생성해 달라고 해서 사용하면 바이브 코딩이 된다.

오류가 나면 코드를 넣고 수정해 달라고 하면 해주는 수준이다.

 

정말 편한데 뭐가 문제지?

AI(인공지능)때문에 인간의 일자리가 없어져 간다는 뉴스가 요즘 종종 보인다.

반은 맞고 반은 틀리다는 말이 여기에 어울린다고 생각했다.

2002년 월드컵 4강 신화로 온 국민이 열광할 때였다.

지방 자동화 프로젝트에 투입, 크레인과 컨베이어로 재고 입출을 자동화하는 프로젝트였다.

사람의 손을 최소화하는 작업으로 회사 입장에서는 인건비가 많이 줄었다.

다른 말로 하면 일자리가 줄어들게 된다.

한참 코딩에 열중하고 있던 어느 날이었다.

컴퓨터에 그날 입출 정보를 확인해서 처리하는 정직원이 있었다.

하루에 2-3시간만 와서 처리하는데 정직원이라 연봉이 높았다.

"여기 와서 처리하는 것도 귀찮은데 이것도 자동화로 해주면 안 될까요?"라고 내게 요청했다.

음... 바로 답변해 주니 하지 말자고 하고 웃으며 자리를 떠났다.

"자동화는 가능한데 처리자가 필요 없어지니 그럼 회사 잘리실 텐데요?"

넓고 깊게 우물을 파자.

AI를 활용해서 코딩하면 시간도 절약되고 완성도 높은 정보도 얻을 수 있다.

전제조건이 필요하다.

AI를 사용하는 개발자도 말 그대로 개발자여야 한다.

AI를 활용해야지 AI에 의존해서 개발을 하면 안 된다.

뭘 알아야 물어보고,

뭘 알아야 제대로 되었는지 확인도 하고,

뭘 알아야 책임도 지는 것이다.

자기 능력을 키우지 않고 AI에 의존하게 되면 결국 자기 자리를 잃게 되는 것이다.

개발자라면 당연히 기초부터 스터디를 하고 프로젝트를 통해 경험도 쌓아야 한다.

공부할 양이 엄청 많다. 

직접 공부해 본 개발자라면 무슨 말인지 이해할 것이다.

 

AI는 개발자의 일자리를 뺏을 수 없다?

자리를 뺏기는 사람은 자신의 능력을 발전시키지 않고 AI로 편하게 처리하려는 자다.

다시 사무실 사원 개발자를 보자.

그 개발자의 실력은 내가 같이 해봐서 안다.

공부를 많이 해야 할 정도로 많이 부족했다. 물론 사원이니 당연한 거다.

하지만 자신의 개발과 경험 능력치를 올리는 노력은 안 한다.

코딩 공부랍시고 AI로 코드 뽑아서 붙여 넣기 하는 모습을 보면 누가 저런 신입을 뽑고 싶겠는가?

제대로 실력을 만들어 가는 개발자의 자리는 AI가 뺏을 수 없다.

사람이 개입해야 하는 부분은 분명히 있다.

챗봇으로 상담을 받아본 사람들은 결국 상담사를 연결해 문제를 해결하는 경우가 많다.

AI 응대에 피로감을 느끼는 고객들이 많다.

기업은 인력을 줄여서 좋겠지만 고객은 불편하고 짜증 난다.

만약 프로젝트에 AI로 대체해서 고객의 요건 정의를 받는다면,

고객은 챗봇 응대가 떠오를 것이다.

결국 AI로 대체되는 개발자도 있을 수 있지만,

능력있는 개발자도 반드시 필요하다.

취업과 AI?

신입 개발자를 뽑지 않고 AI로 대체한다고 한다.

바이브 코딩을 하는 고급 개발자들은 몸값이 올라갈 것이다.

AI를 활용하게 되면 초급 개발자의 일까지 추가되므로 당연히 돈을 더 달라고 하겠지.

또한 그들이 은퇴하거나 이직을 하는 경우

대체할 개발자는 어떻게 찾을 것인가?

갑자기 필요하다고 경력직 개발자가 뿅~하고 나타나지 않는다는 말이다.

AI가 해결해 줄까?

바이브 코딩도 아무나 하는 것이 아니라는 말이다.

단순하게 코딩을 만들어 준다고 프로젝트를 만들 수 없다는 의미다.

 

결국 AI도 사람이 만든다.

AI도 사람이 만든다.

AI 활용도 사람이 한다.

프로그래밍에 1도 모르는 사람과

경력 많은 개발자 둘 중

AI로 원하는 프로그램을 만들 때 누가 유리할까?

AI에 의존한다면 일자리를 뺏길 수 있다.

AI를 활용한다면 자신의 능력에 플러스가 될 것이다.

우리가 해야 할 일.

취업을 위해 학원도 다니고 코딩도 열심히 한다.

나름 포트폴리오도 멋지고 만들고 이력서로 여러 회사에 지원한다.

나만 특별한 스펙을 갖고 있는 게 아니라 문제다.

내가 보기엔 개발자는 개발 공부만 열심히 하면 된다라는 생각에서 차이가 있다고 본다.

인사담당자에겐 모두 비슷한 스펙이라는 의미다.

프로젝트에 투입해서 일을 잘하는 개발자를 뽑는데 여러분이 PM이라면?

깊게 파려면 넓게 파라
- 스피노자 -

프로그래머 세상을 살아오면서 깊이 공감되는 말이다.

코딩 스펙도 중요하지만 개발도 사람들과 함께 하는 일이다.

모든 일은 감정에 의해 처리된다는 글을 읽은 적 있다.

생각해 보니 지금까지 해 온 많은 프로젝트. 감정에 의해 처리된 경우가 많았다.

코딩 하나만 잘한다고 100점이 아니라는 의미다.

AI가 넘보지 못할 개발자로 성장하고 싶다면 넓고 깊게 파야 한다.

개발자 취업 시장도 어려운 시기에 AI까지 더해 힘든 세상,

좌절은 이제 그만! 변하는 시대에 잘 적응하는 개발자가 되었으면 한다.

깊고 넓게.

 

참고로, 25년 넘게 개발자를 업으로 삼고 있지만 AI로 코드 만드는 재미가 솔솔하다.

반응형
반응형

C 언어 포인터 시리즈 1탄!

 

인공지능 개발자가 되고 싶은가?

대학에서 컴퓨터공학(컴공) 전공인가?

C 언어를 배우고 싶은데 포인터(Pointer)가 어려워서 힘든가?

C 언어 하면 딱 떠오르는 것! 어려워 어려워.

바로 포인터다. Pointer.

나도 처음 C 언어 포인터(Pointer)를 공부할 때 정말 헷갈렸다.

방금 이해한 듯했지만 다시 보면 또 틀렸다.

그래서 이번 기회에 제대로 쉽게 정리하고자 한다.

어렵게 생각하지 말고 쉽게 설명했으니 천천히 읽어보길 바란다.

C 언어 포인터(Pointer)란? 

C언어에서 가장 큰 비중을 차지하는, 모르면 C를 할 수 없는 그 포인터의 정의를 내려본다.

정의 : 포인터는 메모리 주소를 저장하는 변수.

이것이 무슨 말일까? 메모리 주소를 저장한다?

변수는 값을 저장한다.

데이터 형에 따라 지정된 값을 저장한다. 

C에서 기본 데이터 형은

정수형 (int, short, long, long long),

실수형 (float, double, long double).

문자형 (char)

불린형, void형이 있다.

예를 들어보자.

정수형 int에는 실수형이나 문자형을 저장(할당)할 수 없다. 

사이즈에 맞게 정수만 저장 가능하다.

문자형 char에 숫자를 저장할 수 없다. ('3'처럼 따옴표를 붙이면 숫자가 아닌 문자임)

포인터 변수는 메모리 주소값만 저장 가능하다.

다시 강조한다.

포인터 변수는 숫자, 문자가 아닌 메모리 주소값만 저장 가능하다.

 

주소연산자 '&'와 메모리 주소

메모리 주소는 무엇을 의미하고 어떻게 쓰는가?

메모리에는 1byte 당 물리적 주소값이 있다.

10진수나 16진수로 표현할 수 있고 집주소처럼 번지값이 정해져 있다.

결과 : int_size=4

int 형 사이즈는 4byte다.

int 형으로 변수를 선언하면 4byte, 4개의 주소를 사용한다.

메모리

빨간색 숫자인 1001~1004까지가 int 형 변수 길이다.

5열 int 형 변수 i 선언 및 값 저장

위 코드 5라인을 보면 int 형 변수 i를 선언하고 바로 100을 저장(할당)했다. 

실행하면 int 형 i는 메모리 어딘가에 저장된다.

메모리 주소는 어떻게 확인할까?

바로 주소연산자인 &를 붙이면 된다.

주소를 확인하는 코드를 보자.

위 코드 8~10에서 printf 안에 &i 형태로 변수 i 앞에 주소 연산자 &를 붙였다.

빌드 후 실행 결과는 다음과 같다.

7번 라인은 i에 저장된 값 100을  출력했다.

8번 라인의 %d 결과는 6291100으로 변수 i의 주소값이 정수로 출력했다. (%d는 정수 매칭)

9번 라인의 %p 결과는 16진수로 출력했다. (%p는 포인트주소 16진수 매칭)

10번 라인의 %u 결과는 6291100으로 변수 i의 주소값이 정수로 출력했다. (%u는 포인트주소 10진수 매칭)

이제 우리는 변수의 메모리 주소를 주소연산자&를 붙여서 얻는 방법을 알았다.

정리하면,

변수 i만 사용하면 변수에 저장된 값 100을 꺼내오고

주소연산자(&)를 변수 앞에 붙인 &i는 주소값 6291100을 꺼내오게 된다.

 

참조연산자, 역참조연산자, 포인터변수 선언  '*' 

그렇다면,

주소연산자(&)로 받은 주소값은 저장할 수 있는가?

키보드 숫자 8에 있는 * 참조연산자를 사용하면 된다. (역참조도 있지만 쉽게 참조로 통일)

* 참조연산자는 주소(&)지의 문을 열어준다. 라고 생각하자.

주소지에 가면 주소값만 보인다.

주소지를 찾아가 문을 열고 실제 저장된 값을 보거나 또는 값을 다른 저장하려면 * 참조연산자가 필요하다.

* 참조연산자가  주소값을 가지고 찾아가 문을 연다.

이해가 되었는가?

사용 방법을 보자.

주소를 받을 포인트 변수가 필요하다.

처음 설명했던 부분이다.

포인터 변수는 메모리 주소값만 저장 가능하다.

참조연산자 를 사용하면 포인터 변수를 선언할 수 있다.

int* pa; 또는 int *pa;로 선언한다. 

int형 변수의 주소값을 저장하는 포인트 변수 pa를 선언한다.

*을 붙여 선언했으니 너는 이제 포인트형 변수가 되었다~라는 의미다.

*을 달고 pa에 저장된 주소값 위치로 가서 문을 열 수 있다고 이해하자.

 

int a = 10; 으로 변수 a를 선언하고 10을 저장한다.

pa = &a; pa는 변수의 주소값만 저장할 수 있다.

*로 선언된 포인트 변수 pa에 원하는 변수에 & 사용한 주소값을 저장한다.

여기서 잠깐! pa 앞에 왜? *가 없는가?

그 이유는 다음과 같다.

 

pa에 *를 붙이게 되면 pa에 저장된 주소(&a)로 가서 변수 a의 데이터를 꺼내거나 저장하는 작업을 시도한다.

pa에 주소를 저장하려면 * 붙이면 안되는 이유다. 

만약 *pa = &a;로 하면 오류가 나는데 이유는 *가 붙었기에 *pa는 해당 주소지에 가서 문을 열고 저장하려고 한다.

하지만 저장하려는 &a는 주소값이라 저장할 수 없어서 오류가 난다.

만약 주소를 받으려 했다면 포인트 변수로 선언한 pa가 저장된 주소지로 가서 문을 열게 하지 말고(* 없이)

pa를 사용해서 주소값(&a) 을 받아야 한다.

pa는 주소값을 받으려 int형으로 선언된 포인트 변수이기 때문이다.

 

int b; 선언하자.

b = &a; 는 오류가 난다. 왜? b는 포인트 변수가 아니라 주소값을 받을 수 없기 때문이다.

b = pa; 도 오류가 난다. 왜? pa에 a의 주소값이 저장되어 있다.

그런데 포인트 변수가 아닌 b에 시도했기 때문이다.

b = *pa; 는 어떨까?

*pa는 *가 붙어서 pa에 저장된 주소지로 찾아가 문을 열고 안의 값을 꺼내서 b에게 준다.

오류 없이 잘 실행된다.

 

주소연산자&와 참조연산자* 코딩하기

간단한 포인터 프로그램을 만들어 보자.

5번 라인 : int형 변수 a를 선언하고 숫자 100을 저장(할당)한다.

6번 라인 : int형 변수 b를 선언만 한다. 

8번 라인 : int형 포인트 변수 pa는 *을 사용해서 선언한다. 너는 이제 주소값만 받을 수 있다.

9번 라인 : int형 포인트 변수 pa는 &a 주소값을 저장해라!

10번 라인 : pa에 *가 붙어있다. pa에 저장된 주소값(&a)을 찾아가 그 값(100)을 받아 int형 변수 b에 저장해라!

12번 라인 : pa에 있는 주소값(&a)를 int형 변수 b에 저장하라! 안됩니다!!!!! 변수 b에는 정수만 가능합니다. 

주소값은 *이 붙여진 포인트형으로 선언된 변수만 가능합니다!!!

 

이제 포인트 변수, 참조연산자 *와 주소연산자 &에 대한 이야기가 끝났다.

기본 데이터형인 정수형, 실수형, 문자형에 적용된 이야기다.

배열, 문자열처럼 열이 들어간 데이터 형은 사용함에 다른 부분이 있다.

이 부분은 다음 시리즈에서 다뤄볼 예정이다.

사진: Unsplash 의 James Harrison

마지막으로,위 11번 라인을 보면 

b=*&a;

로 코딩되었는데 무슨 의미일까?

다음 시리즈에서 알려주겠다!

^^열코딩! 끝.

 

 

반응형