2015년 12월 3일 목요일

실패한 경험

누군가 '실패한 경험과 그 실패로 배운 점은?'이라고 묻는다면?


마치 면접 상황에서 마주치게 되는 질문이라는 느낌을 받았을 거라 생각된다.
애플 면접에서 듣게 되는 33가지 질문
몇가지 흥미로운 퀴즈도 있고, 하루가 지난 지금까지 머리속에 남아 있는 질문도 있다.
바로 위에서 말한 실패한 경험에 대한 것이다.


실패한 경험이야 잠깐의 고민에도 몇가지가 떠오르지만, 그 실패 후 배운 점은 무엇 인가에 대한 대답은 쉽사리 찾아지지 않았다. 그래서 계속 머리속 한 귀퉁이를 차지하고 있다가 이렇게 갑자기 글을 쓰게 만든 것 일지도 모르겠다.

첫번째는 준비 없이 시작한 학원이다.

사회 초년생 시절 다니던 회사를 그만 두고 잠시 아는 분의 학원일을 도와준 적이 있다. 그러다 별 준비도 없이 부모님 돈을 가져다가 같은 학원을 하나 차리고 운영하게 되었다. 프랜차이즈로 운영되는 곳이었고 지인 분의 도움을 받아가며 하면 충분히 운영 가능 하리라 생각했다. 또 당시 나름 유행하던 곳이라 돈도 제법 벌 수 있을 것이란 기대도 했다.

하지만 현실은 상상과는 너무 달랐으며 나의 능력 밖의 일이라고 생각되는 것 역시 너무 많았다. 그리 유쾌한 사람도 아닐 뿐 더러 그날 처음 본 학부모와 자연스럽게 대화하면서 설득하고 영업(!) 하는 것이 너무도 힘들었던 것이다. 게다가 3,4개월 마다 광고를 계속 하면서 수입도 거의 없이 현상 유지만 되는 상황이 계속 되었다.
결국 다른 분에게 학원을 넘기고 손해만 남긴채 접었던 기억이 있다.

가장 큰 실수는 나름 사업을 시작한다고 하면서 신중하지 못했으며, 대부분의 일을 지인에게 의지한채 시작했다. 결국 나의 일이며 내가 해야할 일들이었는데, 사전 조사, 관련된 지식 모든 것이 준비되지 않은 채 분위기에 휩쓸려 시작하고 당연히도 실패를 했다.

[학원 운영을 했던 일]
[반성:쉽게 생각해서 할 일이 아니었다. 조사, 공부, 준비 모든 것이 부족했다.]

두번째는 엔진 포팅에 관한 일이다.

당시 진행 중이던 프로젝트의 성과가 미진해서 잠시 다른 업무를 맡은 적이 있다. 다른 팀에서 만들던 Drawing 엔진을 가져다가 저사양 터치 패널에 포팅하는 일이었는데, 계속 우선순위에 밀려 일정만 까먹고 있다가 얼마 남지 않은 상태에서 나에게 넘어 왔다.

업무 설명을 듣는 순간 "아 X 밟았구나"라는 생각이 들며 실패가 뻔히 예상되었다. 거의 다 지난 개발 기간과 제대로 확인 되지도 않은 요구사항들, 성능이 파악되지 않은 단말기등 모는 상황이 최악이었고, 위에서 요구하는 동작(뒤에 확인 한 사실이지만 하드웨어 담당 업체가 원하는 동작도 아니었다.)은 하드웨어가 지원할 수 없는 상태였다.


당연히 일정내에 할 수 없었으며, 일정이 더 있다고 해도 원하는 동작을 구현할 수 없었다. 당시 팀장에게도 연구 소장에게도 구현 할 수 없다고 했으나 내 의사가 제대로 전달되지 않았는지 별다른 조치가 없는 채 일정이 지나버렸고 대표이사에게 까지불려가서 문책을 당해야 했다.

Drawing 엔진을 요청한 회사의 담당자들과 모여 회의를 진행하고 요구사항을 정확히 정리하는 일이 그 후에 있었으며, 그들이 원한 수준의 동작은 금새 구현해 주었다.

당시 해당 프로젝트를 맡았을 때 상황 파악이 끝나면 그 즉시 불가능 하다는 것을 정확히 전달하고 해결 방법을 제시했어야 했다. 위의 경우에서는 담당자들을 불러 요구사항을 정확히 확인 하는 것이었다. 당시의 난 불가능한 상황을 보고 했으니 나의 역할은 거기까지다 라고 생각하고 책임을 회피했었던 것 같다.


