항상 말이 많은 주제이다. CS(Computer Science)에 대한 이론적 지식이 실질적으로 프로덕트를 생산하는 현업에 있어서 정말로 필요한가? 에 대한 논쟁이다. 운영체제/데이터베이스/자료구조와 같은 이름만 보면 상당히 고리타분해 보이는(...) 과목들을 배우는데, 이게 정말로 실제로 우리가 프로덕트를 만드는데 필요하냐는 주장이다. 요즘같은 시대에 널린게 오픈소스인데, 남들이 만들걸 가져다가 쓸줄만 알면 되는거 아닌가? 우리가 자동차를 만듦에 있어서 바퀴를 재발명하는게 옳은 일인가? 라는 논지이다.
결론만 두괄식으로 말하면 나는 CS 지식은 필요하다는 입장이다.
그 이유는 다음과 같다.
1. 지식이 많다는 것은 넓게 볼 수 있는 시야를 갖는다는 것이다.
= 아는 것이 많을 수록, 우리는 다양한 요소를 고려할 수 있고 판단할 수 있어진다. 내가 OOP를 모른다면, 왜 클래스를 활용해야 하는지 모를 테고, 나중에 결국 중복에 찌들어있는 코드로 된 거대한 문제에 부딪혀서야 앗차! 싶을 것이다. 내가 GC에 대해 모른다면, 복잡한 소프트웨어에서의 메모리 관리가 어려워질 것이다.
2. 컴퓨터는 결국 인간이 만들었고, 쓰이는 방식은 유사하다.
= 내 경험을 이야기해보겠다. 최근 아마존 S3를 활용해서 파일 관리 서버를 구축한 경험이 있다. 문제는 입출력의 가격이 매우 비싸다. 이 비싼 입출력을 해결하기 위해 나는 캐시서버를 도입하기로 했다. 하지만 캐시서버도 결국에는 HDD 용량에 한계가 있을테고, 파일이 쌓일 자리가 없어지지 않겠는가? 그런 순간이 온다면 어떻게 해야할까?
이부분에 있어서 페이지 교체 알고리즘을 적용한 캐시서버 데이터 관리를 도입하기로 했다. 이는 운영체제에서 배운다. 이런 형식으로, 컴퓨터에서 쓰이는 논리는 유사한 것이 많다고 생각한다. 수학적이고 통계적인 특정 알고리즘이 들어가지 않는 이상은 말이다. 왜냐면 다 사람이 만들었기 때문이다. 이러한 다른 사람들의 기본적이면서 단순한 논리들을 사전에 학습하는 것은 바람직한 일이라고 생각한다.
3. 상위 레벨에 가까워질수록 근본적인 원인을 알아야 한다.
= 일반적인 코딩을 생각해보면 라이브러리를 갖다쓰니, 근본적인 부분을 알 필요가 없다. 하지만 내가 라이브러리를 수정해서 사용해야 한다면 어떨까? 아니면 직접 더 효율적인 라이브러리를 구현해야 한다면 어떻게 될까?
개발자라면 내 소프트웨어가 더 빠르고 더 효율적이어야 한다고 생각할 것이다. 그렇다면 더 빠르고 더 효율적인 코드는 어떻게 만들어지는가? 이는 근본적인, 즉 로우 레벨의 코드 개념들(OS/ Asssembly)와의 조화도 필요한 부분이다.
인텔과 암드의 CPU를 비교할때, 같은 하드웨어 스펙이지만 인텔의 CPU에서 일반적으로 더 프레임이 뛰어난 경우가 대부분이었다. (요즘에는 아니라고 들었다..) 이는 결국 인텔 CPU와의 조화가 더 잘 맞는 구현이 되어있기 때문이다. 이런 고민들은 겉핥기를 할 때는 고민하지 않아도 되는 부분이지만 최종적으로는 상위 레벨의 개발자가 되기 위해서는 필요한 지식들이다.
뛰어난 개발자라면 다양한 지식을 알고 응용할 수 있을 것이다.
그렇다면 뛰어난 개발자가 되고 싶은데, 왜 이런 지식을 응용하기 위해 기반을 쌓는 것을 마다하겠는가?
'컴퓨터 공학' 카테고리의 다른 글
👉 [JAVA] JPA 및 관련 정의 (0) | 2022.02.21 |
---|---|
👉 [CS] Eager Loading vs Lazy Loading (0) | 2021.10.27 |
👉 [CS] Layered Pattern 레이어드 패턴 구현 (0) | 2021.07.11 |
👉 [CS] Docker 기반 Microservice 구현 (0) | 2021.07.06 |
👉 [Flask] Blueprint 활용하기 (라우팅 함수 관리) (0) | 2021.06.28 |