현대적인 프로그래머
Software 혹은 Application 을 위한 프로그래밍 언어, 프레임워크 그리고 라이브러리를 사용하기 위해 가이드 문서를 읽다 보면 ‘현대적’이라는 단어를 자주 접하게 됩니다. 사실 이 ‘현대적’ 인지 아닌지는 Software와 관련된 기술 도구에서 상당히 중요합니다.
프로그래머(엔지니어)도 ‘시대와 트렌드에 관심을 가지고 이에 대한 대응력을 갖춘 현대적인 프로그래머’가 되는게 좋을 것 같습니다.
이 ‘현대적’이라는 단어가 우리에게 얼마나 중요한지 살펴봅시다.
트렌드
트렌드는 항상 시대와 함께 변합니다.
그냥 Software에 국한된 이야기가 아닙니다. 패션 분야도 트렌드가 있습니다. 예를 들어 생각해봅시다. 우리나라는 전통 의상인 한복을 일상 생활에서 착용하다가 개화기 이후 부터 지금까지 서양 의복을 일상 생활에서 착용합니다. 이런 트렌드에서 한복을 착용하고 회사에 가면 팀원들이 놀랍니다.
‘… 무슨 일 있니?’
Software 시장에서 트렌드는 어떤게 있을까요?
90년대 초에 시작된 웹(Web)은 Software 관련 시장에서 절대 빼놓고 이야기할 수 없을 정도로 엄청난 트렌드를 타고 있습니다. 또한 비교적 최근인 Cloud 시장은 현재 대세에 합류되어 있습니다. 그리고 이러한 것들 외 Software라는 큰 대상 아래 갈리는 모든 분야들에서도 트렌드가 있을 것 입니다.
‘현대적’인게 얼마나 중요한지…
‘현대적인 기술’, ‘현대적인 언어’, ‘현대적인 프레임워크’ 에서 사용된 이 단어는 시대의 상황을 가장 잘 반영했다는 것을 지칭합니다. 여기에는 트렌드가 포함됩니다. 그리고 이러한 현대적인 면을 갖추는건 상당히 중요합니다.
요즘 현대적인 대세 아키텍처는 당연, 마이크로서비스 아키텍처입니다. 그런데 이 마이크로서비스 아키텍처를 90년대에 발표한다고 가정해보죠. 찬란한 박수를 받을 수 있을까요? 그렇지 못합니다. 90년대는 지금처럼 컴퓨팅을 위한 하드웨어가 싸고 보편적이지 못했습니다. 또한 오픈 소스의 성숙도도 낮았습니다. 비싼 비용을 지불하고 기업용 소프트웨어를 구매해야합니다. 그러한 90년대 상황에서 마이크로서비스 아키텍처는 현대적이지 못합니다.
딥러닝쪽도 동일합니다. 딥러닝은 지금 굉장히 현대적인 기술이 되었지만 그것의 씨앗이 된 80년대에는 현대적이지 못했습니다. 그렇기에 시장에서 관심을 얻지 못하고 보급화되는데 실패했습니다.
‘현대적’인 모습을 유지하는게 얼마나 힘든지…
앞서 언급했지만 트렌드는 시대가 진행되며 변화합니다. 이러한 트렌드를 반영하며 기술을 현대적으로 유지 보수하는건 엄청나게 힘겨운 일입니다. Software에서 그건, 어쩌면 불가능에 가까울 수 있습니다.
이유는 ‘하위 호환성’ 입니다.
프로그래밍 언어로 생각해봅시다. 특정 언어가 탄생할때는 그 시대를 가장 잘 반영한 현대적인 언어였을 것입니다. 시대가 지나고 변화하는 트렌드를 반영하기 위해 여러가지 기능들을 붙여 업그레이드합니다. 이 과정에서 이미 있던 기능을 현대적으로 바꿔야하지만 그건 어렵습니다. 기존에 그것으로 작성된 시장의 산출물들이 영향을 받기 때문입니다. 이러한 하위호환성을 지키며 현대적인 모습을 지키기 위해 살짝 억지로 가져다 붙입니다. 그리고 이것을 반복하다보면 결국 덕지 덕지 붙은 기괴한 언어가 됩니다.
프로그래밍 언어는 버전이 올라갈수록 ‘기능 추가’만 있지 ‘삭제’는 거의 없습니다.
물론 현대적인 모습 자체를 갖추지 않고 최초의 컨셉을 유지할 수도 있습니다. 하지만 미래가 그 최초의 컨셉을 허락하지 않는다면 ‘꼰대’가 되는거죠.
그런데 시대 바뀌어 역주행하는 놈도 가끔 있습니다.
구글은 기능에 아무런 문제가 없어도 현대적인 모습이 필요하면 내부적으로 싹다 깔끔히 다시 만든다는 이야기를 들은 적이 있습니다.
Spring framework는 지금 가장 위태로운 상황이라 생각합니다.
Node.js의 등장은 현대 웹 프레임워크 트렌드에 큰 영향을 미쳤습니다. 그 안에서 Spring framework는 현대적인 대열에서 밀려났습니다. 그리고 Spring의 생태계는 기존 Spring의 현대적인 모습을 위해 그 위에 Spring Boot를 쌓았습니다. 그리고나서 다시 좀 쓸만해졌습니다.
위태로운 상황이라고 판단한 이유는 바로 여기에 있습니다. Spring 생태계는 다음 트렌드 반영을 위해 Spring Boot 위로 다시 한 스택을 더 쌓을까요? 이 깊은 레이어를 유지할까요? 저도 궁금합니다…
레이어의 깊이로 인한 문제는… @Inject와 @Autowired 입니다.
이런걸 보면 지금 Spring Boot는 장기적인 프로젝트에서 조심스럽게 다뤄야할거 같습니다. 저도 Spring Boot를 사용할때 규정을 잘 지어야겠습니다.
이러한 상황에서 .NET 을 살펴보면 사실 조금 놀랍습니다.
마이크로소트는 크로스 플랫폼을 적용하면서 .NET부터 ASP.NET까지의 모습을 완전히 새롭게 디자인했습니다. 현대적인 모습을 위해 완전 뿌리부터 다시 만든거죠. 마이크로소프트 기술의 장점이 ‘미래를 앞서 간다’였는데 ‘유지,보수’ 능력도 있음을 느끼는 계기가 되었습니다.
또한 Node.js나 Flask같은 현대 프레임워크의 주도자, 생태계가 과연 향후 미래의 트렌드에 대응이 가능한 기술 조직인지 지켜봐야할 것 같습니다.
현대적인 프로그래머가 되자
우린 앞서 설명한 여러가지로 현대적인 모습을 갖추는게 얼마나 중요한지 알게 되었습니다. 하지만 이러한 것들은 기술 도구에서 국한되지 않습니다.
프로그래머도 현대적인 모습을 갖추려 노력해야 합니다.
특별한 제약이 없는데도 C++로 GUI 작성을 고집한다면 이는 현대적이라고 보기 어렵습니다. 더 큰 비용을 초래합니다.
(사실 이런건 조직 내 관리자들에게 해당하는 내용 같네요.)
여기서 어려운건 트렌드가 보여주는 모습이 내 목적에 맞는지 고민해야하는 것입니다. 현대에는 파이썬 언어로 웹 애플리케이션을 작성하는 경우가 많습니다. 그런데 정말 이 트렌드가 내 목적을 성공으로 이끄는데 맞는건지 판단해야할 것 같습니다.
트렌드를 탔지만 시장의 검증에 의해 별거 아닌 놈이 될 가능성도 높습니다. 이 검증은 꽤 오래걸리기에, 그 검증을 미리 판단하는 것은 우리의 기량 같습니다.
우리 모두 Node.js 프로그래머보다 애플리케이션 프로그래머로 남으면 좋을 것 같습니다.
마치며
‘시대와 트렌드에 관심을 가지고 이에 대한 대응력을 갖춘 현대적인 프로그래머’.
우리 모두 현대적인 프로그래머가 되기 위해 노력하는게 어떨까요?
저도 노력하겠습니다.