본문 바로가기
개발자

[스크랩] 경력 개발자 역량 평가

by hs_seo 2015. 6. 4.

경력 개발자 역량 평가

EBvi 원본 위치 - https://github.com/EBvi/dev-matrix

Programmer-competency-matrix - http://sijinjoseph.com/programmer-competency-matrix/

 

EBvi 에 정리 되어 있는 것을 다시 정리 해 보았다.

경력 개발자라면 이정도는 알아야 다음 면접에 나갈 수 있지 않을까?

 

전산학의 이해

1. 자료구조

2. 알고리즘

3. 시스템 프로그래밍

 

소프트웨어 엔지니어링

1. 소스코드 버전 관리

2. 빌드 자동화

3. 테스트 자동화

 

프로그래밍

1. 프로그램 분해

2. 시스템 분해

3. 의사소통

4. 파일 내의 코드 구성

5. 파일 간의 코드 구성

6. 코드 가독성

7. 방어적 코딩

8. 에러 핸들링

9. IDE

10. API

11. 프레임워크

12. 요구사항

13. 스크립팅

14. 데이터베이스

 

지식

1.

2. 최신 기술 이해

3. 플랫폼 ㅁ내부

4.

 

외국어

1. 외국어 수준

 

문서화

1. 문서포맷

2. 오피스 도구 사용

 

전산학의 이해

1. 자료구조

- 배열과 링크드 리스트의 차이

- 실제 프로그래밍 환경에서 배열과 링크드 리스트, 딕셔너리의 차이를 설명할 수 있다.

- 배열과 링크드 리스트의 속도/메모리 타협 관계를 설명할 수 있다. 해시의 충돌 처리를 할 수 있고 우선순위 큐를 만들 수 있다.

- B 트리, 이진트리, 피보타치 힙, AVL 트리, RED/BLACK 트리, Splay 트리, Skip 리스트 등 고급 자료구조에 대해 이해하고 있다.

 

2. 알고리즘

- 배열에 들어있는 숫자들의 평균을 낼 줄 모른다.

- Sorting, Searching, Traversing 알고리즘을 이해한다.

- 트리, 그래프, 단순한 그리디 알고리즘, 분할 정복을 이해한다.

- 동적 프로그래밍 솔루션을 이해한다. 그래프 알고리즘, 수치연산 알고리즘을 이해하고 NP 문제를 식별할 수 있다.

 

3. 시스템 프로그래밍

- 컴파일러, 링커, 인터프리터를 구분하지 못한다.

- 컴파일러, 링커, 인터프리터를 이해한다. 하드웨어 레벨의 어셈블러 언어 동작을 이해한다. 가상 메모리와 페이징에 대한 이해가 있다.

- 커널모드/유저모드의 차이를 알고, 멀티스레딩, 동기화를 이해하고 그것들이 어떻게 구현되었는지 안다.

- 어셈블리 코드를 읽을 수 있다. 네트워크가 어떻게 동작하는 지 안다. 프로토콜을 알고, 소켓 수준의 프로그램을 읽을 수 있다.

- 전체 프로그래밍 스택을 이해한다. 하드웨어(CPU, 메모리, 캐시, 인터럽트, 마이크로코드), 바이너리 코드, 어셈블리, 정적/동적 링킹, 컴파일, 인터프리테이션, JIT 컴파일, 가비지 콜렉션, , 스택, 메모리 어드레싱 등을 구분해서 이해한다.

 

소프트웨어 엔지니어링

1. 소스코드 버전 관리

- 날짜 단위의 폴더를 백업

- CVS, SVN, VSS 등의 사용을 시작했다.

- CVS, SVN 에 대한 능숙한 사용, 브랜치/머지를 할 수 있고, 패치를 만들 수 있고, 리파지토리 속성에 맞게 만들 수 있다.

- 분산 VCS 시스템을 이해한다. Bzr/Mercurial/Darcs/Git 등을 써봤다.

 

2. 빌드 자동화

- IDE에서만 빌드할 수 있다.

- 커맨드 라인으로 빌드를 만들 수 있다.

- 빌드 스크립트를 직접 작성한다.

- 문서, 설치 인스톨러, 릴리즈 노트를 포함한 빌드 스크립트를 만든다.

 

3. 테스트 자동화

- 테스트는 테스터의 일이라고 생각한다.

- 유닛 테스트를 짜고 새로 짜는 코드에 유닛 테스트를 작성하고 있다.

- TDD 방식으로 코드를 작성한다.

- 기능적, 로드/성능적, GUI 측면의 테스트 자동화를 이해하고 실현한다.

 

프로그래밍

1. 프로그램 분해

- 라인 단위의 복사/붙여넣기로 코드를 작성한다.

- 문제를 여러 함수로 나눠서 코딩한다.

- 재사용 가능한 객체로 코드를 작성한다.

- 적절한 알고리즘으로 제네릭/OOP 방법을 써서 변경이 있을 법한 부분은 적절히 캡슐화 하면서 코딩한다.

 

