2023-11-24 작성

개발자 역량 평가

퍼블리싱

1. 웹페이지 코딩

  • 간단한 HTML 문법과 CSS 문법을 알고 사용할 수 있다
  • div로 레이아웃을 잡고 코딩을 할 수 있다 (Box model을 이해한다)
  • 웹 표준을 어느 정도 이해하고 있다 (DTD를 알고 있다)
  • 웹 접근성과 시맨틱한 마크업에 대해 숙지하고 있으며 관심이 깊다

2. 크로스 브라우징

  • 인터넷 익스플로러밖에 사용해 보지 않았다
  • 특정 모바일 디바이스에 최적화된 페이지를 만들어 본 경험이 있다
  • 각 브라우저의 렌더링 이슈를 알고 있으며 해결해 본 경험이 있다
  • 브라우저핵의 존재를 알고 있으며, 우아한 퇴보 기법의 일부를 숙지하여 코딩할 수 있다

3. jQuery

  • 간단한 셀렉터와 실행 문법을 알고 있다
  • 다양한 플러그인을 사용해본 경험이 있다
  • 제법 복잡한 셀렉터를 다룰 수 있고, 메소드 체이닝을 알고 있으며, 거의 모든 문법을 자유 자재로 다룰 수 있다
  • 플러그인 제작이 가능하고 jQuery가 어떻게 구현되었는지 상당 수준을 이해한다

4. JavaScript

  • 아주 기초적인 JavaScript 문법을 알고 있다
  • Context의 역할과 this의 용법을 안다
  • closure를 이해하고 익명함수를 다룰 수 있다
  • 각 브라우저별 JavaScript 엔진의 차이를 이해하고 크로스 브라우징이 가능한 코드를 작성할 수 있다

운영체제

1. 리눅스 경험

  • 윈도우밖에 사용해 보지 않았다
  • 몇 종류의 리눅스를 사용해 보았으며 쉘 명령어를 좀 알고 있다
  • 리눅스에 특정 벤더사의 서버를 설치, 세팅해본 경험이 있다
  • 리눅스로 서비스를 운영해 보았으며 각종 트러블 슈팅에 대한 경험이 있다

2. 윈도우 경험

  • 특별한 경험이 없다
  • 백업과 복원을 할 줄 알고, 시스템을 새로 설치하는 데에도 문제가 없다
  • 각종 고급 테크닉을 숙지하고 있으며 최적화나 튜닝에 대해서도 관심이 많다
  • 오류가 발생하면 덤프를 뜨고 로그를 읽어 어떤 문제가 발생했는지 알고 해결할 수 있다

전산학 이해

1. 자료구조

  • 배열(array)과 List의 차이를 모른다
  • 배열과 Linked List, dictionary의 차이를 설명할 수 있다
  • 트리와 그래프를 알고 사용할 수 있다
  • 각종 상황에서 효율적인 자료구조를 결정할 수 있다

  • 배열(array)과 링크드 리스트의 차이를 모른다
  • 실제 프로그래밍 환경에서 배열과 Linked List, dictionary의 차이를 설명할 수 있다
  • 배열과 링크드 리스트의 속도/메모리 타협 관계를 설명할 수 있다. 해시의 충돌 처리를 할 수 있고 우선순위 큐를 만들 수 있다
  • B트리, 이진트리, 피보나치 힙, AVL 트리, RED/BLACK 트리, Splay 트리, Skip 리스트 등 고급 자료구조에 대해 이해하고 있다

2. 알고리즘

  • 배열에 들어있는 값의 평균을 낼 줄 모른다
  • 정렬, 검색, 순환 알고리즘을 안다
  • 퀵 정렬에 대해 설명할 있고, 직접 코드를 작성할 수 있다
  • 다익스트라나 A*, 또는 그 밖의 알고리즘을 알고 있다

  • 배열에 들어있는 숫자들의 평균을 낼 줄 모른다
  • Sorting, Searching, Traversing 알고리즘을 이해한다
  • 트리, 그래프, 단순한 그리디 알고리즘, Divide and Conquer를 이해한다
  • 동적 프로그래밍 솔루션을 이해한다. 그래프 알고리즘, 수치연산 알고리즘을 이해하고 NP 문제를 식별할 수 있다

3. 시스템 프로그래밍

  • 컴파일러, 링커, 인터프리터를 구분하지 못한다
  • 컴파일러, 링커, 인터프리터를 설명할 수 있다
  • 커널모드/유저모드 차이를 설명할 수 있다
  • 스레딩/멀티스레딩, 동기화와 락을 이해하고 어떻게 구현되었는지 설명할 수 있다

  • 컴파일러, 링커, 인터프리터를 구분하지 못한다
  • 컴파일러, 링커, 인터프리터를 이해한다. 하드웨어 레벨의 어셈블러 언어 동작을 이해한다. 가상 메모리와 페이징에 대한 이해가 있다
  • 커널모드/유저모드의 차이를 알고, 멀티스레딩, 동기화를 이해하고 그것들이 어떻게 구현되었는지 안다. 어셈블리 코드를 읽을 수 있다. 네트워크가 어떻게 동작하는 지 안다. 프로토콜을 알고, 소켓 수준의 프로그램을 읽을 수 있다
  • 전체 프로그래밍 스택을 이해한다. 하드웨어(CPU, 메모리, 캐시, 인터럽트, 마이크로코드), 바이너리 코드, 어셈블리, 정적/동적 링킹, 컴파일, 인터프리테이션, JIT 컴파일, 가비지 컬렉션, 힙, 스택, 메모리 어드레싱 등을 구분해서 이해한다

