본문 바로가기

IT이야기

프로그래머 능력 매트릭스

최초 작성일: 2012년 3월 22일




http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm

예전에 번역해서 올려두었던 건데, 잊어버려서 다시 인터넷에 퍼오다니.


엑셀 파일로 만들었습니다.

programmer-competency-matrix.xls



멋지게 다시 만드신 분이 계시네요. 예쁜 화면을 보시려면 신성기님의 위키를 방문하세요.
http://barmi.net/moni/wiki.php/%C7%C1%B7%CE%B1%D7%B7%A1%B8%D3%B4%C9%B7%C2%B8%C5%C6%AE%B8%AF%BD%BA?action=download&value=ProgrammerCompetencyMatrix_korean.html 

프로그래머 능력 매트릭스

단계 마다의 지식은 누적됩니다.; n 단계는 n보다 낮은 단계의 모든 것을 알고있다는 것을 함축합니다.
전산학(Computer Science)
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
자료구조
(data structures)
Array 와 LinkedList 간의 차이를 알지 못합니다. Arrays, LinkedLists, Dictionaries 을 설명하고 구체적인 프로그래밍 작업에서 사용할 수 있습니다. Arrays와 LinkedLists 같은 기본 자료구조에서 공간과 시간 트레이드 오프를 알고 있고, hashtables이 어떻게 구현되고 충돌과 우선순위 큐를 다룰 수 있는지와 이들을 구현하는 방법을 설명할 수 있습니다. B-trees, binomial and fibonacci heaps, AVL/Red Black trees, Splay Trees, Skip Lists, tries 같은 고급 자료구조에 대한 지식이 있습니다.
알고리즘(algorithms) 배열에서 평균값을 찾지 못합니다. (믿기 어렵지만, 이런 후보자를 면접했습니다.) 기본적인 정렬, 검색, 자료구조 탐색과 조회 알고리즘 Tree, Graph, simple greedy, divide and conquer algorithms를 아는데, 이 매트릭스의 레벨의 관련성을 이해합니다. 동적인 프로그래밍 솔루션, 그래프 알고리즘에 대한 멋진 지식, 수치 계산 알고리즘에 대한 좋은 지식을 인지하고 코딩할 수 있으며, NP 문제를 구별할 수 있습니다. 훌륭한 탑코더 랭킹을 가진 사람과 일하는 것은 믿을 수 없는 행운입니다!
시스템
프로그래밍(systems programming)
compiler, linker, interpreter가 무엇인지 모릅니다. compilers, linker, interpreters에 대한 기본 이해가 있습니다. assembly 코드가 무엇이며 하드웨어 레벨에서 어떻게 동작하는지 이해합니다. 가상 메모리와 페이지에 대한 약간의 지식이 있습니다. kernel mode와 user mode, multi-threading, synchronization primitives와 이들이 어떻게 구현되었는지를 알고 있고 assembly 코드를 읽을 수 있습니다. 네트워크가 어떻게 동작하는지 이해하며, 네트워크 프로토콜과 소켓 레벨 프로그래밍을 이해합니다. 하드웨어(CPU + Memory + Cache + Interrupts + microcode), 바이너리 코드, 어셈블리, 정적,동적 링킹, 컴파일과 인터프리테이션, JIT 컴파일, 가베지 콜레션, 힙, 스택, 메모리 주소지정등 전반적인 프로그래밍 스택을 이해합니다.
소프트웨어 공학(Software Engineering)
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
소스코드 버전관리
(source code version control)
날짜별로 폴더 백업 VSS와 CVS/SVN 사용하기 시작합니다. CVS와 SVN 기능에 익숙합니다. branch, merge, 패치와 저장소 속성을 설정하는 방법을 알고 있습니다. 분산 VSC 시스템을 알고 있습니다. Bzr/Mercurial/Darcs/Git을 시도해봤습니다.
빌드 자동화
(build automation)
IDE로부터 빌드하는 방법만 알고 있습니다. 명령어로 시스템을 빌드하는 방법을 알고 있습니다. 기본 시스템을 빌드하는 스크립트를 설정할 수 있습니다. 시스템과 문서, 설정파일을 빌드하고 릴리즈 노트를 만들고 소스 컨트롤에 있는 코드로부터 태깅을 하는 스크립트를 설정할 수 있습니다.
테스트 자동화
(automated testing)
모든 테스트가 테스터의 일이라고 생각합니다. 자동화된 유니트 테스트를 작성하고, 코드를 작성할 때 좋은 유니트 테스트 케이스를 함께 작성합니다. TDD 방법으로 코드를 작성합니다. 자동화된 기능, 로드/성능, UI 테스트를 이해하고 작성할 수 있습니다.
프로그래밍(Programming)
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
문제 분해(problem decomposition) 코드 재사용을 위해 Copy&Paste로 직접 코딩을 합니다. 여러개의 함수로 문제를 쪼갤수 있습니다. 전체 문제를 풀기 위한 재사용가능한 함수와 객체를 작성할 수 있습니다. 적절한 자료구조와 알고리즘을 사용하고 변경될 수 있는 문제를 캡슐화시키는 일반적인/객체지향적인 코드를 작성합니다.
시스템 분해(systems decomposition) 단일 file/class 이상으로 생각할 수 없습니다. 문제공간을 쪼개고 동일한 플랫폼/기술안에서 가능한 솔루션을 설계할 수 있습니다. 여러 기술/플램폼으로 확장가능한 시스템을 설계할 수 있습니다. 여러 개의 제품 라인을 가지고 외부 시스템과 통합되는 복잡한 시스템을 시각화하고 설계할 수 있습니다. 모니터링, 레포팅, 장애극복 같은 지원 시스템 기능을 설계할 수 있습니다.
소통(communication) 동료에게 생각/아이디어를 설명할 수 없습니다. 철자와 문법이 서툽니다. 말한 내용을 동료가 이해할 수 있습니다. 철자와 문법이 괜찮습니다. 동료와 효과적인 소통을 할 수 있습니다. 생각/설계/아이디어/명세를 명백한 방법으로 이해하고 소통하고 컨텍스트에 따라 소통을 바로잡을 수 있습니다. 소통은 자주 평가절하되지만 프로그래머를 평가하는데 매우 중요합니다. 영어가 모국어가 아닌 곳에 프로그래밍 작업을 외주가 늘어남에 따라 소통 이슈는 더욱 두드러지고 있습니다. 프로그래머가 소통의 의도를 이해하지 하지 못하여 실패한 여러 프로젝트들을 알고 있습니다.
파일에서
코드 구조화
(code organization within a file)
파일을 조직한다는 증거가 없습니다. 메써드가 논리적 또는 접근성에 따라 그룹핑됩니다. 코드는 영역으로 그룹되어 있고, 다른 소스 파일에 레퍼런스된 괜찮은 주석이 달려있습니다. 파일은 라이센스 헤더, 요약, 괜찮은 주석, 지속적인공백 문자사용을 합니다. 이 파일은 보기에도 아릅답습니다.
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
파일간의
코드 구조화(code organization across files)
파일간의 구조화에 대한 생각이 없습니다. 연관된 파일을 분류하여 폴더에 넣습니다. 물리적인 파일은 독자적인 목적을 가집니다. 예로, 하나의 클래스 정의, 하나의 기능 구현 등. 물리적인 레벨의 코드 구조는 설계와 깊숙하게 대응되고 파일이름과 폴더 배치는 설계에 대한 통찰을 제공합니다.
소스 트리 구조화(source tree organization) 하나의 폴터에 모든 게 있습니다. 코드의 기본 분리를 논리적인 폴더로 합니다. 어떤 순환적인 의존없이, binaries, libs, docs, builds, third-party code 모두 적절한 폴더에 있습니다. 소스 트리의 물리적인 배치는 논리적인 계층과 구조와 부합합니다. 디렉터리 이름과 구조는 시스템의 설계에 대한 안목을 제공합니다. 이것과 이전 아이템과의 차이는 구조의 규모인데, 소스 트리 구조화는 시스템을 정의하는 전반적인 산물의 집합과 관련됩니다.
코드 가독성(code readability) 한 음절의 이름 파일, 변수, 클래스, 메써드 등을 위한 좋은 이름 긴 함수가 없고, 별난 코드를 설명하는 주석, 버그 픽스, 코드 가정 코드 가정은 asserts을 사용하여 검증되고, 코드는 자연스럽게 흘러갑니다 - 깊게 반복되는 조건이나 메써드가 없습니다.
방어적인 코딩(defensive coding) 방어적인 코딩 개념을 이해하지 못합니다. 모든 인자값을 검사하고 코드에서 결정적인 가정을 asserts 합니다. 리턴값을 검사하는 것을 확신하고 실패할 수 있는 코드주변에 예외처리를 확인합니다. 방어적인 코딩을 돕는 자신만의 라이브러리를 가지고 있고, 실패를 가상하는 유니트 테스트를 작성합니다.
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
에러 처리(error handling) 오직 행복한 경우만 코딩합니다. 예외를 던지고/에러를 발생시키는 코드에 대한 기본 에러 처리 에러/예외처리가 자원, 연결, 메모리가 모두 깔끔하게 되는 좋은 상태로 프로그램이 종료되는 것을 확신합니다. 가능한 예외가 발생하기 전에 탐지하고, 코드의 모든 계층에서 지속적인 예외 처리 전략을 유지하고, 전체 시스템을 위한 예외 처리에 대한 가이드라인을 따르는 코드
통합개발환경(IDE) 대부분 텍스트 에디팅을 위한 IDE를 사용합니다. 인터페이스에 대해서 알고 있고, 메뉴를 이용하여 IDE를 효율적으로 사용할 수 있습니다. 자주 사용하는 기능에 대한 키보드 단축키를 알고 있습니다. 작성된 커스텀 매크로가 있습니다.
API 자주 문서를 찾아볼 필요가 있습니다. 매우 자주 사용하는 API는 기억하고 있습니다. 광대하고 깊은 API에 대한 지식이 있습니다. 자주 사용하는 작업을 단순화하고 API의 공백을 메꾸는 API의 꼭대기에 있는 라이브러리를 작성하였습니다. API의 예로 자바 라이브러리, .net 프레임워크 또는 응용프로그램을 위한 커스텀 API
프레임워크(frameworks) 핵심 플랫폼의 바깥쪽에 어떤 프레임워크도 사용하지 않았습니다. 플랫폼에 사용가능한 인기있는 프레임워크를 들어는 봤지만 사용하지 않았습니다. 전문적인 역량으로 하나 이상의 프레임워크를 사용해봤고 프레임워크의 노련함을 가지고 매우 정통합니다. 프레임워크의 작성자입니다.
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
요구분석(requirements) 주어진 요구사항을 가지고 명세에 따라 코딩합니다. 명세에서 놓친 사례에 대해 질문을 합니다. 완전한 그림을 이해하고 명세화되어야 하는 전체 영역을 따라갑니다. 더 좋은 대안을 제안하고 경험에 따라 주어진 요구사항을 막힘이 따라갑니다.
scripting 스크립트 도구에 대해 전혀 알지 못합니다. Batch files/shell scripts Perl/Python/Ruby/VBScript/Powershell 재사용 가능한 코드를 작성하고 발표하였습니다.
database 엑셀이 데이터베이스라고 생각합니다. 기본적인 데이터베이스 개념, 정규화, ACID, 트랜잭션을 알고 간단한 SELECT를 작성할 수 있습니다. 쿼리가 동작하고, 뷰, 저장 프로시저, 트리거와 사용자 정의 타입을 이용하는 장점을 이해하면서 훌륭하고 정규화된 데이터베이스 스키마를 설계할 수 있습니다. 클러스터와 넌클러스터 인덱스 차이를 알고 있습니다. ORM 툴 사용에 익숙합니다. 기본 적인 데이터베이스 관리, 성능 최적화, 인덱스 최적화를 하고, 고급 SELECT 쿼를 작성할 수 있으며, 관계 SQL 대신에 커서를 사용할 수 있으며, 내부적으로 데이터가 저장되는 방법을 알며, 인덱스가 내부적으로 저장되는 방법을 알며, 어떻게 데이터베이스가 미러되는지 이해합니다. 2단계 커밋이 동작하는 방법을 알고 있습니다.
Experience
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
전문 경험을 가진 언어(languages with professional experience) 필수적(Imperative) 또는 Object Oriented Imperative, Object-Oriented and declarative (SQL). static vs dynamic typing, weak vs strong typing and static inferred types 을 안다면 보너스를 추가합니다. Functional(함수언어). lazy evaluation, currying, continuations 을 안다면 보너스를 추가합니다. Concurrent (Erlang, Oz) and Logic (Prolog)
platforms with professional experience 1 2-3 4-5 6+
years of professional experience 1 2-5 6-9 10+
영역 지식(domain knowledge) 영역에 대한 지식이 없습니다. 하나의 영역에서 하나 이상의 제품에서 일해왔습니다. 같은 영역에서 여러개의 제품에서 일해왔습니다. 여역 전문가입니다. 하나의 영역에서 여러개의 제품/솔루션을 설계하고 구현하였습니다. 도메인에서 사용하는 표준 항목과 프로토콜에 대해 매우 정통합니다.
지식(Knowledge)
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
도구 지식(tool knowledge) 주요한 IDE (VS.Net, Eclipse)로 제한됩니다. 인기있고 표준적인 몇몇 대체가능한 도구를 알고 있습니다. 에디터, 디버거, IDE, 오픈소스 대체품에 대한 많이 알고 있습니다. 예로, Scott Hanselman's power tools 목록의 대부분을 알고 있습니다. ORM 툴도 사용합니다. 도구와 스크립트를 실제 작성했습니다. 공개했다면 추가적인 보너스입니다.. http://www.hanselman.com/tools/
노출된 언어(languages exposed to) 필수적(Imperative) 또는 Object Oriented Imperative, Object-Oriented and declarative (SQL). static vs dynamic typing, weak vs strong typing and static inferred types 을 안다면 보너스를 추가합니다. Functional(함수언어). lazy evaluation, currying, continuations 을 안다면 보너스를 추가합니다. Concurrent (Erlang, Oz) and Logic (Prolog)
코드베이스 지식(codebase knowledge) 코드베이스를 본 적이 없습니다. 코드 레이아웃과 시스템을 어떻게 빌드하는가에 대한 기본 지식과 수차례 버그를 고치면서 구현되고 적은 기능을 가지는, 코드베이스의 훌륭하게 동작하는 지식 여러개의 커다란 기능을 구현하였고 대부분의 기능과 버그수정을 위한 요구되는 변화를 쉽게 시각화할 수 있습니다.
신기술에 대한 지식(knowledge of upcoming technologies) 신기술에 대해 들은 적이 없습니다. 해당 분야에 대한 신기술을 들어봤습니다. alpha preview/CTP/beta를 다운로드 하고 기사와 메뉴얼을 읽습니다. previews를 가지고 놀며 실제로 무엇인가를 만들며 보너스로 다른 사람들에게 공유합니다.
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
platform internals 플랫폼 내부에 대한 지식이 없습니다. 플랫폼이 내부적으로 동작하는 기본 지식을 가지고 있습니다. 플랫폼 내부에 대한 깊은 지식이 있으며 플랫폼이 프로그램을 어떻게 실행코드로 바꾸는지 시각화할 수 있습니다. 플랫폼 내부의 정보를 제공하는 도구를 작성하였습니다. 예로, 디스어셈블러, 디컴파일러, 디버거등.
책들(books) Unleashed 시리즈, 21 days 시리즈, 24 hour 시리즈, dummies 시리즈(초보자용) Code Complete, Don't Make me Think, Mastering Regular Expressions Design Patterns, Peopleware, Programming Pearls, Algorithm Design Manual, Pragmatic Programmer, Mythical Man month Structure and Interpretation of Computer Programs, Concepts Techniques, Models of Computer Programming, Art of Computer Programming, Database systems , by C. J Date, Thinking Forth, Little Schemer (역주-대부분 책 제목입니다.)
블로그(blogs) 블로그를 들어봤지만, 시간을 가진적은 없습니다. tech/programming/software engineering 블로그를 읽고, 정기적으로 podcast를 듣습니다. 수집한 유용한 기사와 도구에 대한 약간의 모음을 가진 링크 블로그를 운영합니다. 프로그래밍에 대한 개인적인 통찰과 생각을 나누는 블로그를 운영합니다.

Thanks to John Haugeland for a reformatting of it that works much more nicely on the web.