소프트웨어 엔지니어링

소프트웨어 엔지니어가 되는 법

삐멜 2019. 1. 22. 12:57


 내가 컴퓨터 공학을 전공하기로 했을 때 쯤 주변에서 컴퓨터 공학은 더 이상 발전 할 게 없고 이미 레드 오션이라는 말을 들었었다. 그래서 대학교에 진학 할 때 쯤 많은 걱정을 안고 있었다. 그러다 2학년 때 쯤 각종 클라우드 서비스와 인공지능이 붐을 일으켰고, 소프트웨어 엔지니어 수요는 기하 급수적으로 늘어났다. 그 붐에 힘입어 나도 어떻게 저떻게 취업을 했고 지금은 미국의 대기업 중 하나에서 소프트웨어 엔지니어로 일 하고 있다. 소프트웨어 업계의 전망과 급여에 매혹돼 요즘 많은 사람들이 소프트웨어 엔지니어로 전향하려는 경우가 많아지고, 따라서 나 같은 소프트웨어 업계 종사자들이 진로와 전망에 대해 많은 질문을 받곤 한다. 어디서부터 어떻게 시작해야되는지. 무슨 언어를 배워야 하는지, 어떤 자격증을 따야 하는지, 심지어는 이제 막 컴공으로 대학교에 들어가는데 어떤 노트북을 사야 하는지 까지도. 그래서 오늘 이 블로그를 통해서 컴퓨터 공학을 전공하지 않은 사람이 어떻게 해야 소프트웨어 엔지니어로 성장 할 수 있는지에 대해 이야기 해 보려고 한다.


 하지만, 내가 컴퓨터 공학을 전공한 사람으로서 컴퓨터 공학 백그라운드가 없는 사람의 어려움을 이해 할 수 있을까?

 나는 분명 컴공을 전공했지만 컴퓨터를 전혀 모르는 사람의 어려움을 이해 할 수 있다. 나도 처음 대학교에 들어 왔을 때 아무것도 몰랐기 때문이다. 주변에는 어려서부터 알고리즘 대회에 나갔던 사람도 있었고 이미 스타트업을 창업해 소프트웨어 사업을 하고 있는 사람도 있었다. 그리고 당시 내가 할 줄 아는 것은 "Hello World"를 검은 터미널 화면에 찍는 것 뿐이었다. 나는 대학교 2학년이 끝나갈 무렵까지 서버-클라이언트 개념을 몰랐고 프로그램이란건 여러가지 언어를 혼합해 만드는 것이라고 생각했다. 물론 내가 대학교육을 받지 않은 채로 소프트웨어 엔지니어링을 시작하는 사람들의 어려움을 완전히 이해 할 순 없을 것이다. 하지만 나는 무엇을 어떻게 배워야 소프트웨어 엔지니어가 되는지 알고 있다. 그래서 이 포스트를 통해 소프트웨어 엔지니어로 성장하고 싶은 사람들에게 어떤 준비를 거쳐야 소프트웨어 엔지니어가 될 수 있는지 전하고자 한다.


 정말 학위 없이도 소프트웨어 엔지니어가 될 수 있을까?

  학위가 있다는 것은 정말 좋은 일이다. 하지만 소프트웨어 업계에서는 학위가 모든것을 결정하지 않는다. 나는 한국에 있는 대학을 나왔고, 미국에서는 한국인이 아니면 거의 아무도 내가 나온 대학을 모른다. 그럼에도 불구하고 마이크로소프트, 구글, 아마존, 디즈니 등에서 면접 제의를 받았었고 아직도 링크드인을 통해 일주일에 두 세개씩 면접 제의를 받는다. 그리고 다행히도 소프트웨어 업계는 당신이 어떤 대학을 나왔든 면접에서 그 실력이 밝혀지게 되어있다. 신기하게도 명문대에서 컴공을 졸업하고도 취업을 못하는 사람들이 꽤 있다.

 나는 솔직히 한국의 취업 사정을 잘 모른다. 대학 졸업 후 바로 미국으로 넘어왔고, 동기들이 취업 준비를 하던 당시 나는 미국 회사들과 전화 인터뷰를 보곤 했다. 학위를 많이 고려하는 한국 취업시장을 보았을 때, 한국에서 학위 없이 소프트웨어 엔지니어가 되는 것이 힘들 수도 있다고 생각한다. 솔직한 마음으로 나는 이 블로그를 읽는 모든 삐멜 독자들이 한국 시장을 탈출하길 바란다. 해외의 소프트웨어 엔지니어의 수요는 가히 폭발적이라 국내보다 임금도 대우도 훨씬 좋기 때문이다. 이 글은 소프트웨어 엔지니어로 성장하고 싶은 모든 사람들을 위한 글이지만, 가능하다면 동종업계에서 일하는 사람들이 좋은 대우를 받고 일하길 바라는 마음이다.

 

 소프트웨어 엔지니어가 되는 법