설계

1. 객체 지향

  • 인터페이스를 왜 써야하는 지 모른다
  • 캡슐화와 추상화를 이해하고 어떤 상황에서 써야하는지 알고 있다
  • 디자인 패턴과 안티 디자인 패턴을 상당수 알고 있다
  • 이를 통해 프레임워크를 구축해본 경험이 있다

2. DI

  • DI나 IoC가 무엇인지 모른다
  • 왜 빈을 주입해야 하고 왜 이것이 낮은 결합도를 만드는지 안다
  • 스프링에서 DI가 어떻게 구현되어 있는지 알고 있다
  • DI와 IoC에 대해 하루종일 설교할 수 있다

3. 모델링

  • 논리적 모델과 물리적 모델이 무엇을 말하는지 모른다
  • 논리적 모델과 물리적 모델을 구분하여 모델링할 수 있다
  • L자형 테이블이 왜 위험한지 알고 있다 (필드가 많이 늘어나는 것이 어떤 영향을 미치는지 이해한다)
  • 정규화를 알고 이를 적용하여 모델링을 할 수 있다

프로그래밍 (경력)

1. 프로그램 분해

  • 라인 단위의 복사/붙여넣기로 코드를 작성한다
  • 문제를 여러 함수로 나눠서 코딩한다
  • 재사용 가능한 객체로 코드를 작성한다
  • 적절한 알고리즘으로 제네릭/OOP 방법을 써서 변경이 있을 법한 부분은 적절히 캡슐화하면서 코딩한다

2. 시스템 분해

  • 파일 1개 클래스 1개 이상의 범위를 생각하지 못한다
  • 같은 플랫폼 같은 기술 범위 내에서는 문제를 쪼개서 해결책을 설계해 낼 수 있다
  • 다양한 기술과 시스템에 걸쳐 있는 문제에 대한 솔루션을 만들어 낸다
  • 복잡한 제품들을 가시화하여 설계하고 외부 시스템과 연동을 이끌어 낸다. 모니터링, 리포팅, 장애복구 등의 운영 작업도 설계할 수 있다

3. 의사소통

  • 아이디어와 생각을 잘 표현하지 못하고, 맞춤법과 문법이 엉망이다
  • 동료에게 무슨 의도로 말하는지 이야기할 수 있다. 맞춤법과 문법은 좋다
  • 효과적으로 의사 소통할 수 있다
  • 모호한 상황에서 생각/설계/아이디어/스펙을 이해하고 소통할 수 있으며, 상황에 맞게 소통할 수 있다

4. 파일 내의 코드 구성

  • 코드 파일 내에서 구조화가 안 되어 있다
  • 메소드들이 논리적으로든 접근성으로든 어떻게든 구조화되어 있다
  • 코드가 영역별로 그루핑되어 있고, 주석도 잘 되어 있고, 서로 다른 파일 간의 참조도 잘 설명되어 있다
  • 파일은 라이선스 헤더도 있고, 요약 설명도 있고, 주석도 잘 되어 있고, 공백 사용은 일관성이 있고, 파일 자체가 보기 좋게 정렬되어 있다

5. 파일 간의 코드 구성

  • 파일 간 구성에 대한 어떤 구조도 없다
  • 파일들이 폴더로 나뉘어 있다
  • 파일별로 고유한 목적이 있다. 예를 들어 클래스 하나 정의, 기능 하나 구현 등
  • 코드 구성이 설계와 잘 매치되어 코드 파일명만 보더라도 설계에 대한 이해를 할 수 있도록 만든다

6. 코드 가독성

  • 코드 가독성에 대한 고려가 없다
  • 파일, 변수, 클래스, 메소드 등에 대한 이름을 잘 부여한다
  • 통상적이지 않은 코드나 버그 수정이나 전제 조건 등에 대해서 주석을 잘 달아둔다
  • 전제 조건은 asssert로 검증한다. nesting 단계가 깊지 않고, 자연스럽게 코드가 흐른다

7. 방어적 코딩

  • 방어적 코딩이 뭔지 모른다
  • 인수를 다 체크하고, 크리티컬한 전제 조건에 대해서 assert를 사용한다
  • 리턴 값도 체크하고, 예외를 항상 체크한다
  • 방어적 코딩을 하기 위한 자신만의 라이브러리가 있다. 실패 케이스를 시험하는 유닛 테스트 코드를 작성한다

8. 에러 핸들링

  • 정상적으로 작동될 경우만을 염두에 두고 코드를 작성한다
  • 예외/에러가 생성되는 주변에 기본적인 에러 핸들링 코드가 있다
  • 예외/에러로 가도 프로그램이 안정적인 상태에 있도록 유지한다. 리소스, 커넥션, 메모리 등이 깨끗하게 해제됨을 보장한다
  • 가능한 예외 상황을 미리 감지해 내도록 코딩한다. 코드 전체에 대해 일정한 예외 핸들링 정책을 사용한다. 전체 시스템에 대한 예외 핸들링 가이드라인을 만든다

