본문 바로가기

개발중

신입 개발자들이 갖춰야할 능력( 책과 강의 추천 )

신입 개발자가 갖춰야할 능력


컴퓨터 과학과의 커리큘럼에 따르면 대충 다음과 같은 기술이 있다고 여겨진다.

 

  • 개발언어C/C++, 자바, 웹 프로그래밍 관련 기술
  • 자료구조
  • 소프트웨어 공학의 개념
  • 알고리즘
  • 리눅스를 다룰 수 있는 능력
  • 관계형 데이터베이스를 다룰 수 있는 기술
  • 컴퓨터 네트워크 전문 지식
  • 운영체제 전문 지식
  • (추가) 컴퓨터 구조
  • (옵션-보안트랙) 보안 관련 전문 지식
  • (옵션-게임트랙) 3D 관련 프로그래밍

 

옵션을 제외한 모든 능력이 우수하다 할지라도 실무에 그대로 투입되기란 솔직히 어렵다. 학부생이 정상적으로 졸업한 후 실무에 바로 투입되는 경우는 졸업전에 합당한 액수의 돈을 받고 소프트웨어를 개발한 경험이 2번이상 있는 경우 말고는 없다.

 

특히 다른 사람의 의뢰를 받아 개발하는 경험이 매우 중요하다.(자기 멋대로 개발하는 것이 아니라 요구사항에 맞춰 개발하고 그 이상의 요구를 들어주는 과정을 거치기 때문이다.) 하지만 이러한 경험을 쌓은 경우는 휴학을 했거나, 일을 하다가 뒤늦게 입학을 한 경우가 대부분이다. 정상적으로는 이러한 경험을 해보기란 하늘에 별따기다.

 

대학교에서 배운 경험과 실무의 갭이 현저하게 차이가 나는 것은 다른 분야도 마찬가지일 것이다. 하지만 그 사람의 실력이 어떤지는 대부분 결과를 통해 알 수 있을 뿐, 그 과정을 추적하기란 여간 쉽지 않다. 그래서 정말로 일을 잘하는지는 판단하기가 어렵다. 부하직원이 한 일을 상사가 가로채기도 하지 않는가? 

 

개발자 세계에서 이런일은 거의 일어날 수가 없다. 기가 막히게 잘 만들어진 소스 형상 관리 도구 덕분에 개발한 소스 코드를 이력까지 추적하며 확인 할 수 있기에 실력이 그대로 까발려지기 때문이다. 그렇다보니 신입 개발자는 코드 한 줄 작성에도 많은 고민이 있을 수 밖에 없다. 

 

기업 입장에서는 신입 개발자에게 그리 큰 기대를 하지 않는다. 그래서 대부분 현재 프로젝트와 동떨어진 보다 쉬운 것을 해보라고 던지는 경우가 많다. 이때 뭔가를 보여주지 않는다면 깊은 인상을 남기긴 힘들다.

 

신입 개발자에게 바라는 것은

신입 개발자에게 처음부터 수준 높은 프로그래밍 실력을 바라지 않는다. 하지만 기본기라는 것이 있다. 이것이 있냐 없냐에 따라 같은 1년 경력을 쌓아도 전혀 다른 결과를 얻는다. 내가 생각하는 기본기는 다음과 같다.


컴퓨터구조 (★)

운영체제 (★) 전공서 하나는 독파해야 한다. 용어를 던지면 술술 나올정도는 아니더라도 메모리, 디스크, 프로세스 등에 대한 내용의 큰 그림은 그리고 있어야 한다. 


  • Operating System Concepts(공룡책)

컴퓨터 네트워크 (★) : 데이터 링크 계층은 그렇다치더라도, 네트워크 계층 이상에 대해서는 확실히 이해해야 한다. 공부할 프로토콜이 넘쳐나지만 그 중에 IP(네트워크계층), TCP와 UDP(전송 계층), HTTP(응용 계층)는 반드시 알고 있어야 한다. 이것만 확실히 알면 다른 프로토콜을 공부하기가 매우 수월하기 때문이다.

    성공과 실패를 결정하는 1%의 네트워크 원리

    윤성우의 열혈 TCP/IP 소켓 프로그래밍

    CCNA Routing and Switching 200-125 Official Cert Guide Library 

    Computer Networks 5th By Andrew S. Tanenbaum

    TCP/IP Illustrated, Vol. 1: The Protocols (Addison-Wesley Professional Computing Series)
    Computer Networking :  A Top-Down Approach (Kurose 저)


데이터베이스: MySQL, 오라클, MS-SQL 등 관계형 데이터베이스 하나 정도는 다룰 수 있어야 한다. 특히 SQL 쿼리문에 대해 조회, 수정, 삭제, 추가는 물론이고 Inner/Outer Join은 할 줄 알아야 한다. 그 다음 단계가 ORM이고 요즘은 NoSQL도 알아야 한다. 정말 힘들다면 일단 관계형 데이터베이스라도 확실히 알아야 확장 하여 공부 할 수 있다.


C : 메모리를 자유자재로 다룰 수 있으면 C 프로그래밍에 능통했다고 본다. 개발자 강좌에도 연재하고 있지만, strcpy/memset/memcpy와 같은 문자열 및 메모리 관련 함수와 캐스팅에 대한 정확한 이해를 하고 있다면 어느정도 기본기가 있다고 볼 수 있다. 운영체제의 메모리 개념을 접목시키기에 매우 적당한 개발언어다.


  • Fundamental Of Database Systems