영어 배우기

 당신이 영어와 어떤 악연을 가지고 있던 소프트웨어 엔지니어가 되기 위해서 영어는 필수이다. 해외로 나갈 생각이 없다면 말하기는 거의 할 일이 없을 테지만, 영어 듣기, 읽기, 쓰기를 할 수 있다면 당신의 가능성은 기하급수적으로 올라간다. 컴퓨터 언어는 보통 영어로 되어있다. 당신은 영어로 대부분의 프로그램을 작성하게 될 것이고, 그 언어에 대한 설명이나 에러 메시지에 대한 해결 방법도 영어로 작성된게 훨씬 많다. 개발을 하면서 네이버에 검색하는 것을 *앨런 튜링에게 죄를 짓는 것과 같다. 구글에 검색해라. 원어민처럼 말 하는 것을 요구하는 것이 아니다. 지금부터라도 조금씩 이해하려고 노력해라. 전 세계의 개발자들과 자유롭게 소통 할 수 있다는 것은 소프트웨어 엔지니어로서 엄청난 장점이 될 것이다.

프로그래밍/스크립팅 언어

  • 프로그래밍 언어: C, Java, C#, C++, Go ...
  • 스크립팅 언어: Python, Shell, Javascript, ...

 어떤 프로그래밍 언어를 배워야 하는가? C? Java? Python? C#? Javascript? C++? Go?
 그냥 배우고 싶은 것을 배워라. 다만 본인이 웹 개발에 관심이 있다면 웹 개발에 주로 쓰이는 언어를 배우는 것이 좋을 것이다. 마찬가지로 데이터 사이언티스트 쪽에 관심이 있다면 Python을 배우는 것이 더 도움이 될 것이다. 하지만 기본적으로 봤을 때, 무슨 언어를 아느냐는 그렇게 중요하지 않다. 나는 자바를 주로 사용하고 있지만 대학 시절에는 C를 더 많이 썼다. 요즘은 기계학습을 공부하면서 Python을 배우고 있지만 Javascript, C++, C#, Lisp 심지어는 Fortran을 쓰던 적도 있었다. 지금 자바 말고 다른 언어로 완전한 프로그램을 만들 수 있을까? 없다. 비록 이 언어들로 한 때 코딩을 했지만 지금은 하나도 기억나지 않는다. 
 언어는 도구에 불과하다. 언어는 우리가 프로그램에게 무엇을 해야하는지 표현하기 위한 툴일 뿐이다. 얼마나 많은 언어를 아는지는 크게 중요하지 않다. 정말 중요한 것은 언어를 빠르게 습득해서 사용 할 수 있는 능력이다. 소프트웨어 엔지니어가 되고 싶다면 적어도 하나의 언어는 알아야한다. 보통 프로그래밍 언어와 스크립팅 언어 이렇게 두개를 아는 것이 적당하다고 본다. 

  ** 프로그래밍 언어와 스크립팅 언어의 차이점에 대해서 리서치해보기 바란다. 