9. IDE

  • 대부분 텍스트 에디팅에 IDE를 사용한다
  • 인터페이스 이면에 숨어있는 IDE 기능을 메뉴에서 효과적으로 불러내서 쓴다
  • 거의 모든 IDE 사용을 단축키로 한다
  • IDE에 매크로를 정의해서 사용한다

10. API

  • 자주 문서를 봐야 한다
  • 기억 속에 자주 쓰는 API는 들어있다
  • API에 대해서 폭넓고 깊이 있는 이해를 하고 있다
  • 자주 호출하는 것에 대해서 단순화시키기 위해 API 위에 라이브러리를 추가로 개발하고 결과적으로 API의 부족한 점은 직접 채운다

11. 프레임워크

  • 코어 플랫폼 밖의 어떤 프레임워크도 쓰지 않는다
  • 유명 프레임워크를 들어는 봤으나 써보지는 못했다
  • 프레임워크를 여러 개 능숙하게 쓰고 해당 프레임워크를 효과적으로 잘 쓰는 전형적인 방법을 알고 있다
  • 프레임워크를 직접 개발한다

12. 요구사항

  • 주어진 요구사항을 코드 스펙으로 바꾼다
  • 스펙에서 비어있는 케이스에 대한 질문을 할 수 있다
  • 전체 그림을 이해하고 스펙으로 정의할 영역 전체를 도출해 낸다
  • 경험에 기반해서 주어진 요구사항에 대해 더 좋은 대안과 플로우를 제시할 수 있다

13. 스크립팅

  • 스크립팅 툴을 모른다
  • 배치파일, 쉘 스크립팅을 한다
  • Perl/Python/Ruby/VBScript/Powershell 류의 스크립팅을 한다
  • 재사용 가능한 코드를 짜고 공개한다

14. 데이터베이스

  • 제대로 데이터베이스에 대한 개념을 학습하지 못했다
  • 데이터베이스의 기본 개념과 ACID, 정규화, 트랜잭션을 이해한다
  • 실행될 쿼리를 염두해서 스키마를 정규화 정의할 수 있고, 뷰, 스토어드 프로시저, 트리거, 사용자 정의 타입을 다룰 수 있다
  • 기본 DB관리, 성능 최적화, 인덱스 최적화, 고급 SELECT 쿼리를 작성할 수 있고, 커서를 이해하며, 데이터가 내부적으로 어떻게 저장되는지 알며, 인덱스가 어떻게 저장되는 지 알고, 데이터베이스 미러링, 복제를 이해하고, 2-페이스 커밋을 이해한다

Java

1. 문법

  • 간단한 문법을 이해하고 프로그램을 작성할 수 있다
  • 리플렉션을 이해하고 사용할 수 있다
  • 어노테이션을 어떻게 쓰고 어떻게 구현할 수 있는지 알고 있다
  • 인터페이스와 클래스의 각종 고급 문법을 알고 적용할 수 있다. 디자인 패턴의 존재를 알고 있다.

2. 빌드

  • IDE(이클립스)가 아니면 빌드를 할 수 없다
  • 커맨드라인으로 빌드를 만들 수 있다
  • 빌드 스크립트를 직접 작성할 수 있다
  • 문서, 설치 스크립트, 릴리스 노트를 포함한 빌드 스크립트를 작성한다

3. 테스트

  • 테스트를 하지 않는다
  • System.out.print를 사용하여 문자열을 찍어본다
  • 유닛 테스트를 작성한다
  • TDD를 이해한다 (반드시 TDD를 하고 있어야 한다는 의미가 아님)

데이터베이스

1. 쿼리 작성

  • 기본적인 CRUD를 작성할 수 있다
  • inline view를 사용하여 복잡한 질의문을 작성할 수 있다
  • 각종 join을 다룰 수 있으며, 집계 쿼리, group by 등을 사용할 수 있다
  • 100만 건 이상의 데이터가 누적되어 있는 상황에서 쿼리를 작성해본 경험이 있다

2. 대용량 데이터베이스

  • 실행 계획이 뭔지 모른다
  • Clustered Index와 Non-clustered Index의 차이를 안다
  • 실행 계획을 변경하기 위해 hint를 사용할 수 있다
  • 파티셔닝과 병렬 처리를 제어할 수 있고, 각종 튜닝 방법에 대해 알고 있다

3. 데이터베이스 개념

  • 제대로 데이터베이스에 대한 개념을 학습하지 못했다
  • ACID, 정규화, 트랜잭션을 이해한다
  • 스키마를 정규화해서 정의할 수 있고, 뷰, 스토어드 프로시저, 트리거, 사용자 정의 타입을 다룰 수 있다
  • 쿼리 트랜스포머를 어느 정도 이해하고 있으며, 내부적으로 인덱스가 어떻게 저장되어 있고 작동하는지 이해하고 있다

소프트웨어 엔지니어링 (경력)

1. 소스코드 버전 관리

  • 날짜 단위의 폴더를 백업
  • CVS, SVN, VSS 등의 사용을 시작했다
  • CVS/SVN에 대한 능숙한 사용, 브랜치/머지를 할 수 있고, 패치를 만들 수 있고, 저장소 속성에 맞게 만들 수 있다
  • 분산 VCS 시스템을 이해한다. Bzr/Mercurial/Darcs/Git 등을 써봤다

2. 빌드 자동화

  • IDE에서만 빌드할 수 있다
  • 커맨드 라인으로 빌드를 만들 수 있다
  • 빌드 스크립트를 직접 작성한다
  • 문서, 설치 인스톨러, 릴리스 노트를 포함한 빌드 스크립트를 만든다

