/dev/null을 "블랙홀"이라고 상상해 보세요. 이 파일은 거의 읽기 전용 파일이나 마찬가집니다. 이 파일에 쓰는 모든것은 영원히 사라져 버릴겁니다. 이 파일에서 무언가를 읽으려고 하거나 어떤 결과를 바라는 것은 무의미한 일입니다. 그럼에도 불구하고, /dev/null은 명령어 줄이나 스크립트에서 아주 유용하게 쓸 수 있습니다.
rm $badname 2>/dev/null
# 에러 메세지[stderr]는 완전히 사라져 버립니다.
파일 자체와 모든 퍼미션은 그대로 가지면서 내용만 지우기(예 2-1 와 예 2-2에서 인용):
cat /dev/null > /var/log/messages
# : > /var/log/messages 라고 해도 같지만, 이렇게 하면 새 프로세스를 띄우지 않습니다.
cat /dev/null > /var/log/wtmp
로그 파일의 내용을 자동으로 비우기(상용 웹 사이트에서 보내는 귀찮은 "쿠키"를 처리할 때 특별히 좋습니다):
예 29-1. 쿠키 항아리를 숨기기
if [ -f ~/.netscape/cookies ] # 있다면 지우고,
then
rm -f ~/.netscape/cookies
fi
ln -s /dev/null ~/.netscape/cookies
# 이제 모든 쿠키는 디스크에 저장되지 않고 블랙홀로 보내집니다.
/dev/zero의 쓰임새
/dev/zero도 /dev/null처럼 가상 파일(pseudo file)이지만, 실제로 널 값을 갖고 있습니다(아스키 문자 0이 아닌 숫자 0). 이 파일에 무언가를 쓰면 그 출력은 사라집니다. 이 파일에서 널 값을 읽어 내는 것은 아주 어렵습니다만 od 명령어나 헥사 에디터로 할 수는 있습니다. /dev/zero는 특정한 길이의 초기화된 더미 파일을 임시 스왑 파일로 만드는데 주로 쓰입니다.
예 29-2. /dev/zero로 스왑 파일 세팅하기
#!/bin/bash
# 스왑 파일 만들기.
# 루트로 실행시키세요.
ROOT_UID=0 # 루트 $UID 는 0.
E_WRONG_USER=65 # 루트가 아님.
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0
if [ "$UID" -ne "$ROOT_UID" ]
then
echo; echo "이 스크립트는 루트만 실행시킬 수 있습니다."; echo
exit $E_WRONG_USER
fi
if [ -n "$1" ]
then
blocks=$1
else
blocks=$MINBLOCKS # 명령어줄에서 지정해 주지 않으면
fi # 40 블럭을 기본값으로 세트.
if [ "$blocks" -lt $MINBLOCKS ]
then
blocks=$MINBLOCKS # 최소 40 블럭이어야 됩니다.
fi
echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # Zero out file.
mkswap $FILE $blocks # Designate it a swap file.
swapon $FILE # Activate swap file.
echo "Swap file created and activated."
exit $SUCCESS
/dev/zero의 다른 응용으로는, 파일이 0으로만 이루어진 지정된 크기를 갖게 하는 것인데, 루프백 디바이스를 마운트 하는 등의 특별한 목적을 위해 쓰입니다. 예 13-6와 예 12-33를 참고하세요.
예 29-3. 램디스크 만들기
#!/bin/bash
# ramdisk.sh
# "ramdisk" 란 시스템의 RAM 의 일정 부분(segment)을
#+ 파일시스템처럼 쓰는 것을 말합니다.
# 램디스크의 장점은 읽고/쓰기가 아주 빠르다는데 있습니다.
# 단점: 휘발성이 있기 때문에 시스템이 리부트되거나 꺼지면 그 내용을 잃어버립니다.
# 램디스크로 할당한 만큼의 메모리를 못 쓰게 됩니다.
#
# 램디스크가 뭐가 좋을까요?
# 테이블이나 사전처럼 아주 큰 데이타를 램디스크에 올려 놓으면
#+ 디스크 접근 속도보다 메모리 접근 속도가 훨씬 빠르기 때문에 데이타 탐색 속도가 빨라집니다.
E_NON_ROOT_USER=70 # 루트로 실행.
ROOTUSER_NAME=root
MOUNTPT=/mnt/ramdisk
SIZE=2000 # 2K 블럭(필요에 따라 수정)
BLOCKSIZE=1024 # 1K (1024 byte) 블럭 크기
DEVICE=/dev/ram0 # 첫번째 램 디바이스
username=`id -nu`
if [ "$username" != "$ROOTUSER_NAME" ]
then
echo "\"`basename $0`\" 는 루트로 실행시켜야 됩니다."
exit $E_NON_ROOT_USER
fi
if [ ! -d "$MOUNTPT" ] # 마운트 포인트가 존재하는지 확인해서
then #+ 이 스크립트를 여러번 실행시켜도 에러가 나지 않도록 함.
mkdir $MOUNTPT
fi
dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # 램 디바이스 초기화(zero out).
mke2fs $DEVICE # 램 디스크에 ext2 파일시스템을 만들고,
mount $DEVICE $MOUNTPT # 마운트.
chmod 777 $MOUNTPT # 일반 사용자도 접근 가능하게.
# 하지만 언마운트는 루트만.
echo "이제 \"$MOUNTPT\" 를 쓸 수 있습니다."
# 이제부터는 일반사용자까지도 램디스크에 파일을 저장할 수 있습니다.
# 주의할 점은 램디스크가 휘발성을 갖기 때문에 리부트나 전원이 꺼질 때에는
#+ 그 내용이 없어집니다.
# 저장하고 싶은 것이 있다면 램디스크가 아닌 일반 디렉토리로 복사해서 쓰면 됩니다.
# 리부트후에 램디스크를 다시 셋업하고 싶다면 이 스크립트를 실행시키면 됩니다.
# /mnt/ramdisk 를 이 스크립트를 통하지 않고
#+ 다른 방법으로 다시 마운트하려고 한다면 제대로 동작하지 않을 것입니다.
exit 0
개발시 디버깅을 위해 필수적으로 필요한 것이 로그이다. 이는 개발시 뿐만 아니라 운영중에 오류가 발생했을 때도 오류의 원인을 찾는데 커다란 역할을 하는 중요한 개발 요소 중의 하나이다.
PHP에서 개발자의 로그를 어떻게 남기는지 몰라서 계속해서 var_dump($variable);로 브라우저 화면에 로그를 남겨서 본 뒤에 그 로그 출력 코드를 삭제해 버리는 방식으로 작업을 했다.
대다수의 PHP 개발자들이 var_dump(), print_r() 함수등을 이용해서 위와 같은 방식으로 로그를 기록해서 디버깅을 하는 것 같다. 하지만 이는 매우 좋지 못한 방식이다.
* 로그를 출력 한 뒤에 로그 출력 코드를 항상 지워야만 한다. 그렇지 않으면 로그가 브라우저를 통해 사용자에게 전달 돼 버리므로.
* 이로인해 매우 개발이 귀찮기 짝이 없는 작업이 된다.
* 실제 운영 시간에 발생한 오류에 대해 에러 메시지만을 얻을 수 있을 뿐 그 당시 상태에 관한 로그를 전혀 얻을 수가 없다.
그러다가, 너무 짜증이나서 간단한 로깅 함수를 만들어서 바꾸었다.
그러나 여전히 맘에 안든다. 로그 레벨 지정이나, 로그 파일 날짜별로 돌리기 등 기능이 너무 부족하다.
PHP에서 로깅 전략에 대한 글을 찾아보니 우리나라에서는 거의 없는거 같고, devshed에 Logging With PHP라는 좋은 글이 있었다.
그 중에서도 PEAR Log Package를 이용하기로 하였다. PEAR에는 여러 좋은 패키지들이 많이 깔끔하게 정리되어 있는 것 같다. 근데, 우리나라 PHP 개발자들은 아직 잘 안쓰는건가? 관련 글을 찾아보기가 쉽지 않네.
그 외에도 Log4PHP가 있는데, 사실 이걸 쓰고 싶은 생각이 정말 많이 들었었다. Apache에서 만든 것이고, 이미 내게 익숙한 Log4J의 PHP 포팅이기 때문이다. 게다가 설정 파일을 통해 언제든지 로깅 방식을 변경할 수도 있다(Log4J처럼). 하지만, 참은 이유는.... 2003년 이후 버전업이 전혀 안되고 있기 때문이다. 4년씩이나 버전 업이 안되는 건 좀 이해가 안간다.
PEAR::Log 사용법과 로그 레벨 지정, 날짜별 파일로 로그 남기기, 로그를 남길 때마다 어떤 PHP파일의 몇 번째 줄에서 로그를 남겼는지 출력하기, PHP의 오류 메시지를 PEAR::Log를 이용해 로그로 남기기 등의 기법을 정리해 본다. 대부분의 내용은 PEAR::Log의 매뉴얼을 정리한 것이다.
설치
$ pear install log
로깅 객체 얻기
require_once 'Log.php';
$logger = &Log::singletone('file', 'C:/temp/test.log', 'Test'); # 로깅을 위한 객체 얻기
$logger->log('이래 저래 에러가 났잖아욧!'); # 로그 메시지 출력하기
싱글턴으로 객체를 가져옴으로써 불필요한 객체 생성과, 객체가 소유하고 있는 리소스의 중복 정의를 방지한다.
* $handler : 로그 핸들러 타입. console, file 등 로그 출력을 처리하는 방식을 지정한다.$name : 파일 이름과 같이, 로그를 기록할 자원을 지정한다. 핸들러 구현체에 따라서 이 파라미터가 뭘로 사용될지 결정된다.
* $name : 로그 파일명 등을 의미한다. $handler에 따라 의미가 달라진다.
* $ident : 로그 구분자이다. Java의 Log4j에서 클래스 FQCN과 같은 역할을 한다.
* $conf : 연관 배열로 핸들러에 사용자 정의 설정 정보를 넘겨준다.
* $maxLevel : 최대 로그 레벨을 결정한다. 기본값은 PEAR_LOG_DEBUG(최대값)이다. 이 레벨보다 낮아야 로그가 기록된다.
$logger->log("로그메시지", PEAR_LOG_NOTICE);와 같은 방식으로 로그를 기록한다.
로그 메시지 부분에는 문자열 뿐만 아니라, 일반 객체를 지정해도 된다. 객체가 getString(), toString() 혹은 __toString() 메소드를 구현하고 있다면 그 메소드를 실행해서 메시지를 기록한다. 모두 없다면 객체를 직렬화한 값을 출력할 것이다.
만약 배열과 같이 복잡한 타입의 변수 값을 제대로 찍고 싶다면 $logger->log($variable) 처럼, 문자열로 바꾸지 말고, 변수를 그대로 인자로 넘겨주면, var_dump($variable) 한 것처럼 변수 내용을 찍어준다.
로그 레벨
로그 레벨 옆의 메소드명은 log() 메소드에 로그 레벨을 지정하는 대신, 해당 메소드를 직접 호출하면, 그 로그 레벨로 로그가 남게 됨을 의미한다.
즉, $logger->log("로그메시지", PEAR_LOG_DEBUG) 는 $logger->debug(" 로그메시지") 와 동일한 역할을 한다.
* PEAR_LOG_EMERG emerg() 시스템이 사용 불가 상태에 빠졌다.
* PEAR_LOG_ALERT alert() 즉시 처리가 필요하다.
* PEAR_LOG_CRIT crit() 심각한 상태이다.
* PEAR_LOG_ERR err() 오류
* PEAR_LOG_WARNING warning() 경고
* PEAR_LOG_NOTICE notice() 주의
* PEAR_LOG_INFO info() 정보
* PEAR_LOG_DEBUG debug() 디버그 메시지
PEAR_LOG_NOTICE와 PEAR_LOG_DEBUG 레벨의 메시지만을 로그로 남긴다.
* PEAR_LOG_ALL 모든 로그 레벨을 포함하고 있는 마스크
* PEAR_LOG_NONE 어떤 로그 레벨도 포함하지 않고 있는 마스크
$mask =PEAR_LOG_ALL ^ Log::MASK(PEAR_LOG_NOTICE);
PEAR_LOG_NOTICE만 제외하고 로그를 남긴다.
$logger->getMask();
현재 로거의 로그 마스크를 가져온다.
로그 이벤트 내보내기
몇몇 로그 핸들러는 로그 메시지를 버퍼링 한다. 버퍼링된 로그 메시지를 모두 출력하도록 하려면,
$logger->flush();
혹은,
$logger->close();
로거를 닫아도 flush가 된다.
로그 핸들러
로그 핸들러는 로그를 어떤식으로 처리할지를 결정하는 것이다. 모든 로거는 로그 핸들러를 지정해야 한다.
로그 객체를가져올 때 'console' 하는 식으로 지정하는 것이다. 구체적인 사용법은 매뉴얼을 참조한다.
* console : 화면상에 로그를 출력한다.
* display : 웹 브라우저에 로그를 출력한다.
* error_log : PHP의 error_log 함수를 사용해서 로그를 출력한다.
* file : 파일로 로그를 출력한다.
* mail : 이메일로 로그를 전송한다.
* null : 로그를 무시한다.
* sql : DB에 로그를 저장한다.
* sqlite : SQLite DB에 로그를 저장한다.
* syslog : PHP의 syslog() 함수를 이용해서 로그를 저장한다.
* win : 브라우저의 새창으로 로그를 출력한다.
* composite : 여러 핸들러를 함께 사용할 수 있게 해준다.
file 로그 핸들러를 제일 많이 사용할 것이기 때문에, 이에대해 정리한다.
* 설정값 : 설정키(Type, 기본값)
o append(boolean, true) : true이면 기존의 로그파일에 계속 추가해서 쓰고, false이면 기존 파일을 삭제하고 새로 쓴다.
o mode(integer, 0644) : Unix 계열에서 파일의 허가권 지정
o eol(string, OS default) : 줄끝 문자
o lineFormat(string ,%1$s %2$s [%3$s] %4$s]) 로그 출력 형태 지정
o timeFormat(string, %b %d %H:%M:%S) : 시간 출력 형태 지정(strftime 함수로 시간을 출력한다.)
* 설정값의 lineFormat
o %1$s : 날짜와 시간
o %2$s : $ident
o %3$s : 로그 레벨
o %4$s : 로그 메시지
o %5$s : log() 메소드를 호출한 파일명
o %6$s : log()메소드를 호출한 줄 번호
o %7$s : log()메소드를 호출한 함수명
* 예제
PHP 사용중 발생하는 예외와 오류를 PEAR::Log 패키지를 이용해 처리하도록 지정할 수 있다.
이것은 set_error_handler() 함수를 이용해서 가능하다.
function errorHandler($code, $message, $file, $line)
{
global $logger;
/* Map the PHP error to a Log priority. */
switch ($code) {
case E_WARNING:
case E_USER_WARNING:
$priority = PEAR_LOG_WARNING;
break;
case E_NOTICE:
case E_USER_NOTICE:
$priority=PEAR_LOG_NOTICE;
break;
case E_ERROR:
case E_USER_ERROR:
$priority = PEAR_LOG_ERR;
break;
default:
$priority = PEAR_LOG_INFO;
}
$logger->log($message . ' in ' . $file . ' at line ' . $line, $priority);
} // end of function
set_error_handler('errorHandler');
# test
trigger_error('This is an information log message.', E_USER_NOTICE);
나는 이렇게 사용한다
강력한 설정기능 등이 Log4php에 비해 많이 딸리는 편인데, 어쨌든, 나는 아래 처럼 사용한다.
아래에서 정의한 logger() 함수는 PEAR::Log를 이용해서, 날짜별로 로그 파일을 남기는 것이다.
그리고, 로그를 남길 때는 항상 로그를 찍은 소스 파일명과 로그를 찍은 코드의 줄 번호도 함께 출력하도록 하였다.
파일 이름은 logger.php라고 치자.
<?php
require_once 'Log.php';
// PHP 5.1.x 의 set_error_handler()로 지정된 함수 내부에서
// 클래스 정의를 가진 PHP 파일을 require/include 할 경우에
// 오류가 발생하는 문제를 해결하기 위해
// 미리 필요한 클래스를 require 해둬야 한다.
// 관련 URL : http://bugs.php.net/35634
require_once 'Log/file.php';
/**
* 사용자가 명시적으로 LOG_FILENAME 상수를 지정하지 않았다면,
* 오류를 발생시킨다.
*/
if (!defined('LOG_FILENAME')) {
trigger_error("You have to define LOG_FILENAME for logger", E_USER_ERROR);
}
/**
* 사용자가 명시적으로 LOG_LEVEL 상수를 정의하지 않았다면,
* DEBUG 로그 레벨로 강제 지정한다.
*
* 이 파일 외부에서 로그 레벨을 지정할 경우, require_once 'Log.php'; 를 실행한
* 이후에 상수에 PEAR_LOG_* 값을 줘야 함을 잊어서는 안된다.
*/
if (!defined('LOG_LEVEL')) {
define ('LOG_LEVEL', PEAR_LOG_DEBUG);
}
/**
* PHP자체에서 발생하는 로그의 레벨을 지정한다.
* errorHandler() 함수에서 이 로그레벨을 넘지 않으면, 오류를 출력하지 않도록
* 만들어져 있다.
*
* 이 파일 외부에서 로그 레벨을 지정할 경우, require_once 'Log.php'; 를 실행한
* 이후에 상수에 PEAR_LOG_* 값을 줘야 함을 잊어서는 안된다.
*/
if (!defined('PHP_LOG_LEVEL')) {
define('PHP_LOG_LEVEL', PEAR_LOG_WARNING);
}
// PHP 에러 핸들러를 PEAR::Log 를 사용하도록 변경한다.
set_error_handler('errorHandler');
/**
* 파일로 로그를 저장하는 로거 객체를 리턴한다.
* Log 클래스를 직접 호출하지 말고, 일관성 있게 get_logger() 메소드를 사용해서
* 로거 객체를 얻도록 한다.
*
* LOG_FILENAME 상수로 지정된 파일 이름에 .yyyymmdd 형태로 날짜를 붙여 로그 파일을
* 생성한다.
*
* @param string $ident 로거 구분 문자열. 일반적으로 "클래스명.Method명" 혹은 "function명"
* 처럼 지정하면 된다. 이 파라미터를 지정하지 않으면 항상 get_logger를 호출한 파일의 이름으로
* 지정된다.
* @param integer 로그 레벨을 지정한다. PEAR_LOG_XXX 형태의 상수로 정의 되어있다.
* @return Log 로거 객체
*/
function logger($ident = "GlobalLogger", $logLevel = LOG_LEVEL)
{
$today_date = date('Ymd', mktime()); // 오늘날짜 yyyymmdd 형태
/**
* PHP 기본 에러 핸들러를 변경한다.
*/
function errorHandler($code, $message, $file, $line)
{
/* Map the PHP error to a Log priority. */
switch ($code) {
case E_STRICT:
case E_NOTICE:
case E_USER_NOTICE:
$priority = PEAR_LOG_NOTICE;
break;
case E_WARNING:
case E_USER_WARNING:
$priority = PEAR_LOG_WARNING;
break;
case E_ERROR:
case E_USER_ERROR:
$priority = PEAR_LOG_ERR;
break;
default:
$priority = PEAR_LOG_WARNING;
}
$logger = logger("PHPError", PHP_LOG_LEVEL);
$logger->log($message . ' in ' . $file . ' at line ' . $line, $priority);
}
/**
* 변수를 받아서 var_export()한 결과를 문자열로 저장하여 넘겨준다.
* 로그 메시지로 복잡한 형태의 변수나 배열을 출력하고 싶을 때 사용한다.
*
* @param mixed $variable 출력할 변수
*/
function var_export_str($variable) {
ob_start();
var_export($variable);
$logmsg .= ob_get_contents();
ob_end_clean();
return $logmsg;
}
?>
위 logger()메소드는 다음 처럼 간단히 활용할 수 있다.
<?php
// 로그레벨 설정 상수가 Log.php에 들어 있기 때문에
// 로그 레벨 설정과 logger.php보다 Log.php를 먼저 require 해줘야 한다.
require_once 'Log.php';
전략에서 무엇보다 중요한 것은 자신의 키워드를 찾는 것이다. 내가 살아오면서 나를 대표할 키워드를 찾기란 생각보다 쉽지 않다. 과거·현재·미래의 자기라는 존재를 자신의 언어로 표현한다는 것이 만만치 않다.
면접 장소에서도 원고를 달달 외워가도 떠는 판에 자기를 표현하는 키워드 생각할 시간적 여유가 없을 것이다. 따라서 면접 장소에서 어떻게 자기할 것인가를 생각해보면 사실 막막할 것이다. 자기소개하려면 주저리 주저리 읊는 경우가 많다. 실상 너무 많은 내용을 포함시키다 보면 강약이 없어 다른 사람에게 좋은 피드백을 받기 어렵다.
면접에서 가장 많은 질문은 바로 자기소개이다. 최고경영자나 임원, 실무진 등 면접관은 특성이나 성향, 장단점, 자세 등을 종합적으로 판단하기 위해서 지원자의 자기소개 질문을 하고 있다. 보통 3분 내외의 시간을 주고 자유롭게 자신에 대한 소개나 장·단점 등을 설명하는 것이다.
기존 자기소개는 시간적 서술이었다면, 이제는 항목별 서술로 바꿔야 한다. 항목별 중에도 자신이 강점이 될 만한 것을 먼저 이야기함으로써 신뢰성을 확보하는 것이 관건이다.
자기소개만 보더라도 면접관들은 그 사람의 그릇과 성향을 알 수 있다고 말한다. 순발력, 창의성, 논리력, 전문성 등 전체적으로 판단하는 근거를 자기소개에서 찾고 있는 것이다.
자기소개는 상품으로 말하자면, 카탈로그(catalogue)를 설명하는 것과 비슷하다. 카탈로그란 상품을 소개하는 인쇄물을 말하는 것으로 상품 안내 소책자를 가리킨다. 상품을 구매할 것이 예상되는 손님에게 상품의 기능, 특징, 가격, 디자인 등을 궁금해 하는 것을 알기 쉽게 설명하는 것이다.
자기소개를 통해서 자신이 상품 가치가 있어서 팔릴지 안 팔릴지 판단하는 것이 매우 중요하다. 3분간의 원고를 만들어서 하는 경우가 있다. 하지만 원고를 외우다가 시간 다 보내고 실수를 연발하는 경우가 더 많다.
원고를 만들기 보다는 키워드 중심의 키노트(Keynote)를 만들어야 한다. 그리고 연상기법에 의해서 키노트의 키워드 중심으로 연상하면서 자연스럽게 이야기하는 방법을 배워야 한다.
면접에서 자기소개 시 주의할 점 5가지
1.원고를 외우지 말고 키노트 중심으로 연상하라.
최고로 좋은 것은 자연스럽게 이야기하는 것이다. 편안한 면접을 하기 위해서는 외우려고 하지 말고 중심 키워드별로 이야기를 끌어가는 노하우가 필요하다.
2.적극적으로 자기 키워드를 찾아라.
자신을 최대한 짧게 이야기하는 것은 쉽지 않다. 자신을 대표할 만한 키워드를 찾아서 적절하게 자신을 소개해야 한다.
3. 자신의 상품가치를 명확하게 매겨라.
채용 정보와 자신의 상품가치와 비교 분석해서 어느 점에 강점이 있고 어느 점에 약점이 있는지 분명하게 이야기하는 것이 좋다.
4.자신에 대해서 변명하지 마라.
면접자들이 실수하는 것이 자신의 단점에 대해서 변명하는 듯한 말투로 이야기하는 것이다. 차라리 변명보다는 솔직하게 자신의 단점을 드러낼 때 더이상 큰 단점이 될 수 없다는 사실을 기억하라.
5.카탈로그를 소개하는 것처럼 소도구를 활용하라.
상품을 팔기 위해서 카탈로그를 펼쳐놓고 판매하는 영업인처럼 자신을 내세울 만한 포트폴리오를 갖고 면접장에 들어가는 것이 매우 효과적이다.
우연한 기회에 잘아는 회사의 소프트웨어 개발자 면접에 참여하게 되었다. 거기 사장님이 참좋으신 분이라 더 가까워질 수 있는 기회가 될 것도 같고, 소프트웨어 개발이 주업종이 아닌 회사에서 개발자를 구하는 것이라서, 내가 면접에 참여하면 약간이라도 도움을 줄 수 있을 것같았다.
SW개발자면접에 참여하다
회사는 강남역근처에 있고, 아담한 건물의 한층을 쓰고 있는데, 사무실 곳곳에 책과 서류가 쌓여있고, 곳곳에 있는 화이트보드에는 활발한 토론이 있었던 듯 아직 지워지지 않은 회의주제들이 적혀있었다. 면접장소인 회의실 역시 책과 서류, 두개의 커다란 화이트보드가 차지하고 있어서 좀 좁게 앉아서 면접을 진행하였다.
이미 회의실에 자리를 잡고 앉아있는 면접자는 30대중반의 침착해보이는 인상의 개발자였다. 자기소개를 부탁하니 몇몇 회사를 거치면서 닷넷과 DBMS쪽만 10년이상 했다고 한다. 회사시스템이 주로 닷넷기반으로 만들어져 있어서 닷넷전문가를 찾는 것같았다. 이력서상에 있는 몇가지 경력에 대해 좀 자세히 물었더니 침착하게 잘 대답한다. 생각이 잘 정리되어있고 침착하다는 것은 소프트웨어 개발자로써 좋은 덕목이다.
이력서에 없는 몇가지 기본적인 기술에 대해서 물었다. 즉, 닷넷이 아닌 유닉스나 다른 개발언어, 다양한 개발 프레임워크에 대한 대한 질문을 했다. 학생때 보기는 했지만 모른다고 간단하게 대답한다. 음... 이런 자기계발에 별로 신경을 안쓰는 타입인가? 최근에 목표를 세우고 달성한 것들이 있는 지 물었더니 그런 건 없다고 한다. 역시 그렇군, 성실하지만 자기계발에는 소홀한 전형적인 직장인 타입이다. 그럼 잘안다고 하는 닷넷과 DBMS쪽에 대해서도 항상 쓰는 기능밖에 안쓰는 것일 수 있어서 좀 자세히 물었다. 예상대로 대부분의 작업을 UI를 사용한다고 한다. 커맨드라인을 사용하는 것은 관심조차 없는 것같다.
프로그래밍에 대한 감각이 있는 지 확인하고 싶어서, 전자계산학을 전공했으니 간단한 알고리즘을 설명하거나 칠판에 쓰는 게 가능하냐고 물었더니 할 수 있겠다고 한다. 그래서 링크드 리스트의 특정한 노드하나를 삭제하는 알고리즘을 가장 잘아는 언어를 이용해서 칠판에 써달라고 했다. 물론 키보드와 마우스없이 칠판에 프로그래밍하는 것이 어렵다는 것을 잘 알고 있다는 멘트도 했다. 문제를 잘 이해하지 못하는 것같다. 이번에는 입력과 출력을 구체화 시켜서 다시한번 문제를 설명했다. 그래도 이해하지 못하는 것같다. 좀 당황스럽다.
이대로 종료할 수도 있겠지만, 한번 더 기회를 주고 싶어서 간단한 소팅 알고리즘을 칠판에 써보라고 했다. 이번에는 자신있게 칠판에 나가서 머뭇거리며 몇줄을 썼다. 써놓은 것을 보니 소팅을 위한 for 문장을 두개 써 놓았는데 index variable의 경계값도 명확하지 않고, 구체적인 내용은 ... 으로 되어있다. 심지어 swap도 들어있지 않다. 그 부분에 대해서 좀 더 자세히 적어 달라고 했더니 그냥 하면 된단다. ㅡㅡ;; 입력과 출력부분이 없다고 했더니 이제는 화를 낼 태세다. 칠판에 써놓은 소팅알고리즘을 무엇이라고 하느냐고 했더니, 면접을 이렇게 한다고 미리 말해주지 않았다고 불평한다. 음... 그래서 먼저 할 수 있느냐고 양해를 구했고 할 수 있다고 말하지 않았냐고 했더니 진정한다.
칠판에서 프로그래밍하는 건 어렵다. 특히 면접관들이 지켜보고 있으면 훨씬 더 힘들다. 그렇지만 10년넘은 프로그래머라면 더구나 전문가라면 버블소팅같은 간단한 것은 어떤 상황에서도 할 수 있어야 한다.
T자형인재가 진짜 전문가
좋은 인재는, 특히 융합이나 연계가 중요해진 IT분야의 전문가는 여러가지 분야에 대해서 어느 정도 알고 있어야 하고 자신의 전문분야에서는 어떠한 문제도 해결할만한 자신감과 능력을 가지고 있어야 한다. 이런 인재를 T자형 인재라고 부르는 데, 영문자 T가 넓게 알고 한가지 분야를 깊게 판다는 형상을 하고 있기 때문이다.
그런데 우리가 특정분야의 전문가에 대해서 다른 분야를 모르는 사람이라고 잘못판단하고 있는 경우가 있다. 유닉스시스템과의 연계에서 문제가 발생했는데 나는 닷넷전문가라서 유닉스쪽은 모른다는 말을 쉽게 하고 주변에서는 그말을 인정해준다. 닷넷전문가라도 다른 개발환경에 대해서 어느정도 알아야 하는게 당연하다. 그리고 닷넷에 대해서는 API하나하나까지 또 여러가지 닷넷언어들에 대해서 훤하게 알아야 한다. DBMS 전문가라고 해놓고 기초적인 SQL문법밖에 몰라서 되겠는가?
자바전문가라면 DB나 네트워크, 다른 개발언어에 대해서도 어느정도 알고 있고 자바에 대해서는 JVM 소스코드까지 훤하게 꿰뚫고 있어야 한다. 안드로이드 전문가라면 안드로이드에서 APP만드는 정도로 그쳐서는 안되고 다양한 기기에 안드로이드를 포팅하는 것을 어렵지 않게 해낼 수 있어야 한다. 파이썬 전문가라면 파이썬은 원래 속도가 안나는 것이라고 치부할게 아니라 관련된 파이썬 인터프리터 소스를 고쳐서 자신만의 파이썬 인터프리터를 만들어야 하고, 오라클 전문가라면 UI를 통해서 매니지먼트하는 것뿐만아니라 여러가지 프로세스들의 세부사항을 조정할 수 있어야 할 것이다.
그래서 진짜 전문가라고 하면 "그거는 아마 이게 문제일 겁니다", "로그 파일 좀 줘보세요", "30분만 시간을 줄수 있어요?"라고 말하고 바로 컴퓨터 앞으로 달려가는 사람이어야 한다.
우리회사는 특정한 언어(특히 자바나 ASP)만 할 줄 아는 사람, 특정한 업무만 하려는 사람은 면접과정에서 자연스레 배제된다. 개발언어와 도구를 가리지 않아야하고, 특정 프레임워크에 얽매이는 사람도 안된다. 옆에서 누군가 보고 있는 상태에서도 프로그래밍이 가능해야 하고, 하드웨어를 다루는 것에 대해서도 거부감이 없어야 하고 어떤 업무를 주어져도 해당 업무에 적합한 도구를 찾아서 빨리 적용해야 한다. 그래서 회사에 입사하는 사람들은 기본적으로 한일자(一)형이다. 회사내에서 자신의 전문분야를 찾아서 T자형으로 만드는 것이 숙제로 남아있을 뿐.
짬밥을 많이 먹었다고 자동으로 전문가가 되는 게 아니다. 분명히 자기계발을 꾸준히 해야만 전문가가 되는 것이다. 십년 일했다고 하는데도 불구하고 학원에서 몇달배운 사람과 별차이가 없는, 내공을 전혀 느낄 수 없는 사람들이 있다. 한분야에서 오래 일했다고 하면 드러내지 않아도 자연스레 내공이 느껴지도록 해야 하지 않을까?
면접결과에 어떤 영향을 주었을지 모르지만, 일단 면접관으로 참여했기에 소신껏 부정적인 평가의견을 냈다. 일이년차라면 몰라도 십년경력의 전문가로 뽑기에는 자기계발이 부족하다는 게 이유였다. 그 회사가 소프트웨어 개발회사가 아니라서 지원자가 많지 않기 때문에 당장에 일을 하기 위해서는 뽑아야 한다는 의견도 있었기 때문에 최종결과가 어떻게 되었는 지 모른다.
미래의 관리자는 T자형 인재들이 차지할 것으로 예견
필자는 지난 호 특집기사를 통해 미국에서의 성과주의 보상이 그 효율성과 타당성의 측면에서 도전을 받고 있으며, 그러한 도전이 보다 근본적인 비즈니스 환경의 변화와 그로 인한 전략과 조직의 운영 원칙들의 변화에 기인하고 있음을 강조한 바 있다. 파레토 법칙이나 혹은 “한명의 천재가 수천명을 먹여살린다”는 엘리트 중심적 사고는 점차 그 힘을 잃어가고 있다. 조직의 핵심적인 경쟁우위는 특정 몇명의 개인기에 의해 결정되는 것이 아니다. 조직의 경쟁력은 조직 구성원 각 개인의 능력이 효과적으로 협력과 조화를 이뤄, 개인 능력의 단순합 이상의 어떤 것, 이전의 것과는 전혀 다른 새로운 것들을 창출함으로서 확보될 수 있다.
또한 오늘날의 비즈니스 환경에서는 문제의 복잡성이 그 어느때 보다도 높아졌기 때문에, 한두사람이 기존에 가지고 있는 해결책이나, 지식만으로 해결이 불가능한 경우가 많다. 따라서 조직의 성과를 각 개인차원의 기여로 환원하는 것은 더 이상 불가능하거나 무의미하다. 이러한 변화는 페이스북(Facebook)이나 트위터(Twitter)로 대표되는 소셜미디어의 발달이라는 현상 속에서 단적으로 발견된다. 웹서비스의 사용자는 과거와 같이 전문가(SME)가 생성한 정보와 지식을 일방적으로 검색하고 흡수하는 수동적인 사용자가 아니다. 이들은 타인과의 연대에 적극적이며, 다른 사람의 지식과 자신의 지식을 통섭하면서 관계와 지식의 고리들을 생산해 내는 적극적인 사용자라 할 수 있겠다.
바야흐로 1.0의 시대에서 2.0시대로의 전환이 이뤄지고 있다. 2.0의 시대에서는 지식의 공급자와 수용자라는 이분법적 구분은 모호해 지고 모든 사람들이 생산자이며 소비자가 되며, 이와 같은 지식의 생산과 소비는 개별적이기 보다는 집단적이고 협력적인 방식으로 이뤄진다는 특징을 가지고 있다.
이처럼 환경의 변화와 조직의 운영원리가 변화함에 따라 조직에서 원하는 인재의 모습도 달라질 수 밖에 없는데, 이와 관련해 최근에는 “T자형 인재”라는 개념이 관심의 대상이 되고 있다. 이는 UC 버클리(University of California-Berkeley)의 한센(Morten Hansen)교수에 의해 개념화 되었다. 한센교수는 T자형 인재야 말로 오늘날 조직에 가장 필요로 하는 인재형이며, 미래의 관리자 자리는 모두 이 T자형 인재들의 차지가 될 것이라고 예견하고 있다.
T자형 인재란 어떤 한 분야에서 고도의 전문성을 가지고 있으면서도, 다른 영역과 잘 융합되고 협력하며 통섭할 수 있는 인재를 의미한다. 이 개념은 특정분야에 대한 전문적인 지식과 함께 다른 분야에 대해서도 개론적인 수준의 지식을 습득한, 다시 말하면 스페셜리스트이자 제너럴리스트가 되어야 한다는 의미에서의 T자형 인재와는 조금 다른 뉘앙스를 갖는다.
즉, 다른 분야의 지식을 아는 것 보다도, 그러한 지식과 전문성을 가진 사람들과의 커뮤니케이션 능력이라든지, 또 이렇게 습득한 각 분야의 전문적 지식을 효과적으로 결합해 새로운 혁신적 아이디어를 창출하는 창의성 및 조직 전반에서 이러한 지식의 공유와 협력이 일어날 수 있는 방향으로 조직구성원들을 이끌어 갈 수 있는 리더쉽 능력이 더욱 중요하게 부각된다. 개인적인 능력은 뛰어나지만, 자신과 다른 분야의 사람들과의 관계를 형성하지 못하는 소위 “외로운 스타(lone star)”들은 현재와 미래에 조직에서 원하는 리더의 모습이 아니라는 것이다.
T자형 인재의 기본은 특정 분야에 대한 전문가적 지식
T자형 인재에 대한 강조는 브랜드마케팅 분야의 석학인 아커(David Aaker) 교수의 주장에서도 발견할 수 있다. 그는 자신의 저서 「스패닝사일로(Spanning Silos)」를 통해, 그동안 대기업들이 운영해 왔던 제품별 혹은 지역별로 분권화된 마케팅 조직이 비효율 및 비용의 주범이라고 지적하면서, 보다 전략적이고 총체적인 브랜드 및 제품의 관리가 필요하다고 역설했다. 독립채산제를 골간으로 지역이나 제품을 중심으로 한 기존의 사업부제 조직 형태는, 비용과 매출을 각 사업부에 귀속시킴으로서 정량적인 평가가 가능하다는 메리트를 가지고 있었다.
이러한 평가를 기초로 해 인센티브 지급, 구조조정, 퇴출 등의 당근과 채찍 등의 조직관리 수단을 적절하게 사용함으로서 조직의 긴장감을 높이고 상호 경쟁을 유도해 계량적인 성과를 향상시킬 수 있다는 것이 또 하나의 장점이었다. 하지만 이러한 조직의 운영 방식은 사업부 이기주의를 심화시키고 회사전체가 공유하는 브랜드 커뮤니케이션의 일관성을 떨어뜨리는 해악을 낳는다. 아커는 이러한 부정적인 측면이 심화됨으로서 전체 조직의 브랜드경쟁력에 치명적인 손상을 입히게 된다고 주장했다. 경쟁과 협력 중 어느 쪽이 더 기업의 경쟁력에 도움이 줄 것인가에 대한 실증적 연구는 위에서 언급했던 한센교수의 최근 저서 「협력 (Collaboration: how leaders avoid the traps, create unity, and reap big results)」이라는 책에도 잘 나타나 있다.
이 책에서는 부문간의 경쟁이라는 전략을 채택한 소니(Sony)와 이와는 반대로 부서간의 협력을 기반으로 한 전략을 채택했던 애플(Apple)을 비교하고 있다. 2004년 소니는 애플의 히트상품 중 하나인 아이포드(i-Pod)와 유사한 제품을 개발했음에도 불구하고 2007년 매출부진으로 그 제품을 사장시킬 수 밖에 없었다고 한다. 이 제품이 시장에서 실패했던 가장 큰 이유는 경쟁에는 익숙하면서도 협력의 경험을 갖지 못했던 각 부문(silos)간의 의견의 차이가 제대로 조정되지 못했기 때문이었다. 반면, 애플의 경우 출시초반 부진한 실적 속에서도 부문 간의 개선 의견이 지속적으로 토론되고 이렇게 토의된 개선 아이디어가 제품에 꾸준히 반영되면서 최고의 히트상품으로 발전시킬 수 있었다는 것이다.
이러한 사례는 기업의 운명을 좌우하는 전략의 이슈가 결국 조직 운영의 문제와 직접적으로 맞닿아 있음을 보여준다. 조직은 각 부분과 기능들이 마치 하나의 유기체처럼 통합적으로 연결되어 외부의 자극에 효과적으로 대응할 때에 조직으로서의 의의와 경쟁력을 가질 수 있다. 이러한 주장은 의사결정 및 실행의 속도가 강조되면서 더욱 가속화 되어 온 분권화(decentralization)나 권한이양(empowerment), 유연성 및 효율성을 제고시켜 줄 것으로 믿어져 온 아웃소싱(oursourcing) 경향과 정반대 방향의 흐름이라는 측면에서 주목할 만하다.
하지만 이러한 흐름이 업무의 표준화나 조직의 서열, 계층화에 기반을 둔 과거의 관료주의(bureaucratic) 모델로의 회귀가 아닌 메트릭스 조직(matrix organization)과 같은 보다 유연하면서도 다양한 지식과 역량을 가진 개인들의 창의적 결합을 촉진시키는 제3의 방향을 지향하는 변화가 될 것이라고 예상할 수 있다.
이와 같이 개인차원의 창발성과 조직차원에서의 통합이라는 조직적 변화 트렌드에 가장 적합한 스타일의 인간형이 T자형 인재이다. T자형 인재의 기본은 특정 분야에 대한 전문가적 지식이다. 여러 분야를 대충 아는 것 보다 한 가지라도 남들이 따라오지 못하는 전문성을 가지고 있어야 바로 그 분야에서 다른 누구도 생각지 못한 아이디어가 창출될 수 있다. 하지만, 어느 특정분야의 전문가라고 할지라도 다른 분야와 소통, 협력할 수 있는 능력과 인성이 부족한 I형 인재는 개인기 보다는 협력이 더 중시되는 조직의 리더로서 적합하지 못하다.
T자형의 융합형 인간을 키워내기 위한 노력이 필요
IT기업 선가드(SunGard)사의 CEO인 콘(Christobal Conde)은 오늘날 리더의 역할은 조직내의 모든 의사결정이 협력에 기반해 이뤄질 수 있는 시스템을 만드는 것이라고 강조한다. 사실 협력을 기반으로 한 조직시스템은 지난 10년간의 지식경영(knowledge management)에 대한 논의 등을 통해서 일찌기 강조되고 있었다. 하지만 기존에 논의되었던 지식경영시스템은 단순히 각자가 아는 것을 특정 장소에 공유함으로서 이 지식을 필요로 하는 사람이 적은 노력과 비용으로 이 지식을 활용할 수 있게 한다는 목적을 가진 것으로서, 분리되고 객체화 된 지식 및 인간에 대한 가정을 근본으로 하고 있다. 이에 반해 미래의 조직적 변화에서 요구되는 협업이라 함은 지식이 지식의 소유자와 분리되어 이전되는 것이 아니라 지식 소유자들 간의 협력이라는 매개를 통해 보다 혁신적이고 창의적인 결과물을 도출한다는 점에서 보다 인간적이며 사회적이라는 데 차이가 있다.
T자형 인재라는 개념 자체는 매우 단순해 보이지만 사실 제대로 된 T자형 인재를 발견하기란 그리 쉬운일이 아니다. 자신의 분야에서 매우 높은 수준의 전문성을 인정받고 있는 사람들의 경우 외골수인 경우가 많고, 다른 사람들의 말을 잘 듣지 않으며 자신의 지식과 전문성에 대한 믿음을 바탕으로 독불장군식 행동을 하는 경향이 높은 것이 사실이다.
샌프란시스코에 본사를 둔 세계적인 디자인 회사인 IDEO의 CEO 브라운(Tim Brown)은 직원을 채용할 때 지원자들의 이력서보다는 면접을 통해 T자형 인재를 찾아낼 수 있다고 한다. 과거의 업무경험에 대한 질문을 통해 그 사람이 얼마나 다른 사람들과의 협력에 가치를 두고 있으며, 얼마나 협력에 익숙해 있는지 파악할 수 있다는 것이다. 따라서 그는 I형인재 보다 T형 인재를 뽑으려 할 때는 훨씬 더 많은 시간과 노력을 들여 지원자를 평가해야 한다고 말한다.
그렇다면 T자형 인재는 어떻게 개발될 수 있을까? 먼저 학교를 통한 정규교육 프로그램에서 부터 T자형의 융합형 인간을 키워내기 위한 노력이 시작되어야 할 것으로 생각된다. 학부나 대학원 프로그램에서 학제간 연구를 적극적으로 지원하고 교수와 학생간의 이동과 교류를 보다 활발히 촉진시킴으로서 자신의 전공분야 이외의 다른 분야에 대한 이해도를 높이는 방향으로 대학교육이 이뤄져야 할 것이다.
조직 내에서 실시되는 교육훈련의 경우에도 강의실위주의 인지적인 방식보다는, 실제 상황 속에서 과업을 수행하는 액션러닝(action learning)방식이나 팀빌딩(team building), 그리고 보다 정서적인 측면 혹은 인간적 측면의 능력을 배양하는 소프트스킬 트레이닝(soft skill training) 방식의 교육훈련이 조직능력개발이나 리더십 훈련의 중심 트렌드로 자리 잡을 것이라 예상할 수 있다. 상황이 이러한데, 아직도 단편적인 지식을 암기하는 것이 학습의 전부라 믿고 있으며, 좋은 회사에 취직하기 위해서 점수화 되고 계량화된 스펙 쌓기에 시간과 에너지를 소모하고 있는 우리 청년들의 현실이 안타깝다.
조성준 _ 美 뉴욕 Utica College 경영학과 교수
* 출처 : 월간 인재경영 GLOBAL REPORT_ Trend 2010년 9월 첫째 주 소식 태그저장 취소
요즘 채용을 진행중이라서 최근 면접관으로 두어번 참여를 한적이 있습니다. 그중 한분은 성실하고 책임감 있다는 평과 더불어 좋은 실력을 갖추었다는 다른 직원의 추천을 받으셨던 분이었습니다.
그런데 정작 이분이 면접장에 오셔서는 너무 긴장하시고 떨게 되면서 자신의 모습을 거의 보여주지 못하는 일이 발생했습니다. 물론 대부분의 사람들이 면접에 임하면 떨게 됩니다만 이분은 그 정도가 너무 심각했던 거죠. 저희는 면접을 진행하면서 피 면접자가 지나치게 긴장한 느낌을 받게 되면 이런 저런 신상질문과 농담을 통해서 긴장을 풀어주려는 노력을 합니다. 그런데 이분은 그런것이 전혀 도움이 되지 않았습니다.
결국 결과는 1차면접 탈락. 추천해주신 분도 안타까워 하시고, 저 역시도 긴장때문에 응시자가 탈락했다는것을 알기 때문에 괜스레 미안하고 마음이 편치 않았습니다.
그러면, 면접에서 떨지 않고 자신감을 갖는 방법은 어떤게 있을까요? 물론 천성적으로 약간 긴장을 해야 더 말이 잘되는 사람도 있습니다만, 이제부터 드리는 이야기는 그렇지 않은 많은 분들을 위한 조언정도로 가볍게 생각해주시기 바랍니다.
응시한 회사에 대해서 사전 조사를 충분히 하세요.
2년전에 팀에 채용이 된 신입사원이 있었습니다. 면접에 임하는 자세가 굉장히 차분하고 모르는 질문에는 잠깐 시간을 달라면서 고심하는등 준비된 자세를 보여 채용이 되었었죠.
그런데 이 친구가 입사한 후 들었던 자신의 취업후기는 여러사람을 깜짝 놀라게 할 정도였습니다. 완전히 저희 회사에 대해서 탐정수준으로 조사를 하였더군요. 1차면접의 단골 기술질문을 리스트업 하는것은 기본이고, 2차면접관이 누구인지 이름부터 관련 정보를 미리 파악을 하였다고 했습니다.
탐정처럼(사진출처 : Flickr)
어떻게 그렇게 다 알수 있냐구요? 열의가 있으면 방법은 엄청나게 많습니다. 하지만 차이는 이거죠.
대부분의 다른 응시자는 불가능한 일이라고 포기하지만, 성공한 사람들은 일단 조사하고 두드려 본다는것. 이런 작은 마음가짐이 큰 결과의 차이를 만들어 냅니다.
가능한대로 몇개의 회사에 동시에 지원을 하세요.
이건 실제로 지금의 네오위즈게임즈에 입사할때 제가 사용했던 방법입니다. 경력지원이었던 지라 헤드헌터를 통해서 이직을 노리고 있었는데요, 다섯회사에 지원을 해서 결과적으로 세개의 회사에 채용이 되었었습니다. ( 자랑질을 하고자 하는것이 아닙니다. ^^ )
이렇게 하면 어떤 점이 좋을까요?
당연히 응시자의 마음이 편안해 집니다. 여기 아니더라도 다른곳도 있다는 일종의 보험심리가 작동을 하지요. 그러면 편안하게 면접에 응할 수 있고, 더불어 어떤 회사가 나에게 맞을지 거꾸로 회사를 면접할 수 있게 됩니다. 여러 회사에서 제시하는 채용조건과 복리후생등을 비교 가능하다는 것도 장점이구요. 신입이라면 더 많은 회사에 이력서를 제출하시고, 경력이시라도 몇개의 회사를 중복해서 지원하는 방법을 추천 드립니다.
가능하면 여러 회사에 많이 도전하세요. 단점보다 장점이 많습니다.
경력자라면 절대로 먼저 사직서를 제출하지 마세요.
"새 신 생기기 전에 절대로 헌 신을 버리지 마라"
이 말은 연애의 기술에만 써먹어야 하는건 아닙니다.
헌 신은 반드시 새 신 얻은 다음에 버리시라는 것..(사진출처 : flickr)
더 좋은 회사로 이직하시려는 분, 절대 먼저 회사를 그만두지 마세요. 결정된 이후에 사직서를 제출해도 늦지 않습니다. 먼저 사직을 하고 나면 면접에서 느긋해지기 어렵습니다. 그 회사에 목을 메게 될수록 결과가 안좋을 가능성이 높아집니다.
세상은 넓고 좋은회사는 많다.
이건 진짜에요. 알려진 좋은회사 보다, 알려지지 않은 멋진 회사가 더 많습니다. 제 친구녀석 이야긴데요. 제가 졸업과 동시에 대기업에 취업했다고 으스댈때 이녀석은 전혀 듣도 보도 못한 회사에 영업직으로 입사를 하더군요. 그리고 어떻게 되었을까요?
이 녀석은 매년 두세번씩 회사에서 괌으로 푸켓으로 MT를 갑니다. 연봉은 3년만에 저와 비교도 하지 못할정도로 차이가 났구요(연봉테이블 자체가 다르더군요), 업무로 해외출장을 밥먹듯이 가면서 여러 경험을 통해서 자신을 업그레이드할 기회가 주어지는 좋은 회사였습니다.
이후에 사회 경험을 하면서 이런 경험을 반복해서 하게 되더군요. 우리가 다 알지 못해도 좋은회사는 엄청나게 많습니다. 굳이 대졸 취업생 여러분들이 선호하는 삼성, LG처럼 드러낼 필요가 없을 뿐인거죠. 그러니 이 회사에 취업이 되지 않으면 다른 더 좋은 회사에 가면 된다는 편안한 마음을 가지세요. 실제로 지금 여러분을 면접에서 힘들게 한 그 회사 말고도 더 좋은 회사는 얼마든지 많이 있습니다. 그리고 그런 마음으로 편안하게 면접을 볼수록, 지금 그 회사는 여러분을 붙잡고 싶어 하게 됩니다.
이외에도 긴장해소를 하는 나름의 장,단기 처방이 있을겁니다. 끝없이 마인드컨트롤을 하는것도 도움이 되구요. 면접전에 가볍게 산책을 하면서 차분하게 마음을 가다듬는것도 방법입니다.
우연하게 닿은 기회를 통해서 얼마전 4번째 대학에 취업특강을 다녀왔습니다. 물론 저는 취업클리닉이나 강의를 전문으로 하는 커리어 전문가는 아닙니다. 하지만 대기업이 아니라면 바로 저 같은 현장의 실무자가 보통 이력서도 검토하고 1차 면접도 보게 됩니다. 취업에 있어서 바로 첫번째 관문을 통과하려면 저 같은 사람의 이야기에도 귀를 기울일 필요가 있다는 거죠.
그래서, 그동안 강의 준비를 하면서, 그리고 이야기를 하면서 했던 이야기들을 조금씩 풀어보려고 합니다. 오늘은 첫번째로 이력서를 쓸때 알아두면 좋은 팁을 소개해 보겠습니다.
이력서 사진에 신경쓰세요.
수시채용이거나 공채거나, 사실 지원자들의 이력서를 검토하는것은 실무자들에겐 쉬운일이 아닙니다. 보통 이력서만 30배수에서 40배수 이상을 검토하게 되는것이 일반적인데, 한개의 이력서당 5분만 투자한다고 하더라도 최소 150분이라는 시간이 소요됩니다.
앞서 이야기 했듯이 서류전형의 마지막 단계는 대기업이 아니라면 보통은 함께 일하는 사람을 구하고 있는 부서의 팀장이거나 그에 준하는 사람들입니다. 또한 그들은 이력서를 검토하는것 이상으로 해결해야할 업무가 쌓여있는 사람들입니다. 이론적으로라면 여러 기준에 의거하여 적합한 사람을 구하는것이 맞겠지만 어쩔수 없이 그들과 함께 일할 사람이라면 자신과 맞을법한 인상을 가진 사람을 찾게 됩니다.
개발1팀에 지원한 스폰지밥 입니다!!
하지만 간혹 직접 대면할 수 없는 상황에서 첫인상을 담당하게될 이력서에 스티커 사진이나 혹은 증명사진이 아닌 스냅사진에서 오린 사진을 첨부하는 경우가 있습니다. 이런 경우 그럼에도 불구하고 첫번째 전형을 통과하려면 사진의 불성실함에도 불구하고 눈에 확 뜨일만큼의 화려한 이력이나 특색있는 자기 소개가 필요합니다. 아니라구요? 그렇다면 사진한장에도 신경을 써주시길 부탁드립니다. 어떤 포맷의 사진이냐 보다는 자신의 첫인상을 잘 표현할 수 있도록 신경을 쓸 필요가 있다는 이야기 입니다.
신입이라도 이력서의 경력란은 절대 !! 비워두지 마세요.
신입사원의 이력서에서 특이한점을 찾는것은 참으로 어렵습니다. 대부분 이렇다할 이력이 없기 때문에 글짓기식의 자기소개가 대부분이기 때문이죠. 그렇기 때문에 사회적으로 인정받는 경력이 없더라도, 이력서 양식의 경력란을 자기만의 특색있는 내용으로 채울경우 분명 다른 지원자와 차별화될 요소가 됨을 인정하지 않을수 없습니다. 아르바이트도 좋고, 인턴경험도 좋습니다. 단 두어달의 경험이라도 직무와 연관이 있다면 경력란에 눈에 잘 뜨이도록 정리하시기 바랍니다.
단점보다는 장점 위주로.
뻔한 이야기 입니다만, 중요합니다. 보통 자기소개서 양식에는 자신의 장단점을 기술하라고 나와있죠? 저는 일종의 함정이라고 생각합니다. 그러면 어떻게 해야 할까요? 당연하지만 가능한 한 자신의 장점 위주로 서술을 하시는게 유리합니다. 만약 어쩔수 없이 자신의 단점을 이야기 해야 한다면, 그 단점을 어떻게 극복했는지를 위주로 이야기 하거나, 혹은 그 단점을 장점으로 승화시킬 성공스토리를 준비하셔야 합니다. '자신은 고집이 세다' 거나 '성질이 급하고 화를 잘낸다'는 식으로 솔직한 자기 소개서를 보면.. 함께 일할 실무자들은 고개를 돌리게 됩니다.
스펙 보다는 스토리텔링이 먹힌다.
정말입니다. 개발자로 일하기를 원하신다면 스펙보다는 스토리를 준비하셔야 합니다. 요즘 대학에서의 학점이나, 특성없이 수집되어진 자격증은 절대 취업에 도움이 되지 못합니다. 학점 보다는 팀프로젝트가, 토익보다는 오픈소스 프로젝트에 참여했던 경험이 훨씬 눈이 확 뜨이는 이력서 입니다. 왜냐하면 채용을 하는 사람이 이미 잘 알거든요. 학점이나 자격증이 실무에 그다지 도움이 되지 않는다는걸요. 대신 피면접자가 될 사람이 인상적인 과정으로 성공경험을 가졌다면, 그 사람을 만나서 이야기를 들어보고 싶다는 욕심이 드는건 인지상정인거죠.
그들이 원하는 키워드가 무엇일지 고민하라.
지원하시는 회사의 그 팀장이 요즘 무슨 생각을 하고 있을지 고민해보면 답이 나옵니다. 모바일관련 개발팀이라면 아이폰과 안드로이드가, 소셜앱을 개발하는 회사라면 페이스북과 트위터가 키워드가 됩니다. 이력서가 고속도로 광고판이라고 생각해보라는 이야기가 있습니다. 그러면 어떤 키워드로 서류검토자들을 유혹해야 할지 답이 나옵니다.
가능하면 한번에 모든걸 보여주도록 구성하자.
하지만 그게 쉽지 않다면, 혹은 꼭 보여주어야 할 포트폴리오가 있다면, 그때는 첨부파일도 좋습니다. 그런데, 그럴경우 문서 포맷은 꼭 MS word나 파워포인트 같은 MS-Office 포맷으로 하시기 바랍니다. 관공서나 공기업이 아니라면, 아래한글문서는 서류전형검토자의 PC에는 설치되어있지 않습니다. 가급적 압축도 하지 마시고 압축해야 할 만큼 파일 사이즈가 크다면, 파일을 컴팩트 하게 다시 정리하시기 바랍니다. 그들은(우리들은) 그렇게 시간이 많지 않다니까요!!
여기서 파일 첨부보다 더좋은 방법은 뭘까요? 그것은 자신만의 블로그나 웹사이트를 이력서의 포트폴리오로 활용하는 것입니다. 이경우 단지 HTML 링크만 한줄 들어가면 됩니다. 서류검토자의 PC는 대부분 인터넷에 연결되어있고, 따라서 그들은 편안하게 웹브라우저로 포트폴리오를 검토합니다. 훨씬 편하지 않나요? 미국의 유명한 회사인 37Signals 입사에 성공한 많은 사람들의 이력서를 보면 답이 나옵니다.
휴.. 처음 정리해본 글인데 역시 말로 할때와는 또 다르네요.
하지만 혹시라도 취업을 앞둔, 그중에서도 개발자의 길로 가길 원하는 준비생들에게 도움이 되었으면 좋겠습니다.
아 그리고.. 제 블로그는 워낙에 손님이 적기도 하지만 대부분 저보다 더 많은 경력을 가지시고, 더 많은 채용경험을 가진 분들이신걸로 압니다. 혹시라도 제 글에 대해서 다른 의견이나 피드백이 있으시면 기탄없이 주시길 부탁드립니다.