[Drawing 엔진 포팅에 관한 일]
[반성:불가능 한 일은 불가능한 원인을 정확히 보고하고, 그 해결책을 제시하거나 찾기 위한 적극적인 행동이 필요했다]

실패 그 후.. 

너무나 당연한 말이겠지만, 실패 후 무엇을 얻었는가는 매우 중요하다. 위의 기사를 우연히 발견하지 않았다면, 지난 실패는 그저 안 좋은 추억으로만 남은 채 어쩌다 그 일이 기억나면 이불킥을 날리는데 사용되는 걸로 끝났을 것이다.
실패하게된 원인을 찾아보고 그걸 반복하지 않기 위해 그리고 또 똑같은 상황에 마주친다면 어떻게 할 것인가를 고민해봐야 할 것이다. 마치 오류를 찾아 디버깅 하듯이...

2015년 11월 13일 금요일

CFileDialog::DoModal causes Access Violation

라이브러리 테스트를 위해 간단한 MFC 어플을 만들었다.
파일 열기 한 후 PDF 파일을 선택하고, 라이브러리를 통해 변환하고 결과를 보는 간단한 동작이다.

근데 언젠가부터 테스트 중에 ole32.dll access violation exception이 계속 발생한다.
ole32.dll exception으로 구글링을 아무리 해도 별 내용을 못 찾다가, 코드를 삭제하면서, Dialog에 control을 삭제하면서 원인이 되는 부분을 찾아보았더니, CFileDialog를 호출한 후 exception이 발생한다. 그것도 바로 발생하는 것이 아니라 어느정도 시간이 지난후..

그래서 검색어를 바꿔서 구글링하니 똭~!

http://mfctips.com/2012/10/29/cfiledialogdomodal-causes-access-violation/

ole32.dll이 아니고 ntdll.dll이라고 나오지만, 설명하고 있는 발생상황이 거의 대부분 일치했다. 어느 정도 시간 후 라고 생각했지만 정확히 60초 후에 exception이 발생하는 것도 일치했고,

몇가지 해결방법을 제시하고 있지만, 첫번째 Disable "Vista Style"로 하니 정상동작 한다. FileDialog가 예전의 구린 모습으로 나오긴 하지만..

두번째 Hotfix는 exception이 발생하는 dll이 달라 적용이 불가능해 보인다.

그 외 제일 가능성 있어 보였던 Uninstall Acrobat Reader.
최근 테스트를 위해 Acrobat 제품을 설치 한 적이 있어서 혹시나 하고 삭제 해 보았으나 실패!

Disable 3rd party shell extensions.
아직 테스트 해 보진 않았으나 원인 일 수 있을 것 같다. 근데 결국 설치된 어플을 삭제해가면서 확인 해 봐야 할 것 같아서 꼭 해야 하나 싶은 생각이 든다.

2015년 10월 30일 금요일

Beginning the Clojure with the IntelliJ

Install Intellij from JetBrains 

https://www.jetbrains.com/idea/download/

"Community Edition" is FREE and open-source !!
Lightweight IDE for Java SE, Scala ...

Install Clojure Plugin - Cursive

https://cursiveclojure.com/

"Cursive" is built on IntelliJ and is written (almost) entirely in Clojure. 

Start to learning the Clojure with http://clojure-doc.org/

 

links

2015년 10월 2일 금요일

changes Visual Studio color scheme

별도 Plug-in 추가 없이 setting export/import를 통해 color scheme 적용

Create and share Visual Studio color schemes

http://studiostyl.es/

 

2015년 1월 16일 금요일

Bamboo를 이용한 테스트 자동화 삽질 이야기

요구사항

  • 프로젝트는 C로 개발한다.
  • 테스트는 googletest로 한다.
  • Bamboo를 이용한 일일빌드 시스템을 만든다.

이번 달 부터 새로운 프로젝트를 작은 인원으로 시작한다. 자료조사와 문서 정리 외에 '일일빌드'시스템을 만들어야 하는 과제가 내려졌다. 필요성은 잘 알고 있었기에 1.5일간에 걸친 삽질을 통해 완료했다. 프로젝트가 본격 개발에 들어가기 전이라 별 내용은 없으나, 이 후 개발에 많은 도움이 될 것이라 만족도는 상당히 높다.

상황

googletest는 사용법이 간단하기도 하고, 간간히 쓰고 있기 때문에 문제될 것은 없다. Bamboo는 타부서에서는 사용하고 있지만 우리 부서는 제한적으로 사용중이고 나는 제한적인 부분에도 포함되지 않는 완전 초보다. 우리 부서 동료분의 도움을 받아 진행한다.

시나리오

  1. Bamboo에서 소스를 내려받는다.
  2. 소스와 테스트 코드를 빌드한다.
  3. 테스트를 실행한다.
