프로그래머

From Hidden Wiki
(Redirected from 웹 프로그래머)
Jump to navigation Jump to search
필독 사항 유닠스 계열 저작물, 성인물, 도박 웹 써버 보안 프로그래밍 그래핔 파싱
필독 사항 고스트BSD 표면 웹 싸이트 제작 리눅스 마스터 파이썬 트킨터 뷰티펄 숲
수학 아이투피 마약, 아청물, 해킹 웹 싸이트 보안 웹 프로그래밍 데이터 분석 게임 제작
통계학 뮤와이어 다크넽 싸이트 제작 정보 보안 기사 쟁고우 팬더즈 파이게임

개요

컴퓨터 분야에서, 프로그래머(programmer)란 컴퓨터 프로그래밍을 하고 컴퓨터 소프트웨어를 개발하는 사람을 말한다. 프로그래머는 거대한 메인프레임상의 소프트웨어를 개발하고 유지하기도 한다. 이 같은 의미에서 프로그래머는 소프트웨어 공학자 또는 소프트웨어 개발자로 간주할 수 있다.

에이다 러브레이스는 역사상 최초의 프로그래머로 여겨진다. 그녀는 1842년 10월에, 찰스 배비지해석 기관 컴퓨터 상의 구현을 알고리즘으로 설명한 최초의 사람이다.

컴퓨터 프로그래밍 기술에 능숙한 사람들은 유명세를 타기도 하지만, 이러한 관심은 보통 소프트웨어 공학자 집단으로 국한된다. 많은 저명한 프로그래머들이 종종 "해커"라는 명칭으로 불린다. 프로그래머는 보통 개인주의적 괴짜 집단으로나 틀에 박힌 것과 노조 등에 거부감을 지닌 이미지로 연상된다.

프로그래머는 다양한 형태를 가진다. 전문 프로그래머는 보통 IT 분야의 큰 회사나 작은 서비스 업체에서 일한다. 이것에 대하여 여러가지 자격증 등이 있다.

IT 프로그래머는 보통 IT분야의 회사에서 일하거나 만든다. 그리고 그들은 프로그램을 만들고, 베타 테스터 들 한테 첫 시험판을 주어 오류가 나는지 살핀다. 그다음 오류가 나지 않으면 그것을 알파 버전으로 한정적으로 판다. 사용자들 에게도 문제가 일어나지 않으면 그것을 정식 버전으로 판다. 그리고 많은 사람들은 가벼운 프로그램만 개발한다고 생각하고 아주 적게 공부해도 들어가도 되는 것으로 여기지만 사실은 아주 많은 컴퓨터 언어들과 다른 것들을 공부하여야 한다.

파이썬(Python)을 배우면 오픈 소스토어챝(TorChat)의 소스 코드를 수정하여 자신이 원하는 기능을 마음대로 추가할 수 있다.


현실의 프로그래머

이나 ㅈㄴ 벌고싶은데 너네들이 구체적으로 어캐버는지 뭐하고 버는지도 궁금하고 계속 눈깔로 너네 씨부리는거 봣는대 뭐라는지 몰라서 글이나끄적인다 궁금하니까 이렇게 써봣다 rio라고 통성명하고 궁금한거있을때마다 ㅇㅈㄹ할꺼니까 양해좀 구한다


파이썬 프로그래밍 배우기

1. 인터넷으로 독학

2. 으로 독학

3. 학원 인강을 들음

4. 오프라인 학원에 다님

5. 대학교 컴퓨터 공학과에 진학


버는 방법

1. 마약 싸이트를 만들어서 에스크로우 수수료를 받는다. 하이 코리아 매출액이 200억원이고 수수료가 5%라면 10억원이지.

2. 어린이 사랑 싸이트 만들어서 아청물을 판다. 웰컴 투 비디오(Welcome to video) 운영자 손모씨가 2년 8개월 동안 415 btc (41억 5천만원) 벌었지.


C 언어는 그럴듯한 프로그램 만들 때까지 너무 오래 걸리고, 빨리 배워서 빨리 만들어볼 수 있는 파이썬부터 시작하는 게 좋지.

http://c2djzrn6qx6kupkn.onion/res/46129.html


리눅스 마스터 1급

리눅스 마스터 문서 참조.


정보 보안 기사

정보 보안 기사 문서 참조.


경찰청 사이버 수사 요원 채용 시험

경찰청 사이버안전국, 사이버안전국, 사이버수사대


  • '09 경찰청 사이버수사요원 특별 채용 낙방기 - 실기시험편...