3. 테스트 자동화

  • 테스트는 테스터의 일이라고 생각한다
  • 유닛 테스트를 짜고 새로 짜는 코드에 유닛 테스트를 작성하고 있다
  • TDD 방식으로 코드를 작성한다
  • 기능적, 로드/성능적, GUI 측면의 테스트 자동화를 이해하고 실현한다

지식 (경력)

1. 툴

  • 자주 쓰는 IDE만 알고 있다
  • 유명하거나 표준적인 다른 도구들을 쓸 줄 안다
  • 에디터, 디버거, IDE에 대해 잘 알고 있고 오픈 소스 대체물도 잘 알고 있다
  • 도구를 직접 만들 수 있다

2. 최신 기술 이해

  • 최신 기술을 모른다
  • 해당 분야의 최신 기술을 들어는 봤다
  • 알파 프리뷰, CTP, 베타를 다운로드해 봤다. 온라인 매뉴얼 등을 읽어 봤다
  • 프리뷰를 시험해보고, 뭔가 만들어 봤다

3. 플랫폼 내부

  • 플랫폼 내부에 대해 전혀 모른다
  • 플랫폼 내부가 어떻게 동작하는지 기본 이해를 가지고 있다
  • 플랫폼 내부가 어떻게 동작하는지 잘 알고 있고, 가시화시켜서 플랫폼이 어떻게 코드를 실행시키는지 설명할 수 있다
  • 플랫폼 내부에 대한 정보를 제공하기 위해서 디컴파일, 디버깅, 디스어셈블을 하거나 툴을 만든다

4. 책

  • 간단한 문법을 다룬 책을 위주로 몇 권 읽어 봤다
  • 코드 컴플리트를 비롯한 스티브 맥코넬의 저서 또는 켄트벡이나 마틴 파울러의 저서를 읽어 봤다 (방법론에 대한 책)
  • 이펙티브 C++, 이펙티브 Java, 그 외 각종 실용적이면서 중급 사용자에게 적절히 도움이 되는 책을 읽어 봤다
  • 아트 오브 컴퓨터 프로그래밍, 자바스크립트 닌자의 비밀, 대용량데이터베이스 솔루션 등의 고급 서적을 읽어 봤다
  • (어떤 책을 읽어봤는지 추가로 서술해주셔도 좋습니다)

문서화

1. 문서포맷

  • 문서 작성이 서툴고 뭘 작성해야하는지 자발적으로 판단하지 못한다
  • 프로젝트에 필요한 문서 포맷이 어떤 것인지 알고 있고 적어도 1개 이상의 프로젝트에서 단계별 문서를 작성해 본 적이 있다
  • 여러 SW 프로젝트에서 SW 사용된 다양한 문서 포맷을 작성해 본 적이 있고 확보하고 있다
  • 필요하면 문서 세트를 직접 정의할 수 있고, 가장 좋은 실천법을 알고 있다

2. 오피스 도구 사용

  • 오피스 도구 사용법을 완전히 숙지하지 않은 상태이다
  • 오피스를 이용해서 각종 문서를 작성하지만 문서 포맷이 주어지지 않으면 애를 먹는다
  • 사용법을 완전히 숙지하고 있으며, 단축키도 사용하고 효율적으로 작성할 수 있다
  • 상당한 작업을 단축키로 수행하며 매크로도 직접 정의해서 사용하고 공개판 외의 도구들도 적극적으로 사용하여 효과적인 문서를 생산한다

기타

1. 책

  • 간단한 문법을 다룬 책을 위주로 몇 권 읽어 봤다
  • 코드 컴플리트를 비롯한 스티브 맥코넬의 저서 또는 켄트벡이나 마틴 파울러의 저서를 읽어 봤다 (방법론에 대한 책)
  • 이펙티브 C++, 이펙티브 Java, 그 외 각종 실용적이면서 중급 사용자에게 적절히 도움이 되는 책을 읽어 봤다
  • 아트 오브 컴퓨터 프로그래밍, 자바스크립트 닌자의 비밀, 대용량데이터베이스 솔루션 등의 고급 서적을 읽어 봤다
  • (어떤 책을 읽어봤는지 추가로 서술해주셔도 좋습니다)

2. 인터넷 커뮤니티 활동

  • 개발과 관련된 어떠한 커뮤니티 활동도 하지 않는다
  • 자주 가는 블로그, 또는 개발자 위주로 된 트위터 리스트를 갖고 있다
  • 프로그래밍에 관한 개인적인 통찰이나 생각을 표현하는 블로그를 갖고 있으며 이것을 다른 개발자와 공유한다

3. 외국어 수준

  • 한국어가 아닌 자료로는 기술 습득이 불가능하다
  • 영어로 된 기술 교재를 읽고 기술을 파악한다
  • 미국인/영어권 사용자로부터 개발 업무를 지시받고 업무 수행 후에 결과를 보고할 수 있다
  • 영어권 사용자로부터 SW를 발주 받아, 인도/중국인에게 개발 업무를 아웃소싱하고 국내 팀과 연계하여 국제적인 프로젝트를 진행할 수 있다