자료구조와 알고리즘

  당신은 이제 당신이 선택한 언어의 사용법을 알 것이다. 변수 사용법, 기본 자료형, 조건문, 반복문, 함수, 심지어 클래스를 사용하는 방법도 알 것이다. 아마도 구구단 출력이나 계산기같은 프로그램을 작성했을 것이다. 근데 뭐? 그래서 이게 뭐 어쨌단거지? 터미널에서 돌아가는 구구단이나 계산기 프로그램은 우리가 매일 사용하는 프로그램에 근접하지도 못한다. 그럼 여기서 더 뭘 배워야 앵그리버드나 구글같은 프로그램을 만들 수 있을까? 
 당신이 프로그램 하나를 작성할 때 마다 당신은 자료구조를 사용하고 알고리즘을 작성한다. 아주 쉽게 말해서 데이터를 가지고 있는 변수들이 자료구조이고 프로그램의 행동이 알고리즘이다. 당신은 변수와, 함수, 또 함수들 사이의 상호작용을 정의한다. 그것이 하나의 완전한 프로그램이 되는 것이다. 자료구조와 알고리즘을 알아야지만 구구단과 계산기를 벗어난 더 큰 규모의 어플리케이션을 만들 수 있게 된다. 따라서 소프트웨어 엔지니어에게 자료구조와 알고리즘은 필수이다. 반드시 배워야한다. 

 다음과 같은 기본적인 자료구조와 알고리즘을 필수로 공부하길 바란다. 

 자료구조

  • 배열(Array)
  • 리스트(List): Doubly Linked List / Singly Linked List
  • 스택(Stack)
  • 큐(Queue)
  • 맵(Map)
  • 셋(Set)
  • 트리/바이너리 트리 (Tree/Binary Tree)
  • 프라이오리티 큐(Priority Queue)
  • 그래프(Graph)

알고리즘 (*자료구조를 선행했음을 가정한다.)
  • 검색 알고리즘 (Search Algorithms): Linear, Binary, 너비 우선(Breadth-first), 깊이 우선(Depth-first)
  • 정렬 알고리즘 (Sorting Algorithms): 버블소트(Bubble Sort), 셀렉션 소트(Selection Sort), 퀵 소트(Quick Sort), 머지소트(Merge Sort), 힙 소트(Heap Sort)
  • 동적 프로그래밍 (Dynamic Programming)
  • 최단거리 찾기 알고리즘 ((Optional) Shortest-path Algorithms): Bellman-Ford Dijkstra

 어떤 자료구조나 알고리즘을 알고 있다는 것은
  • 그 자료구조/알고리즘이 왜 사용되는지, (당신이 배운 언어로) 어떻게 사용 하는지 안다는 뜻이다.
  • 그 자료구조/알고리즘의 Best, Average, Worst-Case의 시간 및 공간 복잡도를 알고 있다는 뜻이다. 그러나 주의 할 것은, 이 말이 각 자료구조의 특징과 오퍼레이션(삽입/검색/삭제/등등..)의 시간복잡도와 공간복잡도를 전부 외우라는 뜻이 아니다. 이 말의 본 뜻은, 어떤 자료구조/알고리즘의 동작 방식과 구현 디테일을 알고 있고 따라서 시간 복잡도와 공간 복잡도를 머리속에서 계산 할 수 있다는 뜻이다. 이 과정은 시간이 조금 걸릴 수 있다. 괜찮다. 하다보면 나아진다. 나도 6개월에 한번씩 자료구조와 알고리즘을 다시 공부한다. 언어는 잊어도 되지만 자료구조와 알고리즘은 잊으면 절대 안되기 때문에!
  • 그 자료구조/알고리즘을 단 한번이라도 직접 구현 해 본적이 있다. 혹자는 이미 다른 사람들이 배포한 라이브러리가 있는데 굳이 왜 직접 구현해야 하냐고 묻는다. 하지만 다시 생각해보기 바란다. 이런 기본적인 자료구조와 알고리즘도 구현하지 못하는데 세상을 뒤흔들 어플리케이션은 어떻게 만들 것인가?

연습하기

코딩을 통해 연습하기

 요즘은 LeetcodeHacker Rank같은 사이트 들이 많이 있어 프로그래밍 문제와 답을 접하기 굉장히 쉽다. 국내에는 다음과 같은 사이트들이 있다.
 
코딩을 어떻게 시작해야 할지 막막할땐 다음을 참고해라. 내가 쓰는 방법이다.
  • 종이와 펜을 준비해라.
  • 문제에 주어진 입력과 출력을 다시 한번 확인해라. (종이에 적던지)
  • 본인이 직접 입력값을 생각 해 보고, 그에 따른 출력이 뭐가 되어야 하는지 생각해봐라. 
  • 본인이 어떻게 그 출력을 도출했는지 도식화 해봐라.
  • 당신이 배운 자료구조 중에서 무엇을 사용 할 수 있을지 생각해봐라.
  • 문제의 본질을 확인해라. 검색 문제인지, 정렬 문제인지, 최단거리 문제인지, 둘 다인지. 아무것도 아닌것 같으면 동적 프로그래밍을 시도해봐라.
  • 종이에 슈도 코드로(pseudo-code) 작성해봐라. (면접시 이게 가장 도움이 될 것이다.) 