2009.11.12

아래는 시험관들이 한 질문들을 적어본 것입니다.

Java의 Access Modifiers 4가지를 설명하라.

※ Overloading과 Overriding의 차이점을 설명하라.

※ Interface는 왜 사용하는지 설명하라.

※ Java Thread의 실행 순서를 제어하기 위한 메소드를 무엇이라고 하는가?

※ 2차원 배열과 1차원 배열 2개의 차이점을 설명하라.

※ 데이터 전송시 동기식 전송과 비동기식 전송의 차이점을 설명하라.

SQL injection은 무엇인지 설명하고 본인은 어떻게 대처하고 있는지 말하여라.

참고로 지원 자격은 기사산업기사 취득후 경력 3년 이상, 또는 학사 학위 이후 경력 2년 이상, 또는 석사 학위 이상이였습니다.

http://huikyun.tistory.com/308


  • 경찰공무원(사이버수사) 경력경쟁채용 준비 후기

2017.04.16

1. 정보처리 관련 자격증 보유자로, 자격증 취득 후 채용 분야 3년 이상 경력 (정보처리 관련 자격증: 정보처리 기사, 정보처리 산업기사, 정보보안 기사, 정보보안 산업기사)

2. 전산 관련 분야 학사 학위 취득 후, 채용 분야 2년 이상 경력자 (전산 관련 분야: 전산학, 컴퓨터공학, 소프트웨어공학, 정보통신공학, 정보보호학, 전자공학, 수학. ※ 전자․전기 제외)

3. 전산 관련 분야 학사 학위 취득 후, 관련 분야 석사학위 취득


내 기억에 면접관 4명에 응시자 5명정도씩 끊어서 면접을 보았다. 한명씩 짧게 자기소개도 하고, 그 다음부터 면접관분들이 한명씩 지목해서 이것저것 물어보신다. 디지털 포렌식의 경우 기본적으로 디스크 포렌식 등의 지식과, 경찰이다보니 기본적으로 '증거 법'에 대한 이해 등을 주로 물어보았다. 그리고 전문성기술서(자기소개서)에 기재된 내용을 바탕으로 "영상쪽에서 일하셨네요? 블랙박스에 저장되는 확장자 파일에 대해서 말해보세요" 라던지, "네트워크 엔지니어셨네요? 서버가 갑자기 다운됐을 때 데이터가 소실되는 경우라면..~ 할지 설명하세요." 라는 질문이 생각이 난다. 물론 매년 면접관이 바뀌기 때문에 꼭 이렇게 물어보지는 않겠지만은 ㅋ 그리고 또 어떤분은 일부러 재미로 그러셨는지, 한명씩 잡아서 "김**씨는 디스크, 침해사고 대응, 미디어 이 중에서 뭐 하실래요? 하나 골라봐요"라고 하신 후 디스크하겠다고 했더니 "NTFS에서 ~와 ~에 대해 설명해보세요" 이렇게 구체적인 질문을 던지시는 것이었다. 그런데 난이도가 상당해서 이런식의 질문에서는 5명중 1명밖에 대답을 하지 못했었다.

https://cpuu.postype.com/post/651278


신입 사원 웹 개발자 필기 시험 문제

아래 있는 건 어느 소프트웨어 회사의 신입 사원 채용용 필기 시험 문제로 응시자들의 정답률이 나와있어 전공자들과 자신의 웹 개발 실력을 비교해볼 수 있다.

https://github.com/EBvi/dev-matrix/blob/master/dev-test.md

응시자의 64%가 전공자(컴퓨터공학, 소프트웨어학과, 전자공학부)이며 문제는 총 11 문제로 평균 정답률은 3.4개이다.


- 통계 데이터는 5%를 끊은 근사치입니다.

- 제한시간은 20분이며 지원자가 시간이 더 필요하다고 하면 최대 10분까지 더 늘렸습니다.

---

Java로 hello world를 출력하는 main 메소드를 작성하시오.

> 정답률 30%

- main 메소드를 작성할 줄 아는 것은 이 분야에 발을 담그는 것에 대한 최소한의 예의(?)라고 생각해서 출제

- 약간의 오타는 감안할 수 있으나 public static void main은 절대로 틀리면 안 됨

---

alz로 압축을 하거나, hwp로 문서를 작성하여 외국에 전송하면 안 되는 이유

