ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소프트웨어 엔지니어로 취업하기 전에 알면 좋은것들
    소프트웨어 엔지니어링 2019. 5. 13. 12:34

    이 포스트에서는 개발자/소프트웨어 엔지니어로 첫 직장에 들어가기 전에 알면 좋은 것들에 대해서 이야기 한다. 소프트웨어 엔지니어가 되기위해서는 자료구조와 알고리즘을 어느정도 반드시 알아야 한다. 따라서 이 글의 독자들은 자료구조와 알고리즘을 어느정도 알고있다고 가정한다. 이 포스트에서는 내가 '미리 알았다면 도움이 더 좋았을텐데', 또는 ‘이거 알고 취업해서 다행이다.’라고 생각하게 한 기술과 툴에 대해 소개하려고 한다.

    디자인 패턴(Design Patterns)

     코딩을 하는 것이 소프트웨어 엔지니어의 유일한 가치는 아니다. 코딩을 하는것은 소프트웨어 엔지니어의 기본이라고 생각하면 된다. 여러분이 코딩을 이제 잘 한다고 하자. 리트코드와 같은 코딩 사이트에서 가장 효율적인 방법으로 여러가지 알고리즘 문제를 풀 수 있다고 하자. 그 코드는 확장 가능한가? 그 코드는 유지보수가 쉬운가? 이제 그냥 성능이 좋은 코딩을 하는것에서 벗어나 어떻게 하면 코딩을 ‘잘’할까에 대해 생각해야 할 때이다. 그리고 그 방법을 디자인 패턴을 공부하며 생각해 볼 수 있다.
     디자인 패턴은 보통 객체지향 프로그래밍 언어에서 많이 활용된다. 디자인 패턴이란 이전의 소프트웨어 엔지니어들이 공통적으로 겪었던 문제를 해결하는 솔루션이다. 따라서 우리도 일을 하면서 같은 문제를 겪게되는 경우 특정 디자인 패턴을 이용해 이를 해결할 수 있다.
    하지만 디자인 패턴이 이런 이유에서 취업 전에 알면 좋은것은 아니다. 취업 전에 디자인 패턴을 알면 좋은 이유는 취업 후 우리가 속한 팀의 프로젝트에서 디자인 패턴을 사용하고 있을 확률이 높기 때문이다. 만약 우리가 디자인 패턴을 미리 알고있다면 클래스의 이름만 봐도 이게 뭘 하는건지 유추할 수 있다. 그러면 프로젝트 전체의 코드가 무엇을 하는지 이해하기 쉬워진다. 우리의 Ramp-up속도가 빨라진다는 것이다. 보통 새 직장에 들어가면 처음 하는것이 프로젝트의 코드를 익히는 것이다. 사람마다 익히는 속도가 다르므로 크게 상관하지 않는 경우가 많지만, 코드를 빨리 익히고 빨리 프로젝트에 기여하는 경우 대부분 좋아한다. 

    아키텍쳐 패턴(Architectural Patterns)

     같은 맥락에서 아키텍쳐 패턴을 배우는것도 매우 도움이 된다. 비즈니스 웹 어플리케이션의 경우 여러가지 프로그램이 한 어플리케이션을 구성하는 경우가 많다. 예를들어서 Frontend에서는 AngularJs를 사용하고, Backend에서는 SpringBoot를 사용하고, 데이터베이스는 MySQL을 사용하는 전형적인 3-tier architecture 또는 하둡과 같은 Master-Slave패턴 등 아키텍쳐 패턴을 알고있으면 회사의 어플리케이션 구조를 이해하기 더 쉬울 것이다. 원하는 분야가 있다면 (예, 웹, 게임, 펌웨어 등) 그 분야에서 자주 사용되는 아키텍쳐 패턴을 보는 것이 도움이 될 것이다.

    git/svn

    협업을 하는 경우 협업 관리 툴을 사용하기 마련이다. 소프트웨어 엔지니어링의 세계에서 코드 관리용으로 가장 많이 사용되는 것이 git 또는 svn이다. 경험상 git을 좀 더 많이 쓰는것 같은데 둘 중 어느것을 배워도 상관 없다. 코드의 버전 관리와 이런 툴로 어떻게 협업하는지만 익힌다면 다른 소스코드 관리 툴을 사용하더라도 비슷한 맥락에서 이해할 수 있을 것이다. 다만 가능하다면 command line으로 사용하는법을 익히길 바란다. Command line으로 사용하다가 GUI로 가는건 쉽지만 GUI를 이용하다가 Command line을 배우는건 시간이 좀 걸릴 수 있기 때문이다.

    리눅스 사용법 (Linux)

     보통 서버는 윈도우즈 서버 또는 리눅스 서버를 많이 쓴다. 특히 리눅스는 무료 운영체제라 많이 사용한다. 따라서 리눅스 커맨드라인 사용법을 알아두면 좋다. 구체적으로 어떤 커멘드라인이 도움이 될까?

    • ls, cd, mkdir, rmdir, mount, chmod등 기본적인 것들.
    • vim - vim은 에디터인데, GUI가 없는 리눅스에서 무언가 수정해야 할 경우 vim을 써야한다.
    • ssh - 원격에 있는 리눅스 서버에 접근하기 위해서 ssh를 많이 사용한다. 여러분이 소프트웨어를 Release하게 된다면 CI/CD(Continuous Integration/Continuous Development)가 셋업되어있지 않는 이상 높은 확률로 ssh로 서버에 붙어서 어플리케이션을 껐다 킬 것이다. 
    • ps - 실행중인 프로세스를 볼 수 있는 명령어. 보통 ps aux | grep java 처럼 실행중인 특정 어플리케이션을 보고싶을 때 (또는 강제 종료 할때…) 사용한다.
    • kill -9 <PID> - 보통 위에서 검색한 어플리케이션을 강제 종료할 때 쓴다..
    • grep - 텍스트를 검색할 때 쓴다.
    • tail 또는 less 
    • history - 지금까지 썼던 명령어들 보여준다.

    이 밖에도 여러가지 유용한 리눅스 명령어들이 있다. 이 명령어들에 대해서는 다른 포스트에서 소개하겠다. 그렇다면 리눅스를 사용하지 않는 우리는 어떻게 리눅스 커맨드를 연습해야 하는가? 첫번째 방법으로 VirtualBox와 같은 가상화 도구로 리눅스를 가상 머신에서 실행하는 방법이 있다. 두번째 방법으로는 도커(Docker)와 같은 가상화 도구로 리눅스를 가상 머신에서 실행하는 방법이 있다. 단점은 도커 커맨드라인을 배우는데 시간이 좀 걸릴 수 있다.

    소프트웨어 개발 주기(Software Development Life Cycle)

     보통 [요구사항 -> 요구사항 분석 -> 디자인 -> 코딩 -> 테스팅 -> 출시]로 요약되는 SDLC에 대해 간략하게 알아두면 좋다. 

    원하는 분야가 요구하는 기술/프레임워크

     나는 웹 개발자로 첫 취업을 했다. 그 전에 인턴십에서 JSP로 웹 어플리케이션을 만들었다. 인턴십을 하던 회사에서 모바일 버전의 웹 어플리케이션을 만들고 싶어했는데 당시 스프링 프레임워크가 핫하다고 해서 스프링을 도입해 만들었다. 이 때, 보통 웹 어플리케이션은 어떤 구조로 동작하는지, 어떤 프레임워크를 어떻게 사용하는지에 대해 배웠고 첫 정규직으로 스프링프레임워크를 기반으로 하는 회사에 들어가게 되었다. 만약 회사에 들어가서 처음으로 스프링 프레임워크를 배웠다면 코딩을 시작하기까지 시간이 정말 정말 오래걸렸을 것이다. 또 첫 회사에서 사용했던 기술이 스프링이 아니라도 이미 하나의 웹 프레임워크를 알고있기 때문에 새 프레임워크를 더 빨리 배울 것이다. 지금은 다른 프레임워크를 사용하지만, 처음 코드를 이해하는데 전혀 문제가 없었다.
     만약 게임분야에 종사하고 싶다면 실제로 게임 회사들이 이용하는 프레임워크(예, Unity)를 이용해 볼 수 있다. 만약 펌웨어 개발을 하고 싶다면 라즈베리파이나 아두이노를 사서 직접 하드웨어 모듈의 디바이스 드라이버를 만들어 볼 수도 있다. 꼭 이후의 회사에서 쓰는 기술이 아니더라도 그에 근접한 경험이 있으면 팀의 프로젝트를 더 빨리 이해할 수 있을 것이다.

    위의 사항들을 전부 직접 경험해 보기 위해 뭘 해야할까? 나 같은 경우 개개의 것을 따로따로 배우는것 보다는 프로젝트를 직접 하면서 배우는것이 더 빨랐다. 예를들어 스프링 프레임워크 기반의 웹 어플리케이션을 개발하며 프레임워크를 익히고, 이 코드를 비트버켓이나 깃헙 리파지토리에 올려 git을 익혔다. 마찬가지로 VirtualBox에 리눅스 를 실행하고 위에서 만든 어플리케이션을 리눅스 위에서 돌렸다. 프로젝트를 진행하면서 각 기능에 대한 디자인 패턴, 아키텍쳐 패턴을 고민하고 소프트웨어 개발 주기(Software Development Life Cycle)에 맞춰 프로젝트를 진행했다. SDLC는 Trello나 Asana같은 프로젝트 매니지먼트 툴에 각각 요구사항/디자인 및 코딩/테스팅 컬럼으로 나눠 진행했다. 그렇다고 위의 것들을 두꺼운 책을 사서 책을 읽으며 세세하게 공부한건 아니고, 딱 이 프로젝트에 필요할 정도의 지식만 습득하고(구글과 각종 튜토리얼 포스트) 프로젝트를 진행하는데 초점을 맞췄다. 그래도 취업을 할 때는 이런 경험들이 많이 도움되었다. 어떤 사람들은 개개의 기술을 배우는걸 더 선호할 지도 모른다. 나같은 경우 각 기술이 프로젝트를 진행하면서 어떻게 쓰이는지 알고싶어 한꺼번에 같이 했다. 
     어떤 방법을 선택해 배우든 첫 직장을 구하기 전에 시간이 있다면 위의 사항들을 배우는것을 추천한다. 또 대부분의 컴퓨터 공학부에서 디자인 패턴이나 아키텍쳐 패턴을 가르치므로 이런 강의를 수강하는것도 한 방법이 될 수 있다.


    댓글

f.software engineer @ All Right Reserved