4. 기타

  • 무엇이라도 좋습니다. 사진, 그림그리기, 만화, 인터넷 활동, 음악, 글쓰기, 잉여력 발산, 게임 등 지금까지 했던 활동 중에서 어떤 걸 어디까지 알고 있는지 자랑할 만한 것이 있으면 기술해주세요. 다만 너무 길게 쓰지는 말아주세요.
  • 또한 무엇이라도 좋습니다. 서비스, 플랫폼, 업무 환경, 시스템, 소스코드, 인사 관리 등 지금까지 업무를 해오면서 업무에 불만 또는 비효율적인 부분을 개선했던 사례가 있으면 기술해주세요. 문제점을 인식하는 과정이나 그것을 개선하기 위해 어떠한 노력을 기울였으며 어떤 결과가 있었는지 써주시면 됩니다.

프로그래머 능력 매트릭스

단계 마다의 지식은 누적됩니다.; n 단계는 n보다 낮은 단계의 모든 것을 알고있다는 것을 함축합니다.

전산학(Computer Science)
 자료구조
 (data structures)
 2n
 (Level 0)
 Array 와 LinkedList 간의 차이를 알지 못합니다.
 n2
 (Level 1)
 Arrays, LinkedLists, Dictionaries 을 설명하고 구체적인 프로그래밍 작업에서 사용할 수 있습니다.
 n
 (Level 2)
 Arrays와 LinkedLists 같은 기본 자료구조에서 공간과 시간 트레이드 오프를 알고 있고, hashtables이 어떻게 구현되고 충돌과 우선순위 큐를 다룰 수 있는지와 이들을 구현하는 방법을 설명할 수 있습니다.
 log(n)
 (Level 3)
 B-trees, binomial and fibonacci heaps, AVL/Red Black trees, Splay Trees, Skip Lists, tries 같은 고급 자료구조에 대한 지식이 있습니다.
 Comments  
 알고리즘
 (algorithms)
 2n
 (Level 0)
 배열에서 평균값을 찾지 못합니다. (믿기 어렵지만, 이런 후보자를 면접했습니다.)
 n2
 (Level 1)
 기본적인 정렬, 검색, 자료구조 탐색과 조회 알고리즘
 n
 (Level 2)
 Tree, Graph, simple greedy, divide and conquer algorithms를 아는데, 이 매트릭스의 레벨의 관련성을 이해합니다.
 log(n)
 (Level 3)
 동적인 프로그래밍 솔루션, 그래프 알고리즘에 대한 멋진 지식, 수치 계산 알고리즘에 대한 좋은 지식을 인지하고 코딩할 수 있으며, NP 문제를 구별할 수 있습니다.
 Comments  훌륭한 탑코더 랭킹을 가진 사람과 일하는 것은 믿을 수 없는 행운입니다!
 시스템 프로그래밍
 (systems programming)
 2n
 (Level 0)
 compiler, linker, interpreter가 무엇인지 모릅니다.
 n2
 (Level 1)
 compilers, linker, interpreters에 대한 기본 이해가 있습니다. assembly 코드가 무엇이며 하드웨어 레벨에서 어떻게 동작하는지 이해합니다. 가상 메모리와 페이지에 대한 약간의 지식이 있습니다.
 n
 (Level 2)
 kernel mode와 user mode, multi-threading, synchronization primitives와 이들이 어떻게 구현되었는지를 알고 있고 assembly 코드를 읽을 수 있습니다. 네트워크가 어떻게 동작하는지 이해하며, 네트워크 프로토콜과 소켓 레벨 프로그래밍을 이해합니다.
 log(n)
 (Level 3)
 하드웨어(CPU + Memory + Cache + Interrupts + microcode), 바이너리 코드, 어셈블리, 정적,동적 링킹, 컴파일과 인터프리테이션, JIT 컴파일, 가베지 콜레션, 힙, 스택, 메모리 주소지정등 전반적인 프로그래밍 스택을 이해합니다.
 Comments  

 

소프트웨어 공학(Software Engineering)
 소스코드 버전관리
 (source code version control)
 2n
 (Level 0)
 날짜별로 폴더 백업
 n2
 (Level 1)
 VSS와 CVS/SVN 사용하기 시작합니다.
 n
 (Level 2)
 CVS와 SVN 기능에 익숙합니다. branch, merge, 패치와 저장소 속성을 설정하는 방법을 알고 있습니다.
 log(n)
 (Level 3)
 분산 VSC 시스템을 알고 있습니다. Bzr/Mercurial/Darcs/Git을 시도해봤습니다.
 Comments  
 빌드 자동화
 (build automation)
 2n
 (Level 0)
 IDE로부터 빌드하는 방법만 알고 있습니다.
 n2
 (Level 1)
 명령어로 시스템을 빌드하는 방법을 알고 있습니다.
 n
 (Level 2)
 기본 시스템을 빌드하는 스크립트를 설정할 수 있습니다.
 log(n)
 (Level 3)
 시스템과 문서, 설정파일을 빌드하고 릴리즈 노트를 만들고 소스 컨트롤에 있는 코드로부터 태깅을 하는 스크립트를 설정할 수 있습니다.
 Comments  
 테스트 자동화
 (automated testing)
 2n
 (Level 0)
 모든 테스트가 테스터의 일이라고 생각합니다.
 n2
 (Level 1)
 자동화된 유니트 테스트를 작성하고, 코드를 작성할 때 좋은 유니트 테스트 케이스를 함께 작성합니다.
 n
 (Level 2)
 TDD 방법으로 코드를 작성합니다.
 log(n)
 (Level 3)
 자동화된 기능, 로드/성능, UI 테스트를 이해하고 작성할 수 있습니다.
 Comments  

 