객체지향 개발언어(자바/C++ 등: 자바든 C++ 이든 객체 지향 개발언어에 대해 상속과 다형성을 능숙하게 사용하고 이해하고 있다면 충분하다. 이정도 되면 실무에 있는 코드를 읽을 수는 있다.


  • This is Java
  • 자바의 정석

자료구조 : 이걸 모른다면 프로그래밍을 할 수 조차 없다. ​너무나 당연한 지식이다. list, array, map, stack, queue 에 대해서는 그 차이를 확실히 이해하고 있어야 한다. 또한 어떤 상황이 주어졌을 때 각 자료구조에 장단점을 파악하여 적재적소에 사용할 수 있는 능력이 있어야 한다. 이 부분은 절대 어려운 것이 아니므로 모르면 개무시를 당할 수 있다.


    Data Structures & Their Algorithms


알고리즘 : 알고리즘은 전공자들에게도 어려운 과목이다. 복잡도나 동적 프로그래밍까지 바라진 않는다. 적어도 정렬과 탐색 알고리즘은 알아야 한다. 구현까지도 바라진 않는다. 대부분 라이브러리에 구현되어 있기 때문이다. 적어도 말로 알고리즘 별 장단점 및 특징을 설명할 수는 있어야 사용할 수 있다. 코딩 기술에 관련된 것이라면 피보나치와 같은 간단한 알고리즘을 재귀함수로 구현할 수 있어야 한다. 성능 이슈를 떠나서 재귀로 로직을 세울 수 있느냐 없느냐 큰 차이가 있다.


  • Introduction to algorithms(CLRS)

소프트웨어 공학 : 이론적으로 외울게 많은 과목이지만 핵심 요소는 이해해 둘 필요가 있다. 소프트웨어 개발 라이프사이클은 알고 있어야 애자일 개발방법론 같은 것도 이해할 수 있다. 특히 관심사의 분리와 같은 개념을 알아야 제대로 된 설계가 가능하다.


스크립트 개발언어(Javascript/Python 등) : 어떤 것이든 유명한 스크립트 언어 하나라도 다룰 줄 알아야 한다. 전혀 다른 통찰을 얻을 수 있기 때문에 능숙하진 못해도 C와 같은 언어와 무엇인 다른지 확실히 이해만 해도 성공이다.


웹 프로그래밍(php/asp.net/spring 등) : 서버 사이드 개발 경험이 필요하다. 이건 수요가 많기 때문에 특히 그렇다. 게시판 한 번이라도 DB 이용해 구현할 수 있는 정도 수준이라도 경험이 필요하다.


수학

  • 선형대수 - Linear Algebra and Its Applications
  • 확률과통계 - Introduction to Probability
  • 이산수학 - Discrete mathematics and its applications

기타
   리팩토링(Refactoring)
   GoF의 디자인 패턴

프로그래밍 관련 무료 책 ·강의리스트   


전공 지식은 용어 자체에 대한 기억이 희미하더라도 해당하는 설명글을 읽었을 때 바로 이해가 되는 수준은 되어야 한다. 
프로그래밍 관련 내용은 코드를 읽을 수 있는 능력이 가장 우선시 된다. 

만약 위에 언급한 내용에 대해 아직 준비되지 않은 것이 있다면 지금이라도 공부하자. 자신의 직무와 다르다고 판단하는 분이 계실지도 모르겠는데 저건 그냥 기초다. 이러한 기반 위에 올라가는 지식은 이해하는 차원이 다르다. 단지 현재 현상을 이해하는 것보다 그 역사를 이해하면 그 현상을 통해 미래를 볼 수 있는 통찰을 얻을 수 있는 것과 같은 이치다.


고민해봐야 할 팀

개발자로 경력을 쌓길 원하는데 다음과 같은 일을 하는 팀에 들어갔다면 자신의 비전과 맞는지 잘 따져봐야 한다.

 

  • 유지보수팀: 중견 기업인 경우에는 이미 다양한 솔루션을 보유한 경우가 많다. 이러한 솔루션을 버전업하는 신규 개발팀이 있는 반면 이미 납품한 고객들을 상대하는 유지보수팀이 있다. 소스 코드가 매우 잘 만들어진 경우라면 정말 많은 것을 얻을 수 있을 것이다. 좋은 코드 만큼 좋은 스승은 없다. 만약 그렇지 않다면 잘못된 습관이 생길 수 있어 정말 최악의 경력을 쌓게 될 것이다. 유지보수 기간이 길수록 거지같은 코드는 메모리 릭, 병목 현상 등과 같은 초급 개발자가 감당할 수 없는 사건이 발생한다. 문제는 이것을 해결할 능력이 되지 않는다는 것이다. 거기에 만약 사수까지 형편없다면 실력이 늘긴 커녕 더러운 코딩 능력만 얻는다. 어떤 경우라도 이곳에서는 1년이상 있어서는 안 된다. 새로운 기술을 배우기는 힘들기 때문이다.

  • 테스트팀(QA팀): 훌륭한 개발자를 목표로 하고 있다면 1년정도 있어보는 것도 나쁜 선택은 아니다. 소프트웨어에 대한 깊은 이해와 개발할 때 많은 노하우를 얻을 수 있기 때문이다. 하지만 이곳도 1년이상 있어야 한다면 경력에 있어 큰 손실이라고 말하고 싶다. 반복되는 일상이 많을 수 있어 새로운 기술 개발에 대한 도전이 거의 불가능하기 때문이다.

(참고 : http://gall.dcinside.com/board/view/?id=programming&no=600590, 897043, 616679