2. 시스템 분해

- 파일 1개 클래스 1개 이상의 범위를 생각하지 못한다.

- 같은 플랫폼 같은 기술 범위 내에서는 문제를 쪼개서 해결책을 설계해 낼 수 있다.

- 다양한 기술과 시스템에 걸쳐 있는 문제에 대한 솔루션을 만들어 낸다.

- 복잡한 제품들을 가시화하여 설계하고 외부 시스템과 연동을 이끌어 낸가. 모니터링, 리포팅, 장애복구 등의 운영 작업도 설계할 수 있다.

 

3. 의사소통

- 아이디어와 생각을 잘 표현하지 못하고, 맞춤법과 문법이 엉망이다.

- 동료에게 무슨 의도로 말하는지 이야기할 수 있다. 맞춤법과 문법은 좋다.

- 효과적으로 의사 소통할 수 있다.

- 모호한 상황에서 생각/설계/아이디어/스펙을 이해하고 소통할 수 있으며, 상황에 맞게 소통할 수 있다.

 

4. 파일 내의 코드 구성

- 코드 파일 내에서 구조화가 안되어 있다.

- 메소드들이 논리적으로든 접근성으로든 어떻게든 구조화 되어 있다.

- 코드가 영역별로 그룹핑되어 있고, 주석도 잘 되어 있고, 서로 다른 파일간의 참조도 잘 설명되어 있다.

- 파일은 라이선스 헤더도 있고, 요약 설명도 있고, 주석도 잘 되어 있고, 공백 사용은 일관성이 있고, 파일 자체가 보기 좋게 정렬되어 있다.

 

5. 파일 간의 코드 구성

- 파일 간 구성에 대한 어떤 구조도 없다.

- 파일들이 폴더로 나뉘어져 있다.

- 파일 별로 고유한 목적이 있다. 예를 들어 클래스 하나 정의, 기능 하나 구현 등

- 코드 구성이 설계와 잘 매치되어 코드 파일명만 보더라도 설계에 대한 이해를 할 수 있도록 만든다.

 

6. 코드 가독성

- 코드 가동성에 대한 고려가 없다.

- 파일, 변수, 클래스, 메소드 등에 대한 이름을 잘 부여한다.

- 통상적이지 않은 코드나 버그 수정이나 전제 조건 등에 대해서 주석을 잘 달아둔다.

- 전제 조건은 assert 로 검증한다. nesting 단계가 깊지 않고, 자연스럽게 코드가 흐른다.

 

7. 방어적 코딩

- 방어적 코딩이 뭔지 모른다.

- 인수를 다 체크하고, 크리티컬한 전제 조건에 대해서 assert 를 사용한다.

- 리턴 값도 체크하고, 예외를 항상 체크한다.

- 방어적 코딩을 하기 위한 자신만의 라이브러리가 있다. 실패 케이스를 시험하는 유닛 테스트 코드를 작성한다.

 

8. 에러 핸들링

- 정상적으로 작동될 경우만을 염두에 두고 코드를 작성한다.

- 예외/에러가 생성되는 주변에 기본적인 에러 핸들링 코드가 있다.

- 예외/에러로 가도 프로그램이 안정적인 상태에 있도록 유지한다. 리소스, 커넥션, 메모리 등이 깨끗하게 해제됨을 보장한다.

- 가능한 예외 상황을 미리 감지해 내도록 코딩한다. 코드 전체에 대해 일정한 예외 핸들링 정책을 사용한다. 전체 시스템에 대한 예외 핸들링 가이드 라인을 만든다.

 

9. IDE

- 대부분 텍스트 에디팅에 IDE 를 사용한다.

- 인터페이스 이면에 숨어있는 IDE 기능을 메뉴에서 효과적으로 불러내서 쓴다.

- 거의 모든 IDE 사용을 단축키로 한다.

- IDE에 매크로를 정의해서 사용한다.

 

10. API

- 자주 문서를 봐야 한다.

- 기억 속에 자주 쓰는 API는 들어있다.

- API 에 대해서 폭넓고 깊이 있는 이해를 하고 있다.

- 자주 호출하는 것에 대해서 단순화시키기 위해서 API 위에 라이브러리를 추가로 개발하고, 결과적으로 API의 보족한 점은 직ㅈ버 채운다.

 

11. 프레임워크

- 코어 플랫폼 밖의 어떤 프레임워크도 쓰지 않는다.

- 유명 프레임워크를 들어는 봤으나 써보지는 못했다.

- 프레임워크를 여러 개 능숙하게 쓰고, 해당 프레임워크를 효과적으로 잘 쓰는 전형적인 방법을 알고 있다.

- 프레임워크를 직접 개발한다.

 

12. 요구사항

- 주어진 요구사항을 코드 스펙으로 바꾼다.

- 스펙에서 비어있는 케이스에 대한 질문을 할 수 있다.