프로그래밍(Programming)
 문제 분해
 (problem decomposition)
 2n
 (Level 0)
 코드 재사용을 위해 Copy&Paste로 직접 코딩을 합니다.
 n2
 (Level 1)
 여러개의 함수로 문제를 쪼갤수 있습니다.
 n
 (Level 2)
 전체 문제를 풀기 위한 재사용가능한 함수와 객체를 작성할 수 있습니다.
 log(n)
 (Level 3)
 적절한 자료구조와 알고리즘을 사용하고 변경될 수 있는 문제를 캡슐화시키는 일반적인/객체지향적인 코드를 작성합니다.
 Comments  
 시스템 분해
 (systems decomposition)
 2n
 (Level 0)
 단일 file/class 이상으로 생각할 수 없습니다.
 n2
 (Level 1)
 문제공간을 쪼개고 동일한 플랫폼/기술안에서 가능한 솔루션을 설계할 수 있습니다.
 n
 (Level 2)
 여러 기술/플램폼으로 확장가능한 시스템을 설계할 수 있습니다.
 log(n)
 (Level 3)
 여러 개의 제품 라인을 가지고 외부 시스템과 통합되는 복잡한 시스템을 시각화하고 설계할 수 있습니다. 모니터링, 레포팅, 장애극복 같은 지원 시스템 기능을 설계할 수 있습니다.
 Comments  
 소통
 (communication)
 2n
 (Level 0)
 동료에게 생각/아이디어를 설명할 수 없습니다. 철자와 문법이 서툽니다.
 n2
 (Level 1)
 말한 내용을 동료가 이해할 수 있습니다. 철자와 문법이 괜찮습니다.
 n
 (Level 2)
 동료와 효과적인 소통을 할 수 있습니다.
 log(n)
 (Level 3)
 생각/설계/아이디어/명세를 명백한 방법으로 이해하고 소통하고 컨텍스트에 따라 소통을 바로잡을 수 있습니다.
 Comments  소통은 자주 평가절하되지만 프로그래머를 평가하는데 매우 중요합니다. 영어가 모국어가 아닌 곳에 프로그래밍 작업을 외주가 늘어남에 따라 소통 이슈는 더욱 두드러지고 있습니다. 프로그래머가 소통의 의도를 이해하지 하지 못하여 실패한 여러 프로젝트들을 알고 있습니다.
 파일에서
 코드 구조화
 (code organization within a file)
 2n
 (Level 0)
 파일을 조직한다는 증거가 없습니다.
 n2
 (Level 1)
 메써드가 논리적 또는 접근성에 따라 그룹핑됩니다.
 n
 (Level 2)
 코드는 영역으로 그룹되어 있고, 다른 소스 파일에 레퍼런스된 괜찮은 주석이 달려있습니다.
 log(n)
 (Level 3)
 파일은 라이센스 헤더, 요약, 괜찮은 주석, 지속적인공백 문자사용을 합니다. 이 파일은 보기에도 아릅답습니다.
 Comments  
 파일간의
 코드 구조화
 (code organization across files)
 2n
 (Level 0)
 파일간의 구조화에 대한 생각이 없습니다.
 n2
 (Level 1)
 연관된 파일을 분류하여 폴더에 넣습니다.
 n
 (Level 2)
 물리적인 파일은 독자적인 목적을 가집니다. 예로, 하나의 클래스 정의, 하나의 기능 구현 등.
 log(n)
 (Level 3)
 물리적인 레벨의 코드 구조는 설계와 깊숙하게 대응되고 파일이름과 폴더 배치는 설계에 대한 통찰을 제공합니다.
 Comments  
 소스 트리 구조화
 (source tree organization)
 2n
 (Level 0)
 하나의 폴터에 모든 게 있습니다.
 n2
 (Level 1)
 코드의 기본 분리를 논리적인 폴더로 합니다.
 n
 (Level 2)
 어떤 순환적인 의존없이, binaries, libs, docs, builds, third-party code 모두 적절한 폴더에 있습니다.
 log(n)
 (Level 3)
 소스 트리의 물리적인 배치는 논리적인 계층과 구조와 부합합니다. 디렉터리 이름과 구조는 시스템의 설계에 대한 안목을 제공합니다.
 Comments  이것과 이전 아이템과의 차이는 구조의 규모인데, 소스 트리 구조화는 시스템을 정의하는 전반적인 산물의 집합과 관련됩니다.
 코드 가독성
 (code readability)
 2n
 (Level 0)
 한 음절의 이름
 n2
 (Level 1)
 파일, 변수, 클래스, 메써드 등을 위한 좋은 이름
 n
 (Level 2)
 긴 함수가 없고, 별난 코드를 설명하는 주석, 버그 픽스, 코드 가정
 log(n)
 (Level 3)
 코드 가정은 asserts을 사용하여 검증되고, 코드는 자연스럽게 흘러갑니다 - 깊게 반복되는 조건이나 메써드가 없습니다.
 Comments  
 방어적인 코딩
 (defensive coding)
 2n
 (Level 0)
 방어적인 코딩 개념을 이해하지 못합니다.
 n2
 (Level 1)
 모든 인자값을 검사하고 코드에서 결정적인 가정을 asserts 합니다.
 n
 (Level 2)
 리턴값을 검사하는 것을 확신하고 실패할 수 있는 코드주변에 예외처리를 확인합니다.
 log(n)
 (Level 3)
 방어적인 코딩을 돕는 자신만의 라이브러리를 가지고 있고, 실패를 가상하는 유니트 테스트를 작성합니다.
 Comments  
 에러 처리
 (error handling)
 2n
 (Level 0)
 오직 행복한 경우만 코딩합니다.
 n2
 (Level 1)
 예외를 던지고/에러를 발생시키는 코드에 대한 기본 에러 처리
 n
 (Level 2)
 에러/예외처리가 자원, 연결, 메모리가 모두 깔끔하게 되는 좋은 상태로 프로그램이 종료되는 것을 확신합니다.
 log(n)
 (Level 3)
 가능한 예외가 발생하기 전에 탐지하고, 코드의 모든 계층에서 지속적인 예외 처리 전략을 유지하고, 전체 시스템을 위한 예외 처리에 대한 가이드라인을 따르는 코드
 Comments  
 통합개발환경
 (IDE)
 2n
 (Level 0)
 대부분 텍스트 에디팅을 위한 IDE를 사용합니다.
 n2
 (Level 1)
 인터페이스에 대해서 알고 있고, 메뉴를 이용하여 IDE를 효율적으로 사용할 수 있습니다.
 n
 (Level 2)
 자주 사용하는 기능에 대한 키보드 단축키를 알고 있습니다.
 log(n)
 (Level 3)
 작성된 커스텀 매크로가 있습니다.
 Comments  
 API  2n
 (Level 0)
 자주 문서를 찾아볼 필요가 있습니다.
 n2
 (Level 1)
 매우 자주 사용하는 API는 기억하고 있습니다.
 n
 (Level 2)
 광대하고 깊은 API에 대한 지식이 있습니다.
 log(n)
 (Level 3)
 자주 사용하는 작업을 단순화하고 API의 공백을 메꾸는 API의 꼭대기에 있는 라이브러리를 작성하였습니다.
 Comments  API의 예로 자바 라이브러리, .net 프레임워크 또는 응용프로그램을 위한 커스텀 API
 프레임워크
 (frameworks)
 2n
 (Level 0)
 핵심 플랫폼의 바깥쪽에 어떤 프레임워크도 사용하지 않았습니다.
 n2
 (Level 1)
 플랫폼에 사용가능한 인기있는 프레임워크를 들어는 봤지만 사용하지 않았습니다.
 n
 (Level 2)
 전문적인 역량으로 하나 이상의 프레임워크를 사용해봤고 프레임워크의 노련함을 가지고 매우 정통합니다.
 log(n)
 (Level 3)
 프레임워크의 작성자입니다.
 Comments  
 요구분석
 (requirements)
 2n
 (Level 0)
 주어진 요구사항을 가지고 명세에 따라 코딩합니다.
 n2
 (Level 1)
 명세에서 놓친 사례에 대해 질문을 합니다.
 n
 (Level 2)
 완전한 그림을 이해하고 명세화되어야 하는 전체 영역을 따라갑니다.
 log(n)
 (Level 3)
 더 좋은 대안을 제안하고 경험에 따라 주어진 요구사항을 막힘이 따라갑니다.
 Comments  
 scripting  2n
 (Level 0)
 스크립트 도구에 대해 전혀 알지 못합니다.
 n2
 (Level 1)
 Batch files/shell scripts
 n
 (Level 2)
 Perl/Python/Ruby/VBScript/Powershell
 log(n)
 (Level 3)
 재사용 가능한 코드를 작성하고 발표하였습니다.
 Comments  
 database  2n
 (Level 0)
 엑셀이 데이터베이스라고 생각합니다.
 n2
 (Level 1)
 기본적인 데이터베이스 개념, 정규화, ACID, 트랜잭션을 알고 간단한 SELECT를 작성할 수 있습니다.
 n
 (Level 2)
 쿼리가 동작하고, 뷰, 저장 프로시저, 트리거와 사용자 정의 타입을 이용하는 장점을 이해하면서 훌륭하고 정규화된 데이터베이스 스키마를 설계할 수 있습니다. 클러스터와 넌클러스터 인덱스 차이를 알고 있습니다. ORM 툴 사용에 익숙합니다.
 log(n)
 (Level 3)
 기본 적인 데이터베이스 관리, 성능 최적화, 인덱스 최적화를 하고, 고급 SELECT 쿼를 작성할 수 있으며, 관계 SQL 대신에 커서를 사용할 수 있으며, 내부적으로 데이터가 저장되는 방법을 알며, 인덱스가 내부적으로 저장되는 방법을 알며, 어떻게 데이터베이스가 미러되는지 이해합니다. 2단계 커밋이 동작하는 방법을 알고 있습니다.
 Comments  

 

