어쩌면 부정적으로 들릴 수도 있겠지만, 시니어와 주니어 소프트웨어 개발자 간의 구분은 우리의 직업과 직함에 내재되어 있습니다. 우리는 이를 초급 수준이라고 부르든 다른 이름으로 부르든, 경력을 시작한 사람과 어느 정도 경력을 쌓은 사람을 구분합니다. 모두가 여전히 배우고 있지만(그렇기를 바랍니다), 초급 개발자는 기본기를 배우고 있는 반면, 시니어는 더 큰 책임을 지고 있으며 더 큰 실수를 할 가능성도 있습니다. 초급 개발자는 기본적인 프로그래밍을 할 수 있지만, 그들의 지식이 반드시 깊거나 넓지는 않습니다. 이들이 직장에 들어가면서 지식을 심화시키고, 유료 고객을 위한 소프트웨어 시스템을 작성하는 팀의 일원이 되어야 합니다. 이 새로운 역할은 새로운 기술 세트를 개발하는 것을 요구합니다.
주니어와 시니어 소프트웨어 개발자 모두에게 필요한 기술은 매우 다양하지만, 몇 가지 공통된 주제가 있습니다. 주니어 개발자에게 기대하는 것은 다음과 같습니다:
물론, 개인마다 크게 다를 수 있습니다. 오픈 소스 프로젝트에 상당한 기여를 한 독학 프로그래머부터 JavaScript와 React의 차이를 이해하지 못할 수도 있는 부트캠프 수료자까지 다양합니다. 그럼에도 불구하고, 주니어 개발자에게 기대하는 기술에 대해 솔직히 말하자면, 이 목록은 대략 우리가 기대하는 바를 보여줍니다. SQL을 5년 동안 작성한 경험은 아닙니다.
시니어 개발자에게 기대하는 것은 다음과 같습니다:
프로그래밍 언어는 컴퓨터 과학의 핵심이 아닙니다. 하지만 필요합니다. 컴퓨터에게 무엇을 해야 하는지 알려주는 방법이죠. 한계 내에서 프로그래밍 언어는 모두 비슷합니다. 물론, 함수형 프로그래밍 옹호자들이 소리칠 수 있겠지만, 두세 가지 주요 프로그래밍 언어 클래스가 있으며, 각 언어는 소프트웨어 작성에 대한 중요한 아이디어를 표현합니다. 그러나 시니어 개발자에게는 긴 언어 목록보다 아이디어에 대한 친숙함이 더 중요합니다. 인간 언어에서도 같은 현상을 볼 수 있습니다. 한 외국어를 배우면 두 번째 언어는 더 쉽게 배우고, 세 번째나 네 번째 언어는 더욱 쉽게 배울 수 있습니다. 언어가 어떻게 작동하는지 이해하게 됩니다. 언어 자체는 빠르게 배우는 방법을 배우는 것만큼 중요하지 않습니다. 시니어 프로그래머는 프로그래밍 언어의 깊은 비밀도 알고 있습니다. 그것들은 기계와의 소통만큼이나 인간과의 소통에 관한 것입니다. 컴퓨터는 C++을 모르고, 소프트웨어가 Java, Haskell, 또는 BASIC으로 작성되었는지 신경 쓰지 않습니다. 소프트웨어가 어떻게 작성되었든, 결국 바이너리 기계 코드로 실행될 것입니다. 인간은 그들의 프로그램이 컴퓨터에게 무엇을 하라고 하는지 이해해야 합니다. 왜냐하면 지금 작성한 것은 나중에 누군가가 유지보수해야 하기 때문입니다.
알고리즘은 어떨까요? 예를 들어, 다양한 정렬 알고리즘을 배우는 것이 중요할까요? 정렬은 중요하지만, 주니어 개발자가 생각하는 이유와는 다릅니다. 거의 아무도 정렬 알고리즘을 구현할 필요는 없습니다. 단지 연습으로서만 필요할 뿐입니다. 정렬은 설명하기 쉽고, 다양한 솔루션이 있으며, 각 솔루션은 다른 특성을 가지고 있기 때문에 중요합니다. 솔루션은 문제 해결에 대한 다양한 접근 방식을 나타냅니다. 프로그래머는 정렬 방법을 알 필요는 없지만, 모든 프로그래머는 "분할 정복"으로 문제를 해결하는 방법, 재귀를 사용하는 방법, 성능을 추정하는 방법, 새로운 복사본을 생성하지 않고 데이터 구조를 조작하는 방법 등 정렬에 내재된 다양한 기술과 아이디어를 이해해야 합니다. 모든 언어의 라이브러리에 sort() 함수가 있다고 해서 정렬이 불필요하다고 생각하는 것은 주니어 프로그래머가 더 이상 발전하지 못할 징조입니다.
언어와 알고리즘은 기본적인 요소일 뿐입니다. 그것들은 시니어 개발자의 구별되는 특징이 아닙니다. 우리는 시니어 개발자가 더 넓고 깊은 지식을 갖기를 기대하지만, 시니어 개발자를 만드는 것은 목록의 다른 모든 것입니다: 팀워크, 대규모 프로젝트 작업 능력, 기업 요구 사항 이해, 멘토링, 그리고 우리가 나열하지 않은 많은 것들입니다. "경험"이라고 요약할 수 있지만, 그것은 별로 도움이 되지 않습니다. 경험이 무엇을 가르치는가요? 경험은 프로그래밍이 근본적으로 프로그래밍 언어에 관한 것이 아니라는 인식에서 시작됩니다. 프로그래밍 언어는 필요하지만, 시니어는 프로그래밍의 본질이 문제 해결이라는 것을 알고 있습니다: 문제를 이해하고 그것을 구조적이고 반복 가능한 방식으로 해결하는 방법을 알아내는 것입니다. 스탠포드 컴퓨터 과학 교수 Mehran Sahami는 Andrew Ng과의 대화에서 이렇게 말했습니다. "우리는 여러분에게 Python을 가르쳤지만, 사실 우리는 여러분이 문제를 체계적으로 생각하는 방법을 이해하도록 하려고 했습니다."
시니어는 또한 문제를 이해하는 것이 단순히 알고리즘을 생각해내는 것이 아님을 인식합니다. 문제를 해결하고자 하는 사람이 누구인지, 왜 해결하고자 하는지, 문제 해결에 비용을 지불하는 사람이 누구인지, 문제의 어떤 부분이 이미 해결되었는지, 가능한 다양한 해결책이 무엇인지, 그 해결책들이 확장 가능하거나 확장될 수 있는지 등을 이해하는 것입니다. 소프트웨어 프로젝트는 항상 과거와 미래를 가지고 있으며, 거의 항상 정치적 요소를 포함합니다. 시니어 개발자는 현재 프로젝트가 과거의 해결책과 연관되어야 하며, 미래의 문제와 해결책을 준비해야 한다는 것을 이해합니다. 우리는 주니어 개발자가 대규모 프로젝트의 작은 부분에서 유용한 작업을 수행하기를 기대합니다. 우리는 시니어가 더 큰 문제를 이해하기를 기대합니다: 프로젝트의 역사를 다루고, 그것이 미래에 유지보수 가능하도록 만드는 것입니다.
시니어 개발자는 또한 리더십을 발휘합니다. 꼭 공식적일 필요는 없습니다. 그룹을 공식적으로 이끄는 것 외에도, 리더십은 멘토링, 팀과 잘 협력하기, 상황이 격해졌을 때 이성적인 목소리가 되기, 어려운 결정을 내리기, 조직의 환경에 대해 폭넓게 알고 있는 것을 포함합니다: 도구는 무엇인가요? 어떤 자원이 이용 가능한가요? 조직의 정치적 상황은 어떤가요? 리더는 팀원들이 질문을 가지고 찾아가는 사람입니다.
시니어 개발자는 새로운 프로그래밍 언어를 빠르게 습득하는 능력을 넘어서는 고난도의 기술을 가지고 있습니다. 아마도 신화일 수도 있지만, 경험 많은 개발자는 버그가 있는 코드를 보고 "이건 수상해 보인다"고 말할 수 있는 능력이 있는 것처럼 보입니다. 그들은 많은 것을 보았기 때문에, 무엇이 옳고 무엇이 잘못되었는지 알고 있습니다. 버그가 숨어 있을 가능성이 있는 곳을 알고 있습니다. 그들은 많은 문제를 해결했으며, 어떤 해결책이 효과가 있을지 알고 있으며, 다양한 접근 방식을 테스트하는 방법도 알고 있습니다.
주니어 개발자가 시니어 개발자가 되는 것은 시간, 경험, 그리고 지도를 통해 이루어집니다. 교실 과제와 소규모 그룹 프로젝트를 넘어, 수년 동안 개발 중인 소프트웨어에서 작업하고, 당신이 떠난 후에도 여전히 개발 중일 소프트웨어에서 작업하는 것으로 성장해야 합니다. 전문 소프트웨어 개발은 거의 항상 레거시 코드를 포함합니다. 소프트웨어 개발의 대부분은 새로운 것을 만드는 것이 아니라 이미 존재하는 것을 유지보수하는 것입니다. 당신이 작성하는 모든 코드가 이미 있는 것과 어떻게 맞아떨어지는지, 그리고 미래에 있을 것과도 어떻게 맞아떨어지는지를 생각해야 합니다. 더 큰 디자인과 아키텍처를 생각해야 합니다. 그리고 이것은 또 다른 중요한 구분으로 이어집니다: 주니어 개발자는 종종 최신 트렌드와 새로운 프레임워크에 매료되지만, 시니어는 "지루한 기술"의 가치를 알고 있습니다.
AI 기반 코딩 도우미가 코드를 생성하는 것을 더욱 쉽게 만드는 지금, 주니어와 시니어에 대해 생각하는 것이 중요합니다. 코딩 도우미는 가치가 있으며 많은 노동을 절약해 줍니다. 소프트웨어 개발자에게 초능력을 부여합니다. 반복적인 보일러플레이트 코드를 작성할 수 있습니다. 그 코드는 필요하지만 재미있거나 만족스럽지는 않습니다. 그리고 적절히 사용될 때, 코딩 도우미는 개발자가 배우는 데 도움을 줄 수 있습니다. 하지만 불필요한 작업을 만들 수도 있습니다. Nat Torkington이 쓴 것처럼:
주니어가 자신이 작성하지 않은 코드를 제출할 때, 그들은 스스로 시니어의 비판적인 시각을 적용해야 합니다. 우리의 관례를 따르는가, 오류를 올바르게 처리하는가, 이 문제를 해결하는 최선의 방법인가 등을 스스로 판단해야 합니다. 주니어가 그렇지 않으면, 시니어에게 일을 만들어 주는 것입니다. 주니어가 AI 코드를 비판 없이 수용하여 시니어에게 제출하면, 주니어는 시니어가 해야 할 비판적인 작업을 시니어에게 떠넘기는 것입니다. 사실상, 주니어가 AI를 사용하면 시니어에게 일을 만들 수 있습니다.
그래서 AI 기반 코딩의 결과 중 하나는 주니어가 시니어의 일을 해야 한다는 것입니다. 아마도 그들이 완전히 준비되기 전에 말이죠. 그들은 더 큰 그림을 봐야 합니다. 자신의 작업 품질을 평가하는 것은 필수적인 기술이지만, 다른 사람의 작업을 평가하는 것은 시니어의 기술입니다. 프로그래밍의 가장 중요한 부분은 코드를 생성하는 것이 아닙니다. 문제를 전체적으로 이해하는 것입니다. 그것이 시니어 개발자가 하는 일입니다. 그리고 여기서 몇 가지 결론을 내릴 수 있습니다.
첫째, 우리는 너무 자주 회사들이 더 이상 주니어 개발자가 필요하지 않다고 말하는 것을 듣습니다. 아마도 그것은 사실일 수 있습니다. 하지만 여전히 시니어는 필요합니다. 주니어가 없다면 시니어는 어디서 나올까요? 그들은 나무에서 자라거나 문을 열고 들어오지 않습니다. 모두가 "경험 있는" 개발자를 원합니다. 경험을 쌓을 방법이 있어야 합니다.
둘째, 주니어 개발자가 시니어가 되기 위해 무엇을 가르쳐야 할까요? 학습은 단지 프로그래밍 언어, 라이브러리, 알고리즘에 관한 것이 아닙니다. 우리는 문제를 더 넓은 맥락에서 바라보는 능력, 소프트웨어가 시간이 지남에 따라 어떻게 발전하는지 생각하는 능력, 다른 사람과 소통하는 능력을 가르쳐야 합니다. 그리고 이것을 AI 도우미를 포함하는 워크플로의 일환으로 해야 합니다. Addy Osmani가 쓴 것처럼, 주니어는 "비판적 평가 사고방식을 구축하고 AI 도구를 효과적으로 사용하는 방법을 이해하는 데 집중해야 합니다." 우리의 경험에 따르면, 주니어 개발자는 AI를 효과적으로 사용하는 것을 배우는 것에 대해 열정적입니다. 하지만 이것은 기술 세트에 추가되는 것이며, 그 추가는 주니어와 시니어 간의 격차를 증가시킵니다. 그리고 시니어도 이러한 새로운 기술을 추가하기 위해 노력하고 있습니다. AI는 그들에게도, 최근 졸업생에게도 새로운 것입니다. 아마도 더 새로운 것입니다.
마지막으로, 코딩 도우미는 코딩에 능숙하지만, 코딩 도우미의 개발자는 직업의 나머지 부분에 상대적으로 적은 관심을 기울였습니다. 그들이 할 수 없다는 것은 아닙니다. 우리는 이미 몇 가지 도구를 가지고 있습니다. AI는 회의에서 메모를 작성하고, 대화를 기록하고, 요약하는 데 능숙합니다. 미래에는 AI가 더 많은 일을 할 수 있을 것입니다: 요구 사항을 협상하고, 정치적 문제를 해결하는 데 도움을 줄 것입니다. 하지만 아직은 아닙니다. 그리고 예, AI는 점차 대규모 코드베이스를 탐색하는 능력을 얻고 있지만, 여전히 어떻게 작동하는지 알고 비밀이 어디에 숨겨져 있는지 아는 인간이 필요합니다.
우리는 항상 시니어 개발자가 필요할 것입니다. 따라서 우리는 항상 주니어 개발자가 필요하며, 주니어가 시니어가 될 수 있는 경로도 필요합니다. AI를 우리의 워크플로에 통합하면서, 이러한 경로를 보존하고 유지하는 것에 대해 신중해야 합니다. 어떻게 멘토링을 직무 요구 사항에 포함시킬까요? 어떻게 새로운 직원들이 더 큰 그림을 보도록 장려할까요? 우리의 문화(그리고 우리의 전문 환경)가 점점 더 짧은 시간 척도에 맞춰져 있을 때 말이죠. 어떻게 사람들에게 문제 해결사가 되는 방법을 가르칠까요? 코드 생성자가 아니라 말이죠. 그리고 어떻게 사람들에게 협력하는 방법을 가르칠까요? 서로와 AI와 함께 말이죠. 이것이 우리가 해결해야 할 문제들입니다.
원문 : Seniors and Junior
댓글