엔지니어
엔지니어는 기술적인 문제를 해결하는 데에 중점을 두는 개발자이다.
엔지니어 성향을 가진 사람들은 기술에 대한 열망과 호기심이 강하며 이것을 탐구하고 활용하는 과정에서 강한 성취감과 만족을 얻어낸다.
이들은 그 누구보다 앞서서 기술적인 문제를 스스로 발견하고 발견한 문제를 객관적으로 정의해낼 수 있으며 정의한 문제를 정확하고 빠르게 풀어내는 것에 집중한다.
엔지니어 성향을 가진 개발자들의 특징
분석적 사고
엔지니어 성향을 가진 개발자들은 주어진 기술적인 문제를 꼼꼼하게 분석하여 가능한 모든 해결책을 고려해내는 뛰어난 분석적 사고 능력을 가지고 있다.
분석적 사고를 갖춘 개발자들은 문제 해결에 필요한 정보를 수집하고, 이를 분석하여 최적의 해결책을 도출하는 과정에서 중요한 능력을 발휘한다. 이들은 문제를 파악하기 위해 세부적인 사항들을 주의깊게 관찰하며 가능한 모든 해결책을 자신이 가진 지식 내 외부에서 고려하고 각각의 해결책에 대해 논리적으로 검토한다.
현업에서 일을 하다보면 이런 특징을 가진 개발자들이 활약하게 되는 상황들이 심심치 않게 생긴다.
예를들어 알 수 없는 이유로 제품의 성능이 현저히 떨어지는 상황을 가정해보자.
엔지니어들은 문제가 발생한 시점과 상황을 조합하여 그 당시의 로그를 찾아내 추출하고, 그 로그를 세부적으로 분석하여 제품의 정확히 어떤 영역에서 문제가 발생하고 있는지 파악하고, 해당 영역에서 근본적인 원인을 분석하여 그 원인을 제거하거나 재발하지 않도록 보완한다.
엔지니어는 일련의 과정에서 상황을 분석했고, 그 상황의 로그를 분석했으며, 그 로그의 원인을 분석하여 해결한다.
또 다른 예를 들어보자. 이번에는 새로운 관리자 시스템을 개발해야 한다고 한다.
먼저 엔지니어는 시스템이 어떤 목적을 위해 사용될지, 어떤 문제를 해결하거나 어떤 기능을 수행해야 하는지 정확히 이해하는 과정을 먼저 거친다. 다음으로는 시스템이 만족시켜야 하는 요구사항을 정확하게 파악한다. 이를 위해 관리자와 시스템이 수행해야할 역할을 분리하고, 시스템이 수행해야 하는 작업을 분류하고, 시스템이 결국 어떻게 작동해야 하는지를 이해한다.
다음으로 엔지니어는 정리한 요구사항을 바탕으로 시스템을 설계한다. 이 단계에서는 시스템의 구조, 기능, 특성, 성능 등을 고려하여 설계하게 된다. 설계한 시스템을 실제로 만들기 위해 엔지니어는 적절한 기술과 도구를 사용하여 시스템을 구현한다.
시스템을 성공적으로 완성한 후, 시스템이 요구사항을 만족시키고, 안정적으로 작동하는지 테스트한다. 테스트를 통해 문제점이 발견되면 해결하고 시스템을 개선하여 마무리한다.
엔지니어는 일련의 과정에서 시스템의 목적을 분석했고, 최초 요구사항을 분석하였으며, 요구사항을 반영하여 완성될 시스템을 분석하여 설계했으며, 테스트를 통해 발견한 문제를 분석하여 해결함으로 시스템을 마무리한다.
이처럼 엔지니어는 분석적 사고를 통해 주어진 문제를 해결하기 앞서 먼저 모호하게 주어진 상황을 구조화하고 체계화하여 문제를 해결하기에 더 좋은 환경을 만들 수 있는 특징을 지니고있다.
논리적인 사고
엔지니어 성향을 가진 개발자들은 논리적인 사고를 바탕으로 문제를 해결하며, 자신의 결정을 합리적으로 근거 지을 수 있다. 이는 문제 해결에 필요한 합리적인 결정을 내리기 위해 논리적인 사고과정을 거치는 능력이다.
논리적인 사고를 하는 개발자는 그렇지 못한 개발자들보다 더 객관적인 관점을 가질 수 있고 전후관계가 명확한 결론을 내릴 수 있다.
논리적인 사고는 다음과 같은 과정을 거쳐 이루어진다.
- 문제를 이해하고, 문제의 세부 정보를 수집한다.
- 수집한 정보를 분석하고, 문제의 원인과 영향을 정확히 파악한다.
- 문제를 해결하기 위한 가설을 설정한다.
- 설정한 가설을 검증하고, 검증된 결과에 대한 증거를 수집한다.
- 검증 결과를 바탕으로 결론을 도출한다.
분석적 사고에서 들었던 예시를 다시 가져와보자. 애석하게도 여러분은 또 다시 알 수 없는 이유로 제품의 성능이 현저히 떨어지는 상황에 놓였다.
로그를 세부적으로 분석하였을 때 로직 중 특정 함수 내에서 문제가 발생한다고 파악해냈다. 해당 함수를 제외하고 서비스를 돌려보니 성능이 떨어지는 현상이 발생하지 않는다. 함수 내에서는 외부 서비스에 특정 값을 요청하여 받아내고 변수에 저장하고 반환하는 아주 간단한 작업을 수행하고 있었다. 먼저 가장 의심되는 외부 서비스와의 통신 시 레이턴시 문제가 아닐까에 대한 가설을 세운다. 외부 서비스를 목업하여 반환시간이 거의 없다시피하게 만들어 해당 로직을 다시 실행시켜본다. 외부 서비스가 있을 때와 없을 때의 시간 차이를 비교하여 재차 확인 후 결론을 내린다. 외부 서비스를 비동기로 호출하고 값을 곧바로 반환받지 않도록 시스템을 변경하여 문제를 해결한다.
엔지니어는 경험 상 외부서비스가 문제일거에요~ 하고 대답하고 끝낼 수 도 있지만 문제상황을 정확히 파악하여 문제 원인을 추리하고 그것을 검증하여 근거를 마련하여 논리적으로 외부서비스와의 통신 레이턴시가 문제였다는 결론을 내릴 수 있었다.
엔지니어 성향을 가진 개발자들은 논리적인 결정을 내리는 과정에서 감정적인 요소를 배제하려고 한다. 이러한 과정을 거쳐 합리적으로 문제를 해결하며 뛰어난 결과물을 제작할 수 있다.
기술적 지식
누군가에게 개발자로써 어떻게 성장해야 하냐고 묻는다면 주로 이 특징을 말하고는 한다.
엔지니어 성향을 가진 개발자들은 CS(Computer Science) 라는 전문적인 영역에서 쌓아놓은 지식을 토대로 자신이 다루는 언어와 프레임워크에 대해 깊게 이해하고 활용할 수 있으며 직업 생태계 특성상 기술의 변화가 빠르고(특히 프론트엔드 진영의 경우 일주일마다 새로운 업데이트가 나오는 기염을 토하기도 한다) 모두에게 열려있다보니 습득도 빠르게 할 수 있다.
이렇게 개발자들은 최신 기술과 트렌드를 주시하고 이를 적용하여 프로젝트를 진행한다. 이는 지속적인 학습과 자기계발에 노력을 기울이는 것으로 이어진다.
기술적 지식은 특히 깊게 확보해 놓았을 때 발생할 문제에 대하여 근본적인 해결을 할 수 있는 가능성이 더 높아지고 복잡한 문제도 곧바로 이해할 수 있는 힘의 원천이 되기도 한다.
문제를 분석해보았을 때 로직이나 외부 서비스 등에서 전혀 원인을 찾을 수 없는 상황이 생길 수 있다.
개발자들의 터닝 포인트가 언제냐고 묻는다면 가장 큰 부분이 이런 문제들을 맞닥뜨릴 때가 아닐까? 라고 대답하고 싶다. 내가 해결할 수 없는 문제를 마주함에 더 깊은 영역의 기술적 지식을 스스로 탐구하여 습득하게 되는 기회가 되고는 한다.
이런 예를 하나 들어보자. python 을 사용한 여러분의 서비스에서 메모리 릭이 자꾸 발생한다.
분명 로직 내에서는 변수도 제대로 초기화되고 있고 유닛 테스트에서도 아무런 문제가 없다. 그런데 이상하게 전체 로직을 돌렸을때만 릭이 발생하고 있다. 줄을 하나하나 따라가면서 성능을 테스트해본 결과 한 라이브러리의 메소드에서 발생하고 있다는 것을 발견해냈다. 그런데 이 라이브러리 ... c 로 작성 되어있다! 라이브러리에서는 c로 python에서 사용하는 메모리에 직접적으로 접근하고 있었고 이 메모리를 다루는 과정에서 python 이 메모리를 할당하고 해제하는 로직을 태우지 않고 있었다. 이에 해당 메소드를 호출했을 경우 메소드 내에서 사용된 변수 메모리가 그대로 남아 GC 가 처리하지 못하고 있었던 것이었다는 것을 발견한다. 로직 중에 이 메소드를 호출하고 할당을 해제시켜주는 wrapper 함수를 작성하여 대체한다. 이로써 문제가 해결되었다.
python 으로 개발을 하지만 python 만으로는 해결할 수 없는 문제가 발생했을 때 cpython 이 메모리를 어떻게 다루는지를 알고 있고 c 코드를 읽을 수 있는 기술적 지식을 가지고 있는 개발자는 이 문제를 해결할 수 있었다.
엔지니어 성향을 가진 개발자들은 이렇게 확습 해놓은 기술적 지식을 통해 문제를 해결하며 만약 사전에 지식이 없더라도 빠르게 학습하여 해결할 수 있는 특징을 지니고 있다.
창의성
엔지니어들은 문제를 해결하는 과정에서 기존에 나와있는 방법들을 그대로 사용하는 것도 충분히 효과적이지만 그 방법을 레퍼런스 삼아 새로운 방식이나 창의적인 아이디어를 제시하고, 새로운 기술을 도입하여 문제를 해결할 수 있는 능력을 가지고 있다. 이들은 문제를 해결하기 위해 넓고 다양한 관점에서 접근하며, 다양한 시도를 통해 새로운 해결책을 찾아낼 수 있다.
특히나 이것이 보통의 개발자와 엔지니어를 가르는 중요한 특징이라고 말하고 싶다.
보통의 개발자들은 레퍼런스를 찾아 적용하는데에 그치지만 이 창의성을 발휘하는 개발자들은 기존의 레퍼런스를 제품에 잘 맞도록 변형한다거나, 전혀 다른 영역에서 활용되는 방법론을 가져와 적용하는 등 여러가지 창의적인 시도를 하곤 한다.
그 과정에서 조직의 전체적인 개발문화에도 긍정적인 영향을 줄 수 있으며 더 나아가서는 전체 개발 트렌드에 직접적으로 기여하는 모습도 종종 볼 수 있다. 개발 생태계에서 새로운 라이브러리와 프레임워크들이 끊임없이 나올 수 있는 이유도 이것이라고 본다.
하지만 엔지니어 성향의 개발자들은 창의성을 통해 독창적인 아이디어를 생각해 내는 능력과 함께, 이를 기술적으로 구현하는 능력도 가지고 있어야 한다. 그저 창의적이기만 한 생각까지는 누구나 할 수 있지만 이것이 얼마나 가능성이 있을지, 그리고 어떻게 구현할지에 대해 검토하고 실체화 할 수 있는 것 까지가 비로소 엔지니어로써의 능력이라고 부를 수 있다.
엔지니어 성향을 가진 개발자들은 간혹 이상한 사람들이라는 주변사람들의 평가를 받고는 한다. 이 이상한점이 어쩌면 이들이 가지고 있는 창의성의 편린이 외부에 비쳐보인게 아닐까 하는 생각을 한다. 창의성이라는 특징은 한마디로 말하자면 기존과 다르게 생각하는 것이기 때문이다.
문제 해결 열망
엔지니어 성향을 가진 개발자들은 어려운 문제를 해결하고, 도전적인 프로젝트에 참여하는 것을 즐긴다.
이들은 어떤 문제든지 근본적인 원인을 파악하고, 효과적인 해결책을 찾아내기 위해 노력한다. 이러한 열망은 어떤 문제든지 포기하지 않고 꾸준히 해결하려는 의지로 이어지기도 한다.
문제 해결 열망은 다양한 형태로 나타날 수 있다. 복잡한 코드나 시스템을 분석하고, 문제를 해결하기 위해 다양한 방법을 시도한다. 또한, 새로운 기술이나 도구를 습득하여 이를 이용해 문제를 해결하는 방법을 찾기도 한다. 이들은 항상 더 나은 방법을 찾기 위해 노력하고, 문제를 해결하면서 더 나은 성과를 얻으려고한다.
문제를 분석하고, 논리적으로 사고하며 기술적인 지식을 탐구하고 창의적인 생각을 자주적으로 할 수 있게 만드는 원동력이 결국 이것이다. 문제를 해결하려는 열망을 엔지니어들은 언제나 가지고 있으며 그들은 누가 단계별로 마이크로매니징하지 않아도 스스로 움직인다.
엔지니어 성향을 가진 개발자들은 이 문제를 해결하기 위해 관련 기술과 도구들을 탐색하고 실험해 보며 최상의 해결책을 찾아내기 위해 노력한다. 이 때, 문제를 해결할 때에도 일시적인 해결책이 아니라 장기적인 안정성과 유지보수성을 고려하여 최적의 방법을 찾아내려고 한다.
따라서 엔지니어 성향을 가진 개발자들은 문제 해결에만 집중하는 것이 아니라, 해당 소프트웨어가 사용되는 다양한 환경에서도 안정적으로 작동하도록 고민하며, 기술적인 지식과 경험을 바탕으로 최적의 솔루션을 찾아낸다. 이러한 문제 해결 열망은 창의성과 더불어 개발 과정에서 매우 중요한 역할을 한다.
'가제: 메이커와 엔지니어' 카테고리의 다른 글
엔지니어는 뭐고 메이커는 뭔데? (0) | 2023.05.27 |
---|---|
제목 정하기 (0) | 2023.04.17 |
들어가기에 앞서 (2) | 2023.04.16 |