기본이 중요하다.
1990년 초반부터 학교 그룹에서 C언어를 공부했다. 포인터 개념이 나오면서 포기하는 사람이 속출했다. "C언어를 모르면 개발자가 될 수 없다"는 말이 정설처럼 퍼져 있었다. 그래서 악착같이 배웠다. 포인터를 이해하려고 밤을 새웠다.
2000년대 초반 첫 프로젝트를 진행했다. ASP로 개발하라고 했다. C언어는 한 줄도 안 썼다. 두 번째 프로젝트는 PHP였다. 세 번째는 JSP였다. 네 번째는 Script였다. C언어는 그렇게 20년간 쓸 일이 없었다.
프로젝트마다 언어가 달랐다. 쇼핑몰은 PHP, 면세점은 JAVA, 체험관은 ActionScript, 앱은 Android였다. 언어를 바꿀 때마다 처음부터 다시 배워야 하나 걱정했다. 그런데 막상 시작하면 며칠이면 적응됐다.
변수 선언 방법만 다를 뿐, 기본적인 개념은 같았다. 조건문, 반복문, 함수. 구조는 똑같았다. 언어만 바뀌었지, 프로그래밍 방식은 동일했다. C언어로 배운 포인터는 안 썼지만, 변수와 함수의 개념은 모든 언어에 그대로 적용됐다.
함수를 이해하지 못하는 개발자를 여럿 봤다. 학원에서 "함수를 이렇게 쓴다"고만 배웠지, 왜 써야 하는지는 몰랐다. 파라미터에 무엇을 넣어야 하는지, 리턴은 왜 하는지 이해하지 못했다. - 이해보다는 그렇게 써야 한다고 암기를 해서 응용이 없었다. - 그러니 같은 코드를 10번, 20번 복사해서 붙여 넣고 수정만 했다. 3만 줄짜리 파일을 만든 여러 개발자도 그랬을 것이다.
함수는 프로그래밍의 핵심이다. 반복되는 코드를 하나로 묶는 도구다. 데이터를 넣으면 처리해서 결과를 돌려준다. 이 개념을 이해하면 어떤 언어든 함수를 쓸 수 있다. C의 함수나, Java의 메서드나, JavaScript의 함수나, 이름만 다를 뿐 원리는 같다.
클래스도 마찬가지다. 상속, 캡슐화, 다형성. 어려운 용어들이 나온다. 처음엔 이해가 안 됐다. 프로젝트를 하다 보니 필요성이 느껴졌다. 비슷한 기능을 하는 코드들을 묶어야 했다. 공통부분을 상속받아 쓰면 편했다. 이렇게 클래스의 의미를 알았다.
개념을 먼저 외우지 않았다. 코드를 먼저 짰다. 필요에 따라 구조를 만들었다. 나중에 책을 보니 그게 객체지향이었다. 용어를 몰랐을 뿐, 이미 쓰고 있었다.
신입 개발자가 물었다. "Python을 배워야 할까요? 요즘 AI 분야에서 많이 쓴다던데." 답했다. "유행보다는 하고 싶은 분야가 AI면 배워라. 웹 개발 하고 싶으면 JavaScript, node, java를 배워라." 언어는 도구다. 목적에 맞는 도구를 고르면 된다.
웹 프론트엔드는 HTML, CSS, JavaScript가 기본이다. React나 Vue는 그다음이다. 백엔드는 선택지가 많지 않다. PHP가 가장 많이 쓰인다. 중규모 이상은 JAVA다. 점차적으로 Node.js, go도 많이 쓰는 추세이다. 빅데이터는 Python이나 R이다. 게임은 C++이다. 앱은 안드로이드면 Java나 Kotlin, 아이폰이면 Swift다.
분야마다 적합한 언어가 있다. 하지만 그 언어를 마스터해야 개발자가 되는 건 아니다. 기본 개념과 그 언어의 철학을 알면 된다. 변수, 함수, 조건문, 반복문과 사용하고자 하는 언어의 철학을 이해하면 어떤 언어든 며칠만 파면 익숙해진다.
프로젝트에 투입되면 그 프로젝트에서 쓰는 언어를 배운다. 선택권은 없다. 고객이 JAVA로 개발하라면 JAVA로 한다. PHP로 하라면 PHP로 한다. 경력 15년 넘은 개발자도 새 프로젝트마다 그 기술을 다시 배운다. 언어가 처음이면 검색해서 배운다. 일주일이면 기본 구조를 파악한다. 2주일이면 개발을 시작한다.
언어 하나를 완벽하게 마스터하겠다는 생각은 비효율적이다. 10년 동안 C++ 만 팠는데, 회사가 Python으로 전환하면 다시 배워야 한다. 그때 "저는 C++ 만 할 줄 압니다"라고 하면 도태된다.
중요한 건 언어가 아니라 문제 해결 능력이다. 데이터를 어떻게 처리할지, 흐름을 어떻게 설계할지. 이런 것이 개발의 본질이다. 언어는 그걸 표현하는 수단일 뿐이다.
그래도 자료구조는 알아야 한다. 배열, 리스트, 스택, 큐. 데이터를 어떻게 저장하고 꺼내는지. 이건 언어와 무관하다. 개념이다. 이 개념을 알면 어떤 언어든 적용할 수 있다. Python에서 리스트 쓰는 방법과 Java에서 ArrayList 쓰는 방법은 다르지만, 리스트라는 개념은 같다.
알고리즘도 마찬가지다. 정렬, 탐색, 재귀. 문제를 풀어가는 논리다. 언어로 구현하기 전에 머릿속으로 먼저 푼다. 종이에 그려본다. 흐름을 정리한다. 그다음 코드로 옮긴다. 어떤 언어로 쓰든 논리는 같다.
학원에서는 언어를 가르친다. C를 가르치고, Java를 가르치고, Python을 가르친다. 하지만 문제 해결 방법은 안 가르친다. 함수를 왜 쓰는지, 언제 쓰는지 알려주지 않는다. 그래서 학원 수료하고도 개발 못 하는 사람이 많다.
현장에서 필요한 건 특정 언어의 숙련도가 아니다. 화면 설계서를 보고 데이터 흐름을 파악하는 능력이다. 이 기능을 구현하려면 어떤 구조가 필요한지 생각하는 힘이다. 막혔을 때 구글링해서 해결책을 찾는 검색력이다.
경력 20년이 넘었지만 여전히 새로운 언어를 배운다. 5년 전에 TypeScript를 익혔다. JavaScript에 타입을 추가한 언어다. 처음엔 낯설었다. 변수마다 타입을 지정해야 해서 귀찮았다. 한 달 쓰니 편해졌다. 오류가 미리 잡혔다. 지금은 TypeScript 없으면 불편하다. - 최근에는 prisma라는 db 컨트롤을 익혀 react, nextjs, nodejs, prisma로 개발하고 있다. 앱은 flutter와 Kotlin MultiPlatform으로 개발하고 있다. -
언어가 바뀌어도 당황하지 않는다. 어차피 변수, 함수, 조건문, 반복문이다. 문법만 다를 뿐, 구조는 같다. 새 언어를 배울 때마다 프로그래밍 언어는 도구일 뿐이라는 걸 느낀다. 중요한 건 그 도구로 무엇을 만드느냐다.
프로젝트에서 만난 개발자 중에 5개 언어를 능숙하게 쓰는 사람이 있었다. "어떻게 그렇게 많이 배웠냐"고 물었다. 그가 답했다. "언어를 배운 게 아니라 프로그래밍을 배웠다. 언어는 필요할 때마다 익힌다."
지금도 그 말이 맞다고 생각한다. 언어에 집착하지 않는다.
필요하면 배운다. 검색하고, 예제를 돌려보고, 적용한다.
어느 분야든 기본은 제일 중요하며, 기본 개념만큼은 자신의 것으로 만들어야 한다.
이후는 며칠이면 충분하다.
현장에서 살아남는 방법이다.