그리고 제발 한번에 당신의 알고리즘이 돌아갈 것이라는 망상을 버려라. 당신이 한 줄의 코드를 작성하면 거기서 두 개의 버그가 나올 것이다. 인내심을 가져라. 

프로그램 작성하기

 소규모 프로젝트를 통해 완전한 프로그램을 만들어 보는 것은 프로그래밍 실력 향상에 큰 도움이 될 것이다. UI가 화려하고 기능이 많은 프로그램일 필요는 없다. 터미널에서 돌아가는 작은 프로그램들을 만들어봐라. 어떤 인풋, 아웃풋이 필요한지 어떤 자료구조와 알고리즘이 필요한지 잘 생각해봐라.


연락처 앱의 예 (그렇다. 이 블로그를 위해 직접 만들었다.)

 

  • 연락처 앱 : 이름, 이메일, 폰번호를 저장/보기/삭제 할 수 있는 연락처 앱.
  • 가상의 자판기 앱: 돈을 넣으면 자판기에서 물/콜라/사이다 등등이 뽑히고 거스름돈을 출력하는 앱. 어드민 기능을 넣어서 재고가 다 떨어지면 다시 넣는 기능을 넣으면 더 좋다.
  • 가상의 주차장 앱: 주차 가능한 장소의 번호를 출력하고 번호판 입력시 주차장소를 배정하고 제거하고 하는 앱. 다른 기능들은 자유롭게 생각 해 보아라.
  • To Do 웹 앱 : 웹 앱을 만드는 것은 조금 어려울 수도 있는데, 요즘에는 튜토리얼들이 많이 나와있어 따라하면 된다. (웹 앱 튜토리얼도 곧 올릴 것이니 참고해도 좋다.)

 이 연습의 핵심은 스스로 요구 사항을 정의해보고, 완전히 돌아가는 프로그램을 작성 해 보는 것이다. 이 연습을 통해 당신은 생전 듣도 보도 못한 버그를 접하고, 길고 외로운 밤들을 보내고, 마지막에는 작은 성취감을 경험 하게 될 것이다.



 보통 프로그래밍 튜토리얼/가이드라인 블로그는 여기서 끝을 맺는다. 자료구조와 알고리즘을 안다면 기본적으로 프로그래머로서의 소양은 갖추게 된 셈이다. 자료구조와 알고리즘을 열심히 공부했다면 코딩 인터뷰도 당연 잘 볼 것이다. 하지만 소프트웨어 엔지니어가 되려면 자료구조와 알고리즘 너머의 무언가를 알아야 한다. 자료구조와 알고리즘 너머에 무엇이 있을까?

프로그램은 어떻게 돌아갈까?

 당신은 이제 당신이 선택안 언어로 기본적인 자료구조와 알고리즘을 사용 할 수 있고, 작은 규모의 프로그램도 만들 수 있을 것이다. 하지만 당신이 만든 프로그램을 돌렸을 때, 무슨 일이 일어나는지 정말 알고 있는가? 