Experience
 전문 경험을 가진 언어
 (languages with professional experience)
 2n
 (Level 0)
 필수적(Imperative) 또는 Object Oriented
 n2
 (Level 1)
 Imperative, Object-Oriented and declarative (SQL). static vs dynamic typing, weak vs strong typing and static inferred types 을 안다면 보너스를 추가합니다.
 n
 (Level 2)
 Functional(함수언어). lazy evaluation, currying, continuations 을 안다면 보너스를 추가합니다.
 log(n)
 (Level 3)
 Concurrent (Erlang, Oz) and Logic (Prolog)
 Comments  
 platforms with professional experience  2n
 (Level 0)
 1
 n2
 (Level 1)
 2-3
 n
 (Level 2)
 4-5
 log(n)
 (Level 3)
 6+
 Comments  
 years of professional experience  2n
 (Level 0)
 1
 n2
 (Level 1)
 2-5
 n
 (Level 2)
 6-9
 log(n)
 (Level 3)
 10+
 Comments  
 영역 지식
 (domain knowledge)
 2n
 (Level 0)
 영역에 대한 지식이 없습니다.
 n2
 (Level 1)
 하나의 영역에서 하나 이상의 제품에서 일해왔습니다.
 n
 (Level 2)
 같은 영역에서 여러개의 제품에서 일해왔습니다.
 log(n)
 (Level 3)
 여역 전문가입니다. 하나의 영역에서 여러개의 제품/솔루션을 설계하고 구현하였습니다. 도메인에서 사용하는 표준 항목과 프로토콜에 대해 매우 정통합니다.
 Comments  

 