alz로 압축을 하거나, hwp로 문서를 작성하여 외국에 전송하면 안 되는 이유를 설명하시오.

>정답률 90%

- 외국에서 사용하지 않는다 혹은 표준이 아니라는 등의 답변을 쓰면 정답으로 인정

---

for문을 사용하여 1에서 10까지의 합을 구하는 프로그램을 작성하시오.

for문을 사용하여 1에서 10까지의 합을 구하는 프로그램을 작성하시오. (main 메소드 불필요)

> 정답률 60%

- 기초적인 문법을 숙지하고 있는지 평가

- 대부분 부호를 잘못 써서 틀림 (1에서 10까지 더하라면 0<=10 또는 0<11로 써야 함)

- 변수 선언을 하지 않아도 정답으로 인정함

---

다음은 javadoc의 String.replaceAll 메소드에 대한 설명이다

다음은 javadoc의 String.replaceAll 메소드에 대한 설명이다. 우리말로 해석하시오.

> 정답률 15%

Replaces each substring of this string that matches the given regular expression with the given replacement.

- 영어로 된 문서를 보고 이해할 수 있는지 평가

- 정규표현식의 번역을 몰라서 regular expression으로 그대로 둬도 정답으로 인정

---

리눅스를 설치해보신 적이 있습니까?

리눅스를 설치해보신 적이 있습니까? 설치해 본 제품명을 기술하시오. 또한 어떠한 용도로 사용해 보았는지 기술하시오.

> 정답률 40%

- 종류와 버전을 불문하고 리눅스를 설치해본 경험이 있다고 하면 정답으로 인정

- OS 경험도 점수로 인정하는 편이 좋다고 생각했음

---

다음 빈칸을 채우시오.

(-----------------------) is a programming paradigm that uses "objects" – data structures consisting of data fields and methods together with their interactions – to design applications and computer programs. Programming techniques may include features such as data abstraction, encapsulation, modularity, polymorphism, and inheritance. Many modern programming languages now support (-----------------------)

> 정답률 20%

- 한글로 "객체지향프로그래밍" 또는 OOP로 쓰면 정답으로 인정

- 두 항목에 다른 대답을 쓰는 경우도 있었는데 그 경우 부분 점수를 인정

---

다음 주어진 div의 클래스를 정의하시오.

- 너비가 250px이고 높이가 300px이며, 배경색이 검은색인 hello 클래스


안녕하세요
<style type="text/css">
.hello {



}
</style>


> 정답률 25%

- 기초적인 CSS 문법을 알고 있는지 평가

- background나 background-color 모두 정답

---

세션과 쿠키의 차이점에 대해 간략히 설명하시오.

> 정답률 30%

- 서버와 클라이언트 차이에 대해 서술하면 정답으로 인정

- 라이프 사이클에 대한 설명이 있다면 금상첨화

- 세션이 보안적으로 안전하다는 데에는 이견이 있으나, 여기서는 그렇게 기술해도 정답으로 인정

---


다음 소스코드를 읽고 무엇을 하는 프로그램인지 서술하시오.

char[] arr = someString.toCharArray(); // 해당 문자열로부터 캐릭터 배열을 선언한다
StringBuffer sb = new StringBuffer();
int size = 0;
for(char c : arr) {
    size += (c > 255) ? 2 : 1; // 조건에 따라 2 또는 1을 증가시킨다
    sb.append(c);
    if(size >= 80) {
        break;
    }
}
return sb.toString();


> 정답률 10%

- char의 타입을 이해하고 있는지 평가

- 남이 짠 소스 코드를 읽을 수 있는지를 평가 (코드 리딩)

- 이 소스는 온전한 소스가 아니나 일부러 간략하게 만들었음

---

다음 javascript 소스코드가 어떻게 동작할지 서술하시오.

function f() {
    for ( var i = 0; i < 3; i++ ) {
        setTimeout( function() {
            alert( i );
        }, 1000);
    }
}
f(); // f를 실행한다



> 정답률 0%

- timer나 클로저를 이해하고 있는지 평가

- 이 문제는 일종의 덤임(신입 레벨에서 맞출 수 있는 사람이 있으리라고 기대하지 않음)

- 기대하지 않았다고 해도 이 문제를 대하는 태도와 답변에서 지원자의 많은 부분을 엿볼 수 있었음

---

다음 조건을 만족하는 SQL 질의문을 작성하시오.

사원번호(emp.seq), 이름(emp.name), 부서명(dept.name) 컬럼이 매핑되며, **모든 사원**이 전부 출력되어야 함