프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 말한다. (위키)

 만약 위의 말이 무슨 뜻인지 전혀 모르겠다면, 운영 체제와 시스템 아키텍처를 배워야 한다는 뜻이다!

 솔직히 말하자면 운영체제와 시스템 아키텍처를 몰라도 엔트리-레벨(entry-level) 소프트웨어 엔지니어로 취직 할 수는 있다. 왜냐하면 가장 낮은 단계의 소프트웨어 엔지니어는 대게 프로그래머의 일을 하기 때문이다. 보통 사람들은 프로그래머와 소프트웨어 엔지니어를 같은 용어로 사용하지만 나는 이 두 용어를 분류하고자 한다. 나에게 프로그래머란, 인풋, 아웃풋, 함수의 내용을 알아야 프로그램을 작성 할 수 있는 사람을 말한다. 소프트웨어 엔지니어는 인풋, 아웃풋을 요구사항으로 부터 도출 할 수 있다. 소프트웨어 엔지니어는 어떤 자료구조와 알고리즘을 사용해야 하는 지 알고, 특정 자료구조와 알고리즘의 단점에도 불구하고 왜 사용해야하는지 설명 할 수 있다. 또한 소프트웨어 엔지니어는 어플리케이션의 버그나, 병목현상, 또는 경쟁상태를 찾아내고 해결 할 수 있다. 연락처 앱을 예로 들면, 프로그래머는 "이름|이메일|폰번호 순으로 저장되어있는 텍스트파일에서 폰번호로 "바이너리 서치"를 이용해 검색하는 함수를 만들어라"라는 일을 받았을 때 함수를 무리 없이 작성 할 수 있다. 소프트웨어 엔지니어는, 같은 작업에서 과연 바이너리 서치를 사용 하는 것이 옳은가, 이름|이메일|폰번호를 텍스트 파일이 아닌 더 디스크 효율이 좋은 방식으로 저장 할 순 없을까, 이 함수는 전체 프로그램에서 어떤 역할을 하는가, 내가 파일을 읽고 있는 사이 다른 프로그램이 이 텍스트 파일을 수정하면 어떻게 되는 가 등등의 복합적이고 다양하게 프로그램을 분석 할 수 있다.

 운영 체제를 배우면 뭐가 좋을까?
  • 당신의 프로그램은 항상 운영체제나 비슷한 미들웨어 위에서 돌것이다.
  • 운영체제는 하나의 거대한 프로그램이다. 당신이 배운 자료구조와 알고리즘들이 운영체제에서 다 쓰이고 있다. 운영체제를 공부함으로서 그 자료구조와 알고리즘이 어떤 문제를 해결했는지 배우게 될 것이다. 그걸 왜 배워야 하나? 소프트웨어 엔지니어로 살다보면 결국 운영체제가 해결하려고 했던 것과 아주 비슷한 문제들을 경험하게 된다. 예를들어 분산시스템은 운영체제가 갖고 있는 문제들을 거의 다 갖고있다. 또 하이퍼바이저라고 불리는 서버 가상화 기술은 운영체제의 운영체제 느낌으로 접근하면 이해하기 쉽다.
  • 소스가 공개된 운영체제가 있다. (예: 리눅스) 운영체제는 당신이 무료로 코드를 볼 수 있는 가장 큰 시스템 중의 하나라고 생각하면 된다. 
  • 운영체제에 대해 설명해주는 많은 자료들이 있으므로 코드를 뒤져가며 고생하지 않아도 된다.

 운영 체제를 배우면 소위말해 빅픽쳐를 볼 수 있게 된다. 당신의 프로그램 혹은 프로그램들이 큰 시스템의 틀 안에서 어떻게 동작하는 지 이해하게 된다는 뜻이기도 하다. 운영 체제를 배우는 것은 첫 프로그래밍 언어를 배우는 것과 매우 흡사하다. 처음으로 이렇게 큰 시스템을 배우는 것은 어렵다. 하지만 그 다음에 다른 큰 시스템을 배우는 것은 쉬워진다. 

주의! 운영 체제를 이해하는 것은 쉽지 않다. 나는 대학시절 운영체제 책을 두번이나 읽고도 무슨 소리인지 하나도 못알아들었다. 3-4번 반복하고, 코딩하고, 리눅스 코드를 뜯어본 후에야 운영체제를 조금 이해하기 시작했다. 시스템을 이해는 것은 어려운 일이다. 그러니 인내심을 가지고 공부하길 바란다. 

운영체제에서 배워야 할 중요한 컨셉은 다음과 같다.
  • 프로세스 매니지먼트: 프로세스, 스케줄링, 프로세스 간 통신, 동기화
  • 메모리 매니지먼트: 메모리 할당, 페이지와 세그먼트, 가상메모리
  • 네트워킹:  인터넷, OSI 7계층과 TCP/IP 프로토콜, 서버-클라이언트 모델, DNS, HTTP, 라우팅 테이블과 라우팅 알고리즘(그래프 이론과 최단거리 알고리즘이 어떻게 이용되는지 확인해라!)