지식(Knowledge)
 도구 지식
 (tool knowledge)
 2n
 (Level 0)
 주요한 IDE (VS.Net, Eclipse)로 제한됩니다.
 n2
 (Level 1)
 인기있고 표준적인 몇몇 대체가능한 도구를 알고 있습니다.
 n
 (Level 2)
 에디터, 디버거, IDE, 오픈소스 대체품에 대한 많이 알고 있습니다. 예로, Scott Hanselman's power tools 목록의 대부분을 알고 있습니다. ORM 툴도 사용합니다.
 log(n)
 (Level 3)
 도구와 스크립트를 실제 작성했습니다. 공개했다면 추가적인 보너스입니다..
 Comments  http://www.hanselman.com/tools/
 노출된 언어
 (languages exposed to)
 2n
 (Level 0)
 필수적(Imperative) 또는 Object Oriented
 n2
 (Level 1)
 Imperative, Object-Oriented and declarative (SQL). static vs dynamic typing, weak vs strong typing and static inferred types 을 안다면 보너스를 추가합니다.
 n
 (Level 2)
 Functional(함수언어). lazy evaluation, currying, continuations 을 안다면 보너스를 추가합니다.
 log(n)
 (Level 3)
 Concurrent (Erlang, Oz) and Logic (Prolog)
 Comments  
 코드베이스 지식
 (codebase knowledge)
 2n
 (Level 0)
 코드베이스를 본 적이 없습니다.
 n2
 (Level 1)
 코드 레이아웃과 시스템을 어떻게 빌드하는가에 대한 기본 지식과
 n
 (Level 2)
 수차례 버그를 고치면서 구현되고 적은 기능을 가지는, 코드베이스의 훌륭하게 동작하는 지식
 log(n)
 (Level 3)
 여러개의 커다란 기능을 구현하였고 대부분의 기능과 버그수정을 위한 요구되는 변화를 쉽게 시각화할 수 있습니다.
 Comments  
 신기술에 대한 지식
 (knowledge of upcoming technologies)
 2n
 (Level 0)
 신기술에 대해 들은 적이 없습니다.
 n2
 (Level 1)
 해당 분야에 대한 신기술을 들어봤습니다.
 n
 (Level 2)
 alpha preview/CTP/beta를 다운로드 하고 기사와 메뉴얼을 읽습니다.
 log(n)
 (Level 3)
 previews를 가지고 놀며 실제로 무엇인가를 만들며 보너스로 다른 사람들에게 공유합니다.
 Comments  
 platform internals  2n
 (Level 0)
 플랫폼 내부에 대한 지식이 없습니다.
 n2
 (Level 1)
 플랫폼이 내부적으로 동작하는 기본 지식을 가지고 있습니다.
 n
 (Level 2)
 플랫폼 내부에 대한 깊은 지식이 있으며 플랫폼이 프로그램을 어떻게 실행코드로 바꾸는지 시각화할 수 있습니다.
 log(n)
 (Level 3)
 플랫폼 내부의 정보를 제공하는 도구를 작성하였습니다. 예로, 디스어셈블러, 디컴파일러, 디버거등.
 Comments  
 책들 (books)  2n
 (Level 0)
 Unleashed 시리즈, 21 days 시리즈, 24 hour 시리즈, dummies 시리즈(초보자용)
 n2
 (Level 1)
 Code Complete, Don't Make me Think, Mastering Regular Expressions
 n
 (Level 2)
 Design Patterns, Peopleware, Programming Pearls, Algorithm Design Manual, Pragmatic Programmer, Mythical Man month
 log(n)
 (Level 3)
 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
 Comments  (역주-대부분 책 제목입니다.)
 블로그 (blogs)  2n
 (Level 0)
 블로그를 들어봤지만, 시간을 가진적은 없습니다.
 n2
 (Level 1)
 tech/programming/software engineering 블로그를 읽고, 정기적으로 podcast를 듣습니다.
 n
 (Level 2)
 수집한 유용한 기사와 도구에 대한 약간의 모음을 가진 링크 블로그를 운영합니다.
 log(n)
 (Level 3)
 프로그래밍에 대한 개인적인 통찰과 생각을 나누는 블로그를 운영합니다.
 Comments  

References