emp 테이블
------------------
seq | name | dept_seq
1 | 홍길동 | 2
2 | 죠나단 | 1
3 | 죠스타 | null

dept 테이블
------------------
seq | name
1 | 개발부
2 | 운영부


> 정답률 10%

- left outer join 문법을 이해하고 있는지 평가

지원자에 대한 통계

성별

- 남 : 73%

- 여 : 27%

전공

- 전공자 : 64% (컴퓨터공학, 소프트웨어학과, 전자공학부)

- 비전공자 : 36%

나이

- 최소 : 23

- 평균 : 27.7

- 최대 : 30

점수

- 최소 : 1

- 평균 : 3.4

- 최대 : 8

개발자 역량 평가

자신의 프로그래머로서의 능력을 평가해보고 싶다면 아래의 개발자 역량 평가를 해보자. 문항당 4개의 질문으로 구성되어 있으며 각 질문에 대답할 수 있느냐의 여부로 레벨을 평가한다. 제일 위 질문에 대답할 수 있으면 하급 레벨의 개발자, 그 아래는 중하, 그 아래는 중상, 맨 아래 질문은 상급 레벨의 프로그래머이다.

신입 개발자 역량 평가

https://github.com/EBvi/dev-matrix/blob/master/%E1%84%89%E1%85%B5%E1%86%AB%E1%84%8B%E1%85%B5%E1%86%B8%20%E1%84%80%E1%85%A2%E1%84%87%E1%85%A1%E1%86%AF%E1%84%8C%E1%85%A1%20%E1%84%8B%E1%85%A7%E1%86%A8%E1%84%85%E1%85%A3%E1%86%BC%20%E1%84%91%E1%85%A7%E1%86%BC%E1%84%80%E1%85%A1.md


- 각 단계의 마지막 mastery는 우리가 기대하는 신입의 수준을 넘어갑니다만, 가끔은 이런 단계에 오른 신입들도 존재하기 때문에 넣어뒀습니다

- 평가 그 자체에 너무 부담을 갖지는 말아주세요. 저희는 신입 개발자가 가져야될 가장 중요한 자질로 잠재력에 초점을 두고 있습니다

- 맨 마지막 항목에 여러분의 잠재력을 어필해주세요


퍼블리싱

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의 차이를 설명할 수 있다

- 트리와 그래프를 알고 사용할 수 있다

- 각종 상황에서 효율적인 자료구조를 결정할 수 있다

2. 알고리즘

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

- 정렬, 검색, 순환 알고리즘을 안다

- 퀵 정렬에 대해 설명할 있고, 직접 코드를 작성할 수 있다

- 다익스트라나 A*, 또는 그 밖의 알고리즘을 알고 있다

3. 시스템 프로그래밍

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

- 컴파일러, 링커, 인터프리터를 설명할 수 있다

- 커널모드/유저모드 차이를 설명할 수 있다

- 스레딩/멀티스레딩, 동기화와 락을 이해하고 어떻게 구현되었는지 설명할 수 있다


설계

1. 객체 지향

- 인터페이스를 왜 써야하는 지 모른다

- 캡슐화와 추상화를 이해하고 어떤 상황에서 써야하는지 알고 있다

- 디자인 패턴과 안티 디자인 패턴을 상당수 알고 있다

- 이를 통해 프레임워크를 구축해본 경험이 있다

2. DI

- DI나 IoC가 무엇인지 모른다

- 왜 빈을 주입해야 하고 왜 이것이 낮은 결합도를 만드는지 안다

- 스프링에서 DI가 어떻게 구현되어 있는지 알고 있다

- DI와 IoC에 대해 하루종일 설교할 수 있다

3. 모델링

- 논리적 모델과 물리적 모델이 무엇을 말하는지 모른다

- 논리적 모델과 물리적 모델을 구분하여 모델링할 수 있다

- L자형 테이블이 왜 위험한지 알고 있다 (필드가 많이 늘어나는 것이 어떤 영향을 미치는지 이해한다)

- 정규화를 알고 이를 적용하여 모델링을 할 수 있다


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. 책

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

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

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

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

    • (어떤 책을 읽어봤는지 추가로 서술해주셔도 좋습니다)**

2. 인터넷 커뮤니티 활동

- 개발과 관련된 어떠한 커뮤니티 활동도 하지 않는다

- 자주 가는 블로그, 또는 개발자 위주로 된 트위터 리스트를 갖고 있다