특별한 시나리오는 없다. Bamoo에 Plan을 만들고, Job을 등록하고, 잘 돌아가게 설정하면 끝!
다만, 잘 돌아가게 설정하는 삽질이 많이 필요했다.

Bamboo에서 소스 내려 받기

소스 내려 받기 위해선 당연히 소스는 서버에 있어야 한다. 우리 프로젝트는 SVN은 버리고 Git을 사용하기로 하고 계정과 저장소를 요청해서 받았다. 간단한 C코드와 테스트 코드를 작성하고, commit & push.

소스와 테스트 코드 빌드

길고 힘든 삽질이 계속되었다.
빌드를 위한 Toolchain이나 script의 선택이 있어야하나, 다른 부서가 CMake 사용하는 것을 보고 왠지 멋져 보였음 따라하기로 한다.
프로젝트 Root에 CMakeLists.txt를 만들고, 내용을 입력한다.

cmake_minimum_required(VERSION 2.8)
project(project_name)

set(CMAKE_VERBOSE_MAKEFILE on)

include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/internal_utils.cmake)

if(MSVC)
#We statically link to reduce dependancies
foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
    if(${flag_var} MATCHES "/MD")
        string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
    endif(${flag_var} MATCHES "/MD")
    if(${flag_var} MATCHES "/MDd")
        string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
    endif(${flag_var} MATCHES "/MDd")
endforeach(flag_var)
endif(MSVC)

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/gtest-1.7.0)

set(ENGINE_SOURCE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(ENGINE_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(TEST_SOURCE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/test)

INCLUDE_DIRECTORIES(${ENGINE_INCLUDE_DIRS})

INCLUDE_DIRECTORIES(${ENGINE_SOURCE_DIRS})
add_subdirectory(test)
처음엔 googletest를 미리 빌드하고 lib만 추가하려고 했으나, 그러면 cross-platform을 제대로 지원하지 못하게 되는데다가, googletest에 CMake script가 잘 되어 있어서 굳이 빌드한 것을 가져다 쓸 필요가 없다.
소스가 있는 폴더를 add_subdirectory 하면 googletest 준비는 완료.
test가 있는 폴더를 add_subdirectory 해 준 후, 해당 폴더에 CMakeLists.txt를 하나 더 생성


INCLUDE_DIRECTORIES(${gtest_SOURCE_DIR}/include)

add_executable(exec_test test_sources)
target_link_libraries(exec_test gtest_main)

여기까지 하면 빌드 준비 끝!
사실 여기까지 반나절 가량 걸린 듯 하다. 결국 집에서 구글링하다 찾은 https://schneide.wordpress.com/2014/01/27/integrating-googletest-in-cmake-projects-and-jenkins/ 아니었으면 훨씬 더 오래 걸렸으리라..

그리고 생성된 빌드 스크립트로 빌드하면 되는데, 몇번의 삽질 끝에 MSBuild로 간단히 해결되었다. 물론 MSBuild를 쓴 이유는 test 코드에 윈도우 라이브러리를 사용해서 메모리 릭을 확인하는 코드가 있어서 어쩔수 없었고, CMake도 윈도우용을 사용했다.
처음엔 빌드하는데 Toolchain이 없어서 삽질을 했고(http://stackoverflow.com/questions/13596816/how-can-i-generate-a-visual-studio-2012-project-targeting-windows-xp-with-cmake), CMake에
-G "Visual Studio 11" -T "v100" 
를 추가해서 해결되었다.

제대로 빌드가 되면 CMakeLists.txt에 적어준 대로 "exec_test.exe" 파일이 생성된다.

 

테스트 실행

스크립트를 통해 실행하면 테스트가 진행되고, 그냥 두면 console에 출력하고 끝나버린다. 게다가 우리 테스트 코드에는 system("pause"); 코드가 들어있어서, "아무키나 누르세요"하고 기다리게 되고, task가 진행되지 않는 상황이 생겼다. console에 출력되는 내용을 xml로 보내기 위해
exec_test --gtest_output=xml:testresults.xml
를 추가하고, 대기상태에 있는 것은 Bamboo의 Script Argument에
/c < nul
를 추가하는 것으로 해결했다.
마지막으로 생성된 testresults.xml을 Bamboo의 JUnit Parser로 보내서 테스트 결과를 점검하게 하면 완료되겠다. 마지막으로, googletest를 작성할 때 testname에 한글을 넣어도 잘 동작하지만, JUnit Parser는 제대로 파싱하지못하고 실패하는 문제가 있었다. 파싱 실패 원인을 찾느라 또 삽질