- 전체 그림을 이해하고 스펙으로 정의할 영역 전체를 도출해 낸다.

- 경험에 기반해서 주어진 요구사항에 대해 더 좋은 대안과 플로우를 제시할 수 있다.

 

13. 스크립팅

- 스크립팅 툴을 모른다.

- 배치파일, 쉘 스크립팅을 한다.

- Perl/Python/VBScript/Powershell 류의 스크립팅을 한다.

- 재사용 가능한 코드를 짜고 공개한다.

 

14. 데이터베이스

- 제대로 데이터베이스에 대한 개념을 학습하지 못했다.

- 데이터베이스의 기본 개념과 ACID, 정규화, 트랜잭션을 이해한다.

- 실행될 쿼리를 염두해서 스키마를 정규화 정의할 수 있고, , 스토어드 프로시저, 트리거, 사용자 정의 타입을 다룰 수 있다.

- 기본 DB관리, 성능 최적화, 인덱스 최적화, 고급 SELECT 쿼리를 작성할 수 있고, 커서를 이해하며, 데이터가 내부적으로 어떻게 저장되는지 알며, 인덱스가 어떻게 저장되는지 알고, 데이터베이스 미러링, 복제를 이해하고, 2-페이스 커밋을 이해한다.

 

지식

1.

- 자주 쓰는 IDE 만 알고 있다.

- 유명하거나 표준적인 다른 도구들을 쓸 줄 안다.

- 에디터, 디버거, IDE에 대해 잘 알고 있고 오픈 소스 대체물도 잘 알고 있다.

- 도구를 직접 만들 수 있다.

 

2. 최신 기술 이해

- 최신 기술을 모른다.

- 해당 분야의 최신 기술을 들어는 봤다.

- 알파 프리뷰, CTP, 베타를 다운로드해 봤다. 온라인 매뉴얼 등을 읽어 봤다.

- 프리뷰를 시험해보고, 뭔가 만들어 봤다.

 

3. 플랫폼 내부

- 플랫폼 내부에 대해 전혀 모른다.

- 플랫폼 내부가 어떻게 동작하는지 기본 이해를 가지고 있다.

- 플랫폼 내부가 어떻게 동작하는지 잘 알고 있고, 가시화시켜서 플랫폼이 어떻게 코드를 실행시키는지 설명할 수 있다.

- 플랫폼 내부에 대한 정보를 제공하기 위해서 디컴파일, 디버깅, 디스어셈블을 하거나 툴을 만든다.

 

4.

- 간단한 문법을 다룬 책을 위주로 몇 권 읽어 봤다.

- 코드 컴플리트를 비롯한 스티브 맥코넬의 저서 또는 켄트벡이나 마틴 파울러의 저서를 읽어 봤다.(방법론에 대한 책)

- 이펙티브 c++, 이펙티브 java, 그 외 각종 실용적이면서 중급 사용자에게 적절히 도움이 되는 책을 읽어 봤다.

- 아트 오브 컴퓨터 프로그래밍, 자바스크립트 닌자의 비밀, 대용량데이터베이스 솔루션 등의 고급 서적을 읽어 봤다.

 

외국어

1. 외국어 수준

- 한국어가 아닌 자료로는 기술 습득이 불가능하다.

- 영어로 된 기술 교재를 읽고 기술을 파악한다.

- 미국인/영어권 사용자로부터 개발 업무를 지시받고 업무 수행 후에 결과를 보고할 수 있다.

- 영어권 사용자로부터 SW를 발주 받아, 인도/중국인에게 개발 업무를 아웃소싱시키고 국내 팀과 연계하여 국제적인 프로젝트를 진행할 수 있다.

 

문서화

1. 문서포맷

- 문서 작성이 서툴고 뭘 작성해야하는 지 자발적으로 판단하지 못한다.

- 프로젝트에 필요한 문서 포맷어 어떤 것인지 알고 있고 적어도 1개 이상의 프로젝트에서 단계별 문서를 작성해 본 적이 있다.

- 여러 SW 프로젝트에서 SW 사용된 다양한 문서 포맷을 작성해 본적이 있고 확보하고 있다.

- 필요하면 문서 세트를 직접 정의할 수 있고, 가장 좋은 실천법을 알고 있다.

 

2. 오피스 도구 사용

- 오피스 도구 사용법을 완전히 숙지하지 않은 상태이다.

- 오피스를 이용해서 각종 문서를 작성하지만 문서 포맷이 주어지지 않으면 애를 먹는다.

- 사용법을 완전히 숙지하고 있으며, 단축키도 사용하고 효율적으로 작성할 수 있다.

- 상당한 작업을 단추키로 수행하며 매크로도 직접 정의해서 사용하고 공객판 외의 도구들도 적극적으로 사용하여 효과적인 문서를 생산한다.

 

그리고

-       무엇이라도 잉여력 발산을 해보신게 있나요?

-       업무에 불만 또는 비효율적인 부분을 개선했던 사례가 있으면 기술해주세요.

 

반응형