- 프로그래밍에 관한 개인적인 통찰이나 생각을 표현하는 블로그를 갖고 있으며 이것을 다른 개발자와 공유한다

3. 외국어 수준

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

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

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

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

---

그리고

무엇이라도 좋습니다. 사진, 그림그리기, 만화, 인터넷 활동, 음악, 글쓰기, 잉여력 발산, 게임 등 지금까지 했던 활동 중에서 어떤 걸 어디까지 알고 있는지 자랑할 만한 것이 있으면 기술해주세요. 다만 너무 길게 쓰지는 말아주세요. **저희는 이 항목에 대한 평가를 가장 중요하게 생각합니다.**

경력 개발자 역량 평가

https://github.com/EBvi/dev-matrix/blob/master/%E1%84%80%E1%85%A7%E1%86%BC%E1%84%85%E1%85%A7%E1%86%A8%20%E1%84%80%E1%85%A2%E1%84%87%E1%85%A1%E1%86%AF%E1%84%8C%E1%85%A1%20%E1%84%8B%E1%85%A7%E1%86%A8%E1%84%85%E1%85%A3%E1%86%BC%20%E1%84%91%E1%85%A7%E1%86%BC%E1%84%80%E1%85%A1.md


- 이 문서는 개발자 역량 측정 매트릭스의 일부를 참조하여, 우리 회사 실정에 맞도록 변형하였습니다

- 원문은 [programmer-competency-matrix] ( http://www.indiangeek.net/programmer-competency-matrix )입니다. http://sijinjoseph.com/programmer-competency-matrix/

- 경력자의 경우 가장 중시하는 건 역시 **업무 평가**입니다. 그러나 우리는 개발자의 업무 평가가 정량화될 수 없음을 알고 있습니다. 어느 정도의 객관적인 평가를 하기 위해서는 타인의 시선이 필요함을 알고 있지만, 문서상의 한계로 **문제를 해결하는 방법**에 가장 큰 비중을 두기로 결정했습니다.

- 그러나 때에 따라 이것이 불가능한 조직에 속해 있었을 수도 있기 때문에 맨 마지막 항목에 **가장 집중했었던 분야** 또는 **업무 개선에 대한 경험**을 어필해주세요

전산학 이해

1. 자료구조

- 배열(array)과 링크드 리스트의 차이를 모른다

- 실제 프로그래밍 환경에서 배열과 Linked List, dictionary의 차이를 설명할 수 있다

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

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

2. 알고리즘

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

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

- 트리, 그래프, 단순한 그리디 알고리즘, Divide and Conquer를 이해한다

- 동적 프로그래밍 솔루션을 이해한다. 그래프 알고리즘, 수치연산 알고리즘을 이해하고 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. 코드 가독성

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

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

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

- 전제 조건은 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-페이스 커밋을 이해한다


지식

1. 툴

- 자주 쓰는 IDE만 알고 있다

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

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

- 도구를 직접 만들 수 있다

2. 최신 기술 이해

- 최신 기술을 모른다

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

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

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

3. 플랫폼 내부

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

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

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

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

4. 책

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

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

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

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

    • (어떤 책을 읽어봤는지 추가로 서술해주셔도 좋습니다)**

외국어

1. 외국어 수준

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

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

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

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


문서화

1. 문서포맷

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

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

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

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

2. 오피스 도구 사용

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

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

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

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

---

그리고

    • 이하 항목은 둘 중에 하나를 작성하시거나 둘 다 작성하셔도 좋습니다**

- 무엇이라도 좋습니다. 사진, 그림그리기, 만화, 인터넷 활동, 음악, 글쓰기, 잉여력 발산, 게임 등 지금까지 했던 활동 중에서 어떤 걸 어디까지 알고 있는지 자랑할 만한 것이 있으면 기술해주세요. 다만 너무 길게 쓰지는 말아주세요.

- 또한 무엇이라도 좋습니다. 서비스, 플랫폼, 업무 환경, 시스템, 소스코드, 인사 관리 등 지금까지 업무를 해오면서 업무에 불만 또는 비효율적인 부분을 개선했던 사례가 있으면 기술해주세요. 문제점을 인식하는 과정이나 그것을 개선하기 위해 어떠한 노력을 기울였으며 어떤 결과가 있었는지 써주시면 됩니다.

    • 저희는 이 항목에 대한 평가를 가장 중요하게 생각합니다.**


같이 보기