자료구조/알고리즘과 마찬가지로 나는 운영 체제도 6개월에 한번씩 반복해서 읽는다. 나는 새 직장에 갈 때마다 ramp-up을 빨리 한다는 칭찬을 자주 듣곤 한다. ramp-up이란 새로 시작한 엔지니어가 새 회사의 도메인/시스템/아키텍쳐를 이해하고 코드 컨트리뷰션을 하게 되는 과정인데 개인 차가 있겠지만 보통 몇 주에서 2-3개월까지 걸리기도 한다. 내가 시스템을 빠르게 이해하는 이유는 운영 체제를 반복해서 공부하기 때문이란 것을 알고 있다. 예를들면, 분산 시스템의 세계에서 마이크로 서비스는 메시지 큐를 이용해 서로 통신한다. 당신이 그냥 작은 프로그램을 만들어보거나, 코딩 사이트에서 코딩하는 방식으로만 공부를 했다면 메시지 큐를 사용하는 일은 전혀 없을지도 모른다. 하지만 많은 회사들이 메시지 큐를 이용한다. 당신의 회사가 카프카(Kafka)를 사용한다고 치자. 당신은 카프카를 들어본적도 사용 해 본 적도 없지만 카프카의 설명을 읽는 순간 그 메커니즘이 운영체제의 프로세스간 통신과 매우 비슷하다는 사실을 깨달을 것이다. 따라서 당신은 카프카가 갖고있는 디테일과 장점을 이해하기 더 쉬울 것이다.

 참고로 내가 읽는 책은 운영체제 내부구조 및 설계원리 - William Stallings 와 컴퓨터 시스템 - Randal Bryant 이다. 본인이 원하는 강의/블로그/책을 통해 공부하길 바란다.


이제 혼자 알아서 해라

 위의 과정을 성공적으로 마쳤다면 당신은
  • 적어도 한 개의 프로그래밍 언어를 자유롭게 사용할 수 있다.
  • 자료구조와 알고리즘을 안다.
  • 코딩 연습을 많이 했다.
  • 프로그램을 시작하면 CPU 레벨까지 무슨일이 일어나는지 안다. (개념적으로)
  • 당신의 로컬 변수가 물리적으로 어디에 저장되는지 안다.
  • 당신의 코드가 실행 당시 물리적으로 어디에 저장되는지 안다.
  • 배열과 리스트가 메모리 레벨에서 어떤 차이가 있는지 안다. (어디에 할당되는지 어떻게 할당되는지 등등)
  • 커널이 무엇인지 뭘 하는지 안다.
  • 멀티태스킹이 어떻게 가능한지 안다.
  • 브라우저에 url을 입력하고 엔터를 누르면 무슨 일이 일어나는지 프레임 레벨까지 안다. (개념적으로)

 당신은 이제 소프트웨 엔지니어다. 이제 당신은 혼자 알아서 하고 싶은 것을 하면 된다. 웹을 배우고 싶다면 스프링 프레임웤이나 node.js등으로 웹 앱을 만들어 봐라. AWS에 EC2 인스턴스를 올리고 실제로 웹 서비스를 운영 해봐라. 앞으로 뭔가 하고싶은게 있다면 웹에 널린 튜토리얼을 보고 따라하면 된다. 종종 여러가지 튜토리얼을 올릴테니 참고하길 바란다. 

더 배울만한 것들 

툴 :
  •  GIT/SVN
  • IDE(Eclipse or IntelliJ)
  • SQL
  • Gradle/Maven(컴파일러)
컨셉
  • 객체지향디자인/디자인 패턴
  • 분산 시스템 (Docker, Kubernetes, Hadoop, Kafka 등등)
  • 클라우드 컴퓨팅(AWS, MS Azure, Google Cloud)
  • 소프트웨어 개발 방법론(Agile, Test-Driven Development)

 이 포스트에서 제시한 방법 이외에도 훌륭한 소프트웨어 엔지니어가 되는 방법이 있을 것이다. 내가 밟아왔고 추천 했던 방신이 모든 사람에게 맞지 않으리란 것도 알고 있다. 또한 각자의 목표에 따라 (그저 개발자가 되고 싶은 것이라면 시스템 아키텍쳐는 몰라도 될 지 모른다.) 이 포스트에서 나열한 것들이 너무 적거나 너무 많을지도 모른다. 하지만 당신이 소프트웨어 엔지니어를 커리어로 결정했다면, 언젠가 반드시 큰 시스템을 배워야 하는 시기가 온다. 다시 말해 운영체제만큼 크거나 그보다 더 큰 시스템을 배워야 한다는 점은 변함이 없다는 뜻이다. 그러니 시간이 충분할 때 미리 공부 해 두길 바란다.