SlideShare a Scribd company logo
1 of 86
Download to read offline
“프로젝트 제대로 해보기“
Nexon Korea, Microsoft MVP
옥찬호
청강문화산업대학교 특강
소개
• 옥찬호 (Chris Ohk)
• Nexon Korea Game Programmer
• Microsoft Development Technologies MVP
• 페이스북 그룹 C++ Korea 대표
• IT 전문서 집필 및 번역 다수
• 게임샐러드로 코드 한 줄 없이 게임 만들기 (2013)
• 유니티 Shader와 Effect 제작 (2014)
• 2D 게임 프로그래밍 (2014)
• 러스트 핵심 노트 (2017)
• 모던 C++ 입문 (2017)
시작하기 전에…
• 프로젝트의 완성도를 높일 수 있는 방법을 설명합니다.
• 주 내용은 프로그래머에 초점이 맞춰져 있지만,
다른 직군분들도 들으면 도움이 되는 내용도 포함되어 있습니다.
• 모던 C++로 만드는 프로젝트를 기준으로 설명합니다.
(Hearthstone++ : 모던 C++로 만드는 하스스톤 시뮬레이터)
• 프로젝트의 성격에 따라 설정 방법이 다를 수 있습니다.
혹시 나중에 프로젝트를 구성하다가 막히는 부분이 있다면 질문해 주세요!
청강대 특강
프로젝트 제대로 해보기
목차
• 회사에서는 어떻게 프로젝트를 진행할까요?
• 우리들의 현실
• 프로젝트 제대로 해보기
• 소스 코드 관리 / 이슈 관리 / 코드 스타일
• 지속적인 통합 / 테스트 / 코드 커버리지
• 코드 리뷰 / 코드 품질 / 문서화
• 마치며
청강대 특강
프로젝트 제대로 해보기
회사에서는 어떻게 프로젝트를 진행할까요?
회사에서는…
• 로드맵 회의
• 컨셉 회의
• 개발 시작
• 폴리싱
• 테스트
• QA
• 정식 출시
청강대 특강
프로젝트 제대로 해보기
우리들의 현실은 어떨까?
우리는…
• 소스 코드를 USB나 이메일로 주고 받습니다.
• 회의한 내용을 기록해두지 않습니다.
• 코드에 버그가 있는지 없는지 알 수가 없습니다.
• 코드가 정상적으로 컴파일 및 빌드되지 않습니다.
• 구현한 코드가 올바르게 수행되는지 확인해보지 않습니다.
• 서로 작성한 코드에 문제가 없는지 살펴보지 않습니다.
• 서로 작성한 코드로 인해 충돌이 생겨 엉망진창이 됩니다.
청강대 특강
프로젝트 제대로 해보기
프로젝트 제대로 해보기
한 번 하더라도 제대로 해보자!
소스 코드 관리
• 이메일 / USB / 구글 드라이브로 코드 공유는 이제 그만!
• 서로 다른 코드로 작업할 가능성이 매우 높습니다.
• 이로 인해 코드가 충돌할 수 있으며 해결하기 매우 어렵습니다.
• 갱신한 코드에 버그가 생겨 이전 버전으로 되돌려야 할 때 고치기 어렵습니다.
• 분산 버전 관리 시스템을 사용합시다.
• Git : https://git-scm.com/
• Git을 배울 수 있는 사이트들
• https://try.github.io/
• https://rogerdudler.github.io/git-guide/index.ko.html
• https://opentutorials.org/course/1492
청강대 특강
프로젝트 제대로 해보기
소스 코드 관리
• Git을 사용하면 무엇이 좋을까요?
청강대 특강
프로젝트 제대로 해보기
소스 코드 관리
• 프로젝트를 관리하려면 Git을 사용해 명령을 내려야 합니다.
• Git 저장소 만들기 : git init
• 기존 저장소를 Clone하기 : git clone
• 파일의 상태 확인하기 : git status
• 파일을 새로 추적하기 : git add
• 변경 사항 커밋하기 : git commit
• 파일을 삭제하기 : git rm
• 변경된 내용 푸시하기 : git push
• 커밋 수정하기 : git commit --amend
• ...
청강대 특강
프로젝트 제대로 해보기
소스 코드 관리
• 명령어를 사용하는게 어렵다면 간편한 GUI 프로그램을 사용해도 됩니다.
• GitHub Desktop
• Sourcetree
• TortoiseGit
• GitKraken
• Tower
청강대 특강
프로젝트 제대로 해보기
소스 코드 관리
• Git을 사용하는 프로젝트를 지원하는 협업 플랫폼 3대장
• GitHub
• Bitbucket
• GitLab
• 여기서는 GitHub를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
소스 코드 관리
• GitHub : https://github.com/
청강대 특강
프로젝트 제대로 해보기
소스 코드 관리
• 프로젝트의 소스 코드를 저장하기 위한 저장소를 만들어 봅시다.
청강대 특강
프로젝트 제대로 해보기
소스 코드 관리
• 짜잔~ 우리만의 소스 코드 저장소가 생겼습니다. 짝짝!
청강대 특강
프로젝트 제대로 해보기
이슈 관리
• 새로 개발하는 기능과 버그 수정 등 모든 사항들은 반드시 기록해야 합니다.
• 나중에 새로 구현한 기능에서 버그가 발생했을 때 개발 과정을 추적할 수 있습니다.
• 버그를 수정했는데 다른 버그가 발생했을 때 이전 버그 수정 과정을 추적할 수 있습니다.
• 기능을 개선하는 작업을 맡았을 때 기능을 개발한 사람이 없을 수도 있습니다.
• 이슈를 관리할 수 있는 서비스들이 있습니다.
• JIRA
• Redmine
• Trac
• Mantis
청강대 특강
프로젝트 제대로 해보기
이슈 관리
• GitHub의 Issues를 사용해 관리할 수도 있습니다.
청강대 특강
프로젝트 제대로 해보기
이슈 관리
• 이슈를 작성할 때는 어떤 작업인지 자세히 기록합니다.
청강대 특강
프로젝트 제대로 해보기
이슈 관리
• 이슈 진행 상황은 댓글을 통해 작성합니다.
청강대 특강
프로젝트 제대로 해보기
코드 스타일
• 프로그래머들의 영원한 난제
청강대 특강
프로젝트 제대로 해보기
if (showHelp) {
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
if (showHelp)
{
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
vs
코드 스타일
• 코드 스타일에 정답이란 없습니다.
(물론 언어 차원에서 스타일을 정하는 경우도 있습니다.)
• 회사에서는 팀마다 코드 스타일을 정해두고 사용합니다.
• 들여쓰기를 할 때 탭을 쓸 것이냐 공백 문자를 쓸 것이냐
• 중괄호는 같은 줄에서 열 것이냐 다음 줄에서 열 것이냐
• if 문 뒤에 공백 문자를 넣을 것이냐 말 것이냐
• 코드 스타일을 정하는 이유
• 프로그래머마다 선호하는 코드 스타일이 다릅니다.
• 따라서 통일된 코드 스타일을 사용하지 않으면 가독성이 떨어집니다.
청강대 특강
프로젝트 제대로 해보기
코드 스타일
• 큰 회사들은 나름대로의 코드 스타일 가이드 문서를 정립합니다.
• Google C++ Style Guide
• C++ Core Guidelines
• CMU C++ Coding Standard
• ROS C++ Style Guide
• LLVM Coding Standards
• 위 코드 스타일 문서를 참고해서 팀에 적용해도 됩니다.
하지만 우리만의 코드 스타일을 만들고 싶다면 어떻게 해야 할까요?
청강대 특강
프로젝트 제대로 해보기
코드 스타일
• C++에서는 clang-format을 사용해 코드 스타일을 지정할 수 있습니다.
(자세한 내용은 https://clang.llvm.org/docs/ClangFormatStyleOptions.html 참고)
청강대 특강
프로젝트 제대로 해보기
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -3
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: true
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
...
코드 스타일
• C++에서는 clang-format을 사용해 코드 스타일을 지정할 수 있습니다
(자세한 내용은 https://clang.llvm.org/docs/ClangFormatStyleOptions.html 참고)
청강대 특강
프로젝트 제대로 해보기
if (showHelp) {
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
if (showHelp)
{
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
AfterControlStatement: true
AfterControlStatement: false
지속적인 통합
• 이런 일 겪어본 적 없나요?
• 정상적으로 빌드되는 프로젝트에 팀원 A가 작업을 하기 시작합니다.
• 팀원 A는 작업을 완료하지 않은 상태에서 프로젝트에 코드를 커밋합니다.
• 프로젝트는 컴파일 오류로 인해 빌드되지 않습니다.
• 이 상태에서 팀원 B가 작업을 하기 위해 프로젝트 코드를 갱신합니다.
• 팀원 B는 프로젝트가 빌드되지 않아 당황합니다.
• 팀원 A가 작업을 완료하기 전까지 팀원 B는 작업을 할 수 없습니다.
청강대 특강
프로젝트 제대로 해보기
지속적인 통합
• 지속적인 통합(Continuous Integration)은 이전과 같은 문제점을
해결하기 위해 개발 팀원들이 작성한 코드를 최대한 자주 통합하는
소프트웨어 개발 실천법입니다.
• 지속적인 통합의 장점
• 자동화를 통해 수시로 통합할 수 있으며, 문제를 조기에 발견하고 조치할 수 있습니다.
• 코드와 테스트를 개인 환경과 독립적으로 구성할 수 있습니다. 즉, 개발자가 코드를 수정하고
커밋하지 않아 개인 환경에서만 빌드되는 문제를 조기에 수정할 수 있습니다.
• 다른 개발자가 수정한 내용을 자동으로 빌드하고 통합 테스트를 진행할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
http://12bme.tistory.com/151
지속적인 통합
• 플랫폼에 따라 지속적인 통합을 지원하는 서비스들이 있습니다.
• App Center
• Travis CI
• CircleCI
• AppVeyor
• Jenkins
• Bamboo
• 여기서는 Travis CI와 AppVeyor를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
지속적인 통합
• Travis CI : https://travis-ci.org/ (Linux와 macOS 지원)
청강대 특강
프로젝트 제대로 해보기
지속적인 통합
• GitHub 계정으로 로그인한 뒤 새 프로젝트를 추가합니다.
청강대 특강
프로젝트 제대로 해보기
지속적인 통합
• 최상위 경로에 .travis.yml 파일을 만들고 다음과 같이 작성합니다.
(자세한 내용은 https://docs.travis-ci.com/user/customizing-the-build/ 참고)
청강대 특강
프로젝트 제대로 해보기
language: cpp
matrix:
include:
# Test Docker based on Ubuntu 18.04 LTS + gcc
- os: linux
dist: trusty
sudo: required
services: docker
script:
- sh Scripts/travis_build_docker.sh
# Test OS X 10.12 + Xcode 9 + clang
- os: osx
osx_image: xcode9
compiler: clang
script:
- sh Scripts/travis_build.sh
지속적인 통합 청강대 특강
프로젝트 제대로 해보기
before_install:
- eval "${MATRIX_EVAL}"
- if [ $TRAVIS_OS_NAME == linux ]; then
sudo apt-get update -qq;
sudo apt-get install -y --no-install-recommends xorg-dev libglu1-mesa-dev;
sudo apt-get install -y --no-install-recommends libxrandr-dev libxi-dev libxxf86vm-dev libxinerama-dev libxcursor-dev lcov;
sudo apt-get install -y --no-install-recommends libopenal-dev libvorbis-dev libflac-dev;
wget https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip;
unzip glfw-3.2.1.zip && cd glfw-3.2.1;
cmake -DBUILD_SHARED_LIBS=true -DGLFW_BUILD_EXAMPLES=false -DGLFW_BUILD_TESTS=false -DGLFW_BUILD_DOCS=false .;
sudo make -j $CPU_NUM install && cd ..;
fi
- if [ $TRAVIS_OS_NAME == osx ]; then
brew update;
brew install openal-soft;
brew install glfw3;
brew install lcov;
wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz;
tar xvf release-1.8.0.tar.gz;
cd googletest-release-1.8.0;
cmake .;
sudo make -j $CPU_NUM install && cd ..;
fi
after_success:
- bash <(curl -s https://codecov.io/bash)
지속적인 통합
• 이제 코드를 커밋하거나 풀 리퀘스트를 할 때마다 프로젝트가 자동 빌드됩니다.
청강대 특강
프로젝트 제대로 해보기
지속적인 통합
• AppVeyor : https://www.appveyor.com/ (Windows와 Linux 지원)
청강대 특강
프로젝트 제대로 해보기
지속적인 통합
• GitHub 계정으로 로그인한 뒤 새 프로젝트를 추가합니다.
청강대 특강
프로젝트 제대로 해보기
지속적인 통합
• 최상위 경로에 appveyor.yml 파일을 만들고 다음과 같이 작성합니다.
(자세한 내용은 https://www.appveyor.com/docs/build-configuration/ 참고)
청강대 특강
프로젝트 제대로 해보기
version: 0.3 ({build})
skip_branch_with_pr: true
os:
- Visual Studio 2017
platform:
- x64
configuration:
- Release
clone_folder: C:Hearthstonepp
install:
- git submodule update --init
- ps: $env:CMAKE_GENERATOR = "Visual Studio 15 2017 Win64"
before_build:
- md C:Hearthstoneppbuild
- cd C:Hearthstoneppbuild
- cmake .. -G "%CMAKE_GENERATOR%"
build:
project: C:HearthstoneppbuildHearthstonepp.sln
parallel: true
verbosity: normal
after_build:
- C:HearthstoneppbuildbinReleaseUnitTests.exe
지속적인 통합
• 이제 코드를 커밋하거나 풀 리퀘스트를 할 때마다 프로젝트가 자동 빌드됩니다.
청강대 특강
프로젝트 제대로 해보기
테스트
• 새로 작성하거나 수정한 코드가 성공적으로 빌드되었나요?
빌드만 된다고 해서 끝난 게 아닙니다. 반드시 테스트를 해야 합니다.
• 테스트를 하는 이유
• 내가 원했던 동작과 실제 동작이 일치하는 지 확인할 수 있습니다.
• 나중에 코드가 수정되었을 때 나머지 동작에 영향이 없는지를 확인할 수 있습니다.
• 비정상적인 데이터가 입력되었을 때 어떻게 처리할 지 고려할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
테스트
• 테스트의 분류
• 단위 테스트 (Unit Test) : 분리된 기능에 대한 검증으로 단위 테스트 프레임워크를
이용해 개발자가 테스트합니다.
• 통합 테스트 (Integration Test) : 컴포넌트간의 상호 작용에 대한 검증으로
테스트 입력 값을 만들어 실행한 후 결과를 확인합니다.
• 시스템 테스트 (System Test) : 전체 시스템 동작에 대한 검증으로 시스템 속도 측정,
정확한 데이터 처리 확인, 성공률과 실패율 확인 등이 있습니다.
• 인수 테스트 (Acceptance Test) : 사용자 요구 사항 처리에 대한 검증으로 사용자가
요구 기능을 입력하고 기능이 정확하게 수행하는지 확인합니다.
• 여기서는 단위 테스트를 해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
https://www.oss.kr/info_test/show/2ca348d0-d597-4606-971e-4bdc91bed442
테스트
• C++에서 많이 사용하는 단위 테스트 프레임워크는 다음과 같습니다.
• Boost.Test
• googletest
• Catch
• 여기서는 googletest를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
테스트
• googletest : https://github.com/google/googletest
청강대 특강
프로젝트 제대로 해보기
테스트
• Github 프로젝트에 googletest 프레임워크를 추가하는 방법
• git submodule add <저장소 주소> <저장할 위치>
예) git submodule add https://github.com/google/googletest
Librariesgoogletest
청강대 특강
프로젝트 제대로 해보기
테스트
• 먼저 프로젝트 설정을 위해 CMakeLists.txt를 만듭니다.
청강대 특강
프로젝트 제대로 해보기
# Target name
set(target UnitTests)
# Includes
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# Sources
file(GLOB_RECURSE sources
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# Build executable
add_executable(${target}
${sources})
# Project options
target_compile_definitions(${target}
PRIVATE
RESOURCES_DIR="${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/"
)
# Link libraries
target_link_libraries(${target}
PRIVATE
${DEFAULT_LINKER_OPTIONS}
Hearthstonepp
gtest)
테스트
• 단위 테스트 코드를 만들 차례입니다. main() 함수부터 만들어 봅시다.
청강대 특강
프로젝트 제대로 해보기
#include "gtest/gtest.h"
int main(int argc, char* argv[])
{
::testing::InitGoogleTest(&argc, argv);
int ret = RUN_ALL_TESTS();
return ret;
}
테스트
• 기능별로 정상 동작하는지 확인하기 위해 단위 테스트 코드를 작성해 봅시다.
청강대 특강
프로젝트 제대로 해보기
TEST(TestCards, GetAllCards)
{
const std::vector<Card*> cards1 = Cards::GetInstance()->GetAllCards();
ASSERT_FALSE(cards1.empty());
EXPECT_EQ(5216, (int)cards1.size());
}
TEST(TestCards, FindCardByID)
{
const Card* card1 = Cards::GetInstance()->FindCardByID("AT_001");
const Card* card2 = Cards::GetInstance()->FindCardByID("");
EXPECT_EQ("AT_001", card1->id);
EXPECT_EQ(nullptr, card2);
}
테스트
• 테스트 코드를 모두 작성했다면, 모두 통과하는지 확인해 봅시다.
만약 통과하지 못했다면 테스트 코드나 작성한 코드에 문제가 있다는 겁니다.
청강대 특강
프로젝트 제대로 해보기
코드 커버리지
• 여러분이 작성한 코드 중에서 얼마나 많은 부분을 단위 테스트하고 있을까요?
테스트를 진행할 때 코드가 얼마나 실행되었는지를 나타내는 지표를
코드 커버리지(Code Coverage)라고 합니다.
청강대 특강
프로젝트 제대로 해보기
int foo(int x, int y)
{
int z = 0;
if ((x > 0) && (y > 0))
{
z = x;
}
return z;
}
foo(1, 1)을 호출할 때와
foo(0, 1)을 호출할 때 다른 점이 무엇일까요?
https://en.wikipedia.org/wiki/Code_coverage
코드 커버리지
• 언어에 따라 코드 커버리지를 검사하는 툴들이 있습니다.
• Cobertura
• CppUnit
• lcov/gcov
• Coverage.py
• pytest
• 여기서는 lcov를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
코드 커버리지
• lcov : http://ltp.sourceforge.net/coverage/lcov.php
청강대 특강
프로젝트 제대로 해보기
코드 커버리지
• lcov 사용 방법
청강대 특강
프로젝트 제대로 해보기
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j 8
lcov -c -i -d Tests/UnitTests -o base.info
bin/UnitTests
lcov -c -d Tests/UnitTests -o test.info
lcov -a base.info -a test.info -o coverage.info
lcov -r coverage.info '/usr/*' -o coverage.info
lcov -r coverage.info '*/Libraries/*' -o coverage.info
lcov -r coverage.info '*/Programs/*' -o coverage.info
lcov -r coverage.info '*/Tests/*' -o coverage.info
lcov -r coverage.info '*/Tools/*' -o coverage.info
lcov -l coverage.info
genhtml coverage.info -o out
코드 커버리지
• 페이지를 확인해 보면 폴더별로 커버리지 결과를 볼 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
코드 커버리지
• 좀 더 시각화된 결과를 보고 싶다면 Codecov와 같은 툴과 연동하면 됩니다.
• Codecov : https://codecov.io/
청강대 특강
프로젝트 제대로 해보기
코드 리뷰
• 테스트까지 잘 통과하니, 이제 끝!? => 코드 리뷰를 해야 합니다.
• 코드 리뷰를 하는 이유
• 게임은 여러 시스템과 컨텐츠가 서로 상호 작용하는 프로그램입니다.
• 내가 새로 구현하거나 변경한 코드로 인해 다른 곳에 영향을 줄 수 있습니다.
• 내가 작성한 코드로 인해 발생할 수 있는 버그나 오류를 미리 막을 수 있습니다.
• 내가 코드를 바라보는 시각과 다른 사람이 바라보는 시각은 다를 수 있습니다.
• 다른 사람의 피드백을 통해 프로그래밍 실력을 발전시킬 수 있는 좋은 기회이기도 합니다.
청강대 특강
프로젝트 제대로 해보기
코드 리뷰
• 내가 작성한 코드를 머지하기 전에 무엇을 추가하거나 변경했는지 작성합니다.
이 때 어떤 작업을 했는지 자세하게 적어주면 좋습니다.
청강대 특강
프로젝트 제대로 해보기
코드 리뷰
• 작성을 완료했다면 코드 리뷰할 담당자를 지정합니다.
청강대 특강
프로젝트 제대로 해보기
코드 리뷰
• 코드 리뷰 담당자가 내가 작성한 코드를 살펴보고 피드백을 해줍니다.
이를 통해 미래에 발생할 수 있는 버그나 오류를 미리 막을 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
코드 리뷰
• 피드백을 모두 반영했다면 코드 리뷰 담당자가 다시 한 번 살펴봅니다.
수정 내역을 확인하고 문제가 없으면 코드 리뷰를 통과했다고 처리합니다.
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 코드 리뷰를 하더라도 세부 사항을 모두 보기에는 한계가 있습니다.
• 보통 크래시가 날 수 있는 부분이나 NULL 포인터 체크 위주로 살펴봅니다.
• 새로운 컨텐츠를 만드는 경우 구현 로직은 보통 담당자가 책임지는 경우가 많습니다.
(모든 컨텐츠 기획을 이해하면서 코드를 살펴보기에는 시간이 너무 많이 듭니다.)
• 내가 짠 코드는 잘 짠 코드일까요?
• 대학생이던 시절에도, 지금도 항상 하고 있는 생각입니다.
• 누군가 확인해줬으면 좋겠는데 부탁할 사람이 없습니다.
• 그렇다면 어떻게 해야 할까요?
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 세상에는 코드 품질을 측정해주는 좋은 툴들이 많이 있습니다.
• ReSharper Ultimate
• CodeClimate
• Codebeat
• Codacy
• Scrutinizer
• LGTM
• 여기서는 Codacy와 LGTM을 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
코드 품질
• Codacy : https://www.codacy.com/
청강대 특강
프로젝트 제대로 해보기
코드 품질
• Github 계정으로 로그인한 뒤 프로젝트를 추가하면 빌드를 진행합니다.
(설정 파일을 따로 추가할 필요가 없다는 게 장점!)
빌드가 되면 코드 품질을 측정해 등급과 이슈 개수를 보여줍니다.
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 프로젝트를 클릭해서 들어가면 이슈를 몇 가지 항목으로 분류합니다.
(보안, 코드 스타일, 호환성, 사용하지 않는 코드, 성능 등)
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 이슈를 하나씩 살펴보고 싶다면 각 항목을 클릭하면 됩니다.
이제 내 코드에 어떤 성능 문제가 있는지 확인할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
코드 품질
• LGTM : https://lgtm.com/
청강대 특강
프로젝트 제대로 해보기
코드 품질
• Github 계정으로 로그인한 뒤 프로젝트를 추가하면 빌드를 진행합니다.
Hearthstone++의 경우 빌드하기 위해 별도의 설정 파일을 추가해야 합니다.
(별도의 설정 파일 없이 빌드가 되는 경우도 있습니다.)
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 최상위 경로에 .lgtm.yml 파일을 만들고 다음과 같이 작성합니다.
(자세한 내용은 https://lgtm.com/help/lgtm/lgtm.yml-configuration-file 참고)
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 이제 LGTM이 빌드를 하고 나서 프로젝트의 코드 품질을 분석합니다.
분석이 끝나면 언어별로 등급이 나오고 프로젝트의 상대적 위치를 보여줍니다.
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 파일별로 코드의 어느 부분이 어떤 문제를 갖고 있는지를 확인할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
코드 품질
• 툴마다 지원하는 언어가 서로 다르므로 확인한 뒤 선택하는 게 좋습니다.
• 툴마다 기능이 다르기 때문에 두 가지 이상의 툴을 사용하기를 권장합니다.
• 프로젝트에 따라 설정 파일을 따로 만들어야 할 수도 있습니다.
설정 파일을 만드는 방법은 각 툴의 도움말을 참고하기 바랍니다.
청강대 특강
프로젝트 제대로 해보기
문서화
• 내가 새로 만든 기능을 나중에 다른 사람이 사용하거나 수정할 수 있습니다.
내가 새로 만든 컨텐츠를 나중에 다른 사람이 유지보수 할 수 있습니다.
• 다른 사람이 만들어 놓은 기능이나 컨텐츠의 구현 코드를 파악하기 위해서는
꽤 많은 시간이 걸립니다. (몇 달 전에 내가 짠 코드도 다시 보면 기억이…)
• 따라서 다음에 작업할 사람을 위해 단서, 힌트를 남겨두면 좋습니다.
• 작업 내용을 정리한 문서
• 가독성 있는 코드
• 구현 코드의 이해를 돕기 위한 주석
청강대 특강
프로젝트 제대로 해보기
문서화
• 언어에 따라 주석문을 모아 문서로 만들어 주는 툴들이 있습니다.
• Doxygen
• Sphinx
• Javadoc
• pydoc
• 여기서는 Doxygen을 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
문서화
• Doxygen : http://www.doxygen.nl/
청강대 특강
프로젝트 제대로 해보기
문서화
• Downloads에서 각 플랫폼에 해당하는 설치 파일을 다운로드받아 설치합니다.
청강대 특강
프로젝트 제대로 해보기
문서화
• 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다.
• 주석 스타일을 다음 중 하나를 선택해 사용해야 합니다.
• JavaDoc 스타일
/**
* ... text ...
*/
• Qt 스타일
/*!
* ... text ...
*/
청강대 특강
프로젝트 제대로 해보기
문서화
• 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다.
• 주석 스타일을 다음 중 하나를 선택해 사용해야 합니다.
• C++ 주석 뒤에 /나 !를 붙임
///
/// ... text ...
///
또는
//!
//! ... text ...
//!
청강대 특강
프로젝트 제대로 해보기
문서화
• 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다.
• 몇 가지 특별한 명령을 사용해 클래스, 함수의 매개 변수, 반환 값 등을 지정해줘야 합니다.
(자세한 내용은 http://www.stack.nl/~dimitri/doxygen/manual/index.html 참고)
• class Test : 클래스 Test
• struct Test : C 구조체 Test
• enum Test : 열거체 Test
• fn Test : 함수 Test
• param Test : 매개 변수 Test
• return Test : 반환 값 Test
• namespace Test : 네임스페이스 Test
청강대 특강
프로젝트 제대로 해보기
문서화
• 문서화를 위한 코드 예시
청강대 특강
프로젝트 제대로 해보기
//!
//! brief Account class.
//!
//! This class stores user information such as e-mail address and nickname.
//! Also, it stores a list of decks. A user can construct several decks.
//!
class Account
{
public:
//! Constructs anonymous account.
Account();
//! Constructs account with given p email and p nickname.
//! param email E-mail address of user.
//! param nickname Nickname of user.
Account(std::string&& email, std::string&& nickname);
문서화
• 문서를 만들 준비가 끝났다면 Doxywizard로 doxyfile을 만들어 봅시다.
청강대 특강
프로젝트 제대로 해보기
문서화
• 문서를 만들 준비가 끝났다면 Doxywizard로 doxyfile을 만들어 봅시다.
• Project name : 프로젝트 이름
• Project version or id : 프로젝트 버전
• Source code directory : 소스 코드가 있는 위치
• Destination directory : 문서를 출력할 위치
청강대 특강
프로젝트 제대로 해보기
문서화
• 모든 정보를 입력했다면 Run 탭에서 Run doxygen 버튼을 누르면 됩니다.
청강대 특강
프로젝트 제대로 해보기
문서화
• 짜잔! 문서가 만들어졌습니다.
청강대 특강
프로젝트 제대로 해보기
마치며
• 오늘 설명한 것들을 모두 적용한 결과
청강대 특강
프로젝트 제대로 해보기
마치며
• 프로젝트를 제대로 만들면 완성도가 높아집니다.
• 완성도 높은 프로젝트는 여러 사람들에게 좋은 평가를 받습니다.
• 포트폴리오로 충분히 활용할 수 있습니다.
• 회사에 입사하고 나서 훨씬 빠르게 적응할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
감사합니다
utilForever@gmail.com
http://github.com/utilForever

More Related Content

What's hot

NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architectureJongwon Kim
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
고대특강 게임 프로그래머의 소양
고대특강   게임 프로그래머의 소양고대특강   게임 프로그래머의 소양
고대특강 게임 프로그래머의 소양Jubok Kim
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019devCAT Studio, NEXON
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018devCAT Studio, NEXON
 
개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님NAVER D2
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델Seungmo Koo
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
 
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기KWANGIL KIM
 

What's hot (20)

NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
고대특강 게임 프로그래머의 소양
고대특강   게임 프로그래머의 소양고대특강   게임 프로그래머의 소양
고대특강 게임 프로그래머의 소양
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님개발을잘하고싶어요-네이버랩스 송기선님
개발을잘하고싶어요-네이버랩스 송기선님
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
 

Similar to 청강대 특강 - 프로젝트 제대로 해보기

VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리Gyuwon Yi
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들Lee Geonhee
 
Configuration management best practices
Configuration management best practicesConfiguration management best practices
Configuration management best practicesHyunil Shin
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님NAVER D2
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼Kenu, GwangNam Heo
 
지속적인 통합
지속적인 통합지속적인 통합
지속적인 통합중선 곽
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Changyeop Kim
 
2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기Jay Park
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기CONNECT FOUNDATION
 
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재NAVER D2
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재Hankyo
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규ChangKyu Song
 
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료지원 정
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
애자일 하라
애자일 하라애자일 하라
애자일 하라진수 허
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기Sunghyouk Bae
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In ProductionMooYeol Lee
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트Chanwoong Kim
 

Similar to 청강대 특강 - 프로젝트 제대로 해보기 (20)

VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들
 
Configuration management best practices
Configuration management best practicesConfiguration management best practices
Configuration management best practices
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼
 
지속적인 통합
지속적인 통합지속적인 통합
지속적인 통합
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기
 
2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기2021년 4월 10일 개발자 이야기
2021년 4월 10일 개발자 이야기
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
 
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
 
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
애자일 하라
애자일 하라애자일 하라
애자일 하라
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트
 

More from Chris Ohk

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들Chris Ohk
 
Momenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneChris Ohk
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기Chris Ohk
 
Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Chris Ohk
 
Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Chris Ohk
 
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Chris Ohk
 
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Chris Ohk
 
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Chris Ohk
 
Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017Chris Ohk
 
Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015Chris Ohk
 
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Chris Ohk
 
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기Chris Ohk
 
[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기Chris Ohk
 
[NDC 2019] 하스스톤 강화학습 환경 개발기
[NDC 2019] 하스스톤 강화학습 환경 개발기[NDC 2019] 하스스톤 강화학습 환경 개발기
[NDC 2019] 하스스톤 강화학습 환경 개발기Chris Ohk
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features SummaryChris Ohk
 
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지Chris Ohk
 
디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게Chris Ohk
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기Chris Ohk
 
My Way, Your Way
My Way, Your WayMy Way, Your Way
My Way, Your WayChris Ohk
 

More from Chris Ohk (20)

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
 
Momenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStone
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
 
Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2
 
Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1
 
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
 
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
 
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
 
Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017
 
Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015
 
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
 
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
 
[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기
 
[NDC 2019] 하스스톤 강화학습 환경 개발기
[NDC 2019] 하스스톤 강화학습 환경 개발기[NDC 2019] 하스스톤 강화학습 환경 개발기
[NDC 2019] 하스스톤 강화학습 환경 개발기
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
 
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
 
디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게
 
[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기
 
My Way, Your Way
My Way, Your WayMy Way, Your Way
My Way, Your Way
 

청강대 특강 - 프로젝트 제대로 해보기

  • 1. “프로젝트 제대로 해보기“ Nexon Korea, Microsoft MVP 옥찬호 청강문화산업대학교 특강
  • 2. 소개 • 옥찬호 (Chris Ohk) • Nexon Korea Game Programmer • Microsoft Development Technologies MVP • 페이스북 그룹 C++ Korea 대표 • IT 전문서 집필 및 번역 다수 • 게임샐러드로 코드 한 줄 없이 게임 만들기 (2013) • 유니티 Shader와 Effect 제작 (2014) • 2D 게임 프로그래밍 (2014) • 러스트 핵심 노트 (2017) • 모던 C++ 입문 (2017)
  • 3. 시작하기 전에… • 프로젝트의 완성도를 높일 수 있는 방법을 설명합니다. • 주 내용은 프로그래머에 초점이 맞춰져 있지만, 다른 직군분들도 들으면 도움이 되는 내용도 포함되어 있습니다. • 모던 C++로 만드는 프로젝트를 기준으로 설명합니다. (Hearthstone++ : 모던 C++로 만드는 하스스톤 시뮬레이터) • 프로젝트의 성격에 따라 설정 방법이 다를 수 있습니다. 혹시 나중에 프로젝트를 구성하다가 막히는 부분이 있다면 질문해 주세요! 청강대 특강 프로젝트 제대로 해보기
  • 4. 목차 • 회사에서는 어떻게 프로젝트를 진행할까요? • 우리들의 현실 • 프로젝트 제대로 해보기 • 소스 코드 관리 / 이슈 관리 / 코드 스타일 • 지속적인 통합 / 테스트 / 코드 커버리지 • 코드 리뷰 / 코드 품질 / 문서화 • 마치며 청강대 특강 프로젝트 제대로 해보기
  • 6. 회사에서는… • 로드맵 회의 • 컨셉 회의 • 개발 시작 • 폴리싱 • 테스트 • QA • 정식 출시 청강대 특강 프로젝트 제대로 해보기
  • 8. 우리는… • 소스 코드를 USB나 이메일로 주고 받습니다. • 회의한 내용을 기록해두지 않습니다. • 코드에 버그가 있는지 없는지 알 수가 없습니다. • 코드가 정상적으로 컴파일 및 빌드되지 않습니다. • 구현한 코드가 올바르게 수행되는지 확인해보지 않습니다. • 서로 작성한 코드에 문제가 없는지 살펴보지 않습니다. • 서로 작성한 코드로 인해 충돌이 생겨 엉망진창이 됩니다. 청강대 특강 프로젝트 제대로 해보기
  • 9. 프로젝트 제대로 해보기 한 번 하더라도 제대로 해보자!
  • 10. 소스 코드 관리 • 이메일 / USB / 구글 드라이브로 코드 공유는 이제 그만! • 서로 다른 코드로 작업할 가능성이 매우 높습니다. • 이로 인해 코드가 충돌할 수 있으며 해결하기 매우 어렵습니다. • 갱신한 코드에 버그가 생겨 이전 버전으로 되돌려야 할 때 고치기 어렵습니다. • 분산 버전 관리 시스템을 사용합시다. • Git : https://git-scm.com/ • Git을 배울 수 있는 사이트들 • https://try.github.io/ • https://rogerdudler.github.io/git-guide/index.ko.html • https://opentutorials.org/course/1492 청강대 특강 프로젝트 제대로 해보기
  • 11. 소스 코드 관리 • Git을 사용하면 무엇이 좋을까요? 청강대 특강 프로젝트 제대로 해보기
  • 12. 소스 코드 관리 • 프로젝트를 관리하려면 Git을 사용해 명령을 내려야 합니다. • Git 저장소 만들기 : git init • 기존 저장소를 Clone하기 : git clone • 파일의 상태 확인하기 : git status • 파일을 새로 추적하기 : git add • 변경 사항 커밋하기 : git commit • 파일을 삭제하기 : git rm • 변경된 내용 푸시하기 : git push • 커밋 수정하기 : git commit --amend • ... 청강대 특강 프로젝트 제대로 해보기
  • 13. 소스 코드 관리 • 명령어를 사용하는게 어렵다면 간편한 GUI 프로그램을 사용해도 됩니다. • GitHub Desktop • Sourcetree • TortoiseGit • GitKraken • Tower 청강대 특강 프로젝트 제대로 해보기
  • 14. 소스 코드 관리 • Git을 사용하는 프로젝트를 지원하는 협업 플랫폼 3대장 • GitHub • Bitbucket • GitLab • 여기서는 GitHub를 사용해보도록 하겠습니다. 청강대 특강 프로젝트 제대로 해보기
  • 15. 소스 코드 관리 • GitHub : https://github.com/ 청강대 특강 프로젝트 제대로 해보기
  • 16. 소스 코드 관리 • 프로젝트의 소스 코드를 저장하기 위한 저장소를 만들어 봅시다. 청강대 특강 프로젝트 제대로 해보기
  • 17. 소스 코드 관리 • 짜잔~ 우리만의 소스 코드 저장소가 생겼습니다. 짝짝! 청강대 특강 프로젝트 제대로 해보기
  • 18. 이슈 관리 • 새로 개발하는 기능과 버그 수정 등 모든 사항들은 반드시 기록해야 합니다. • 나중에 새로 구현한 기능에서 버그가 발생했을 때 개발 과정을 추적할 수 있습니다. • 버그를 수정했는데 다른 버그가 발생했을 때 이전 버그 수정 과정을 추적할 수 있습니다. • 기능을 개선하는 작업을 맡았을 때 기능을 개발한 사람이 없을 수도 있습니다. • 이슈를 관리할 수 있는 서비스들이 있습니다. • JIRA • Redmine • Trac • Mantis 청강대 특강 프로젝트 제대로 해보기
  • 19. 이슈 관리 • GitHub의 Issues를 사용해 관리할 수도 있습니다. 청강대 특강 프로젝트 제대로 해보기
  • 20. 이슈 관리 • 이슈를 작성할 때는 어떤 작업인지 자세히 기록합니다. 청강대 특강 프로젝트 제대로 해보기
  • 21. 이슈 관리 • 이슈 진행 상황은 댓글을 통해 작성합니다. 청강대 특강 프로젝트 제대로 해보기
  • 22. 코드 스타일 • 프로그래머들의 영원한 난제 청강대 특강 프로젝트 제대로 해보기 if (showHelp) { std::cout << ToString(parser) << 'n'; exit(EXIT_SUCCESS); } if (showHelp) { std::cout << ToString(parser) << 'n'; exit(EXIT_SUCCESS); } vs
  • 23. 코드 스타일 • 코드 스타일에 정답이란 없습니다. (물론 언어 차원에서 스타일을 정하는 경우도 있습니다.) • 회사에서는 팀마다 코드 스타일을 정해두고 사용합니다. • 들여쓰기를 할 때 탭을 쓸 것이냐 공백 문자를 쓸 것이냐 • 중괄호는 같은 줄에서 열 것이냐 다음 줄에서 열 것이냐 • if 문 뒤에 공백 문자를 넣을 것이냐 말 것이냐 • 코드 스타일을 정하는 이유 • 프로그래머마다 선호하는 코드 스타일이 다릅니다. • 따라서 통일된 코드 스타일을 사용하지 않으면 가독성이 떨어집니다. 청강대 특강 프로젝트 제대로 해보기
  • 24. 코드 스타일 • 큰 회사들은 나름대로의 코드 스타일 가이드 문서를 정립합니다. • Google C++ Style Guide • C++ Core Guidelines • CMU C++ Coding Standard • ROS C++ Style Guide • LLVM Coding Standards • 위 코드 스타일 문서를 참고해서 팀에 적용해도 됩니다. 하지만 우리만의 코드 스타일을 만들고 싶다면 어떻게 해야 할까요? 청강대 특강 프로젝트 제대로 해보기
  • 25. 코드 스타일 • C++에서는 clang-format을 사용해 코드 스타일을 지정할 수 있습니다. (자세한 내용은 https://clang.llvm.org/docs/ClangFormatStyleOptions.html 참고) 청강대 특강 프로젝트 제대로 해보기 --- Language: Cpp # BasedOnStyle: Google AccessModifierOffset: -3 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlinesLeft: true AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: true ...
  • 26. 코드 스타일 • C++에서는 clang-format을 사용해 코드 스타일을 지정할 수 있습니다 (자세한 내용은 https://clang.llvm.org/docs/ClangFormatStyleOptions.html 참고) 청강대 특강 프로젝트 제대로 해보기 if (showHelp) { std::cout << ToString(parser) << 'n'; exit(EXIT_SUCCESS); } if (showHelp) { std::cout << ToString(parser) << 'n'; exit(EXIT_SUCCESS); } AfterControlStatement: true AfterControlStatement: false
  • 27. 지속적인 통합 • 이런 일 겪어본 적 없나요? • 정상적으로 빌드되는 프로젝트에 팀원 A가 작업을 하기 시작합니다. • 팀원 A는 작업을 완료하지 않은 상태에서 프로젝트에 코드를 커밋합니다. • 프로젝트는 컴파일 오류로 인해 빌드되지 않습니다. • 이 상태에서 팀원 B가 작업을 하기 위해 프로젝트 코드를 갱신합니다. • 팀원 B는 프로젝트가 빌드되지 않아 당황합니다. • 팀원 A가 작업을 완료하기 전까지 팀원 B는 작업을 할 수 없습니다. 청강대 특강 프로젝트 제대로 해보기
  • 28. 지속적인 통합 • 지속적인 통합(Continuous Integration)은 이전과 같은 문제점을 해결하기 위해 개발 팀원들이 작성한 코드를 최대한 자주 통합하는 소프트웨어 개발 실천법입니다. • 지속적인 통합의 장점 • 자동화를 통해 수시로 통합할 수 있으며, 문제를 조기에 발견하고 조치할 수 있습니다. • 코드와 테스트를 개인 환경과 독립적으로 구성할 수 있습니다. 즉, 개발자가 코드를 수정하고 커밋하지 않아 개인 환경에서만 빌드되는 문제를 조기에 수정할 수 있습니다. • 다른 개발자가 수정한 내용을 자동으로 빌드하고 통합 테스트를 진행할 수 있습니다. 청강대 특강 프로젝트 제대로 해보기 http://12bme.tistory.com/151
  • 29. 지속적인 통합 • 플랫폼에 따라 지속적인 통합을 지원하는 서비스들이 있습니다. • App Center • Travis CI • CircleCI • AppVeyor • Jenkins • Bamboo • 여기서는 Travis CI와 AppVeyor를 사용해보도록 하겠습니다. 청강대 특강 프로젝트 제대로 해보기
  • 30. 지속적인 통합 • Travis CI : https://travis-ci.org/ (Linux와 macOS 지원) 청강대 특강 프로젝트 제대로 해보기
  • 31. 지속적인 통합 • GitHub 계정으로 로그인한 뒤 새 프로젝트를 추가합니다. 청강대 특강 프로젝트 제대로 해보기
  • 32. 지속적인 통합 • 최상위 경로에 .travis.yml 파일을 만들고 다음과 같이 작성합니다. (자세한 내용은 https://docs.travis-ci.com/user/customizing-the-build/ 참고) 청강대 특강 프로젝트 제대로 해보기 language: cpp matrix: include: # Test Docker based on Ubuntu 18.04 LTS + gcc - os: linux dist: trusty sudo: required services: docker script: - sh Scripts/travis_build_docker.sh # Test OS X 10.12 + Xcode 9 + clang - os: osx osx_image: xcode9 compiler: clang script: - sh Scripts/travis_build.sh
  • 33. 지속적인 통합 청강대 특강 프로젝트 제대로 해보기 before_install: - eval "${MATRIX_EVAL}" - if [ $TRAVIS_OS_NAME == linux ]; then sudo apt-get update -qq; sudo apt-get install -y --no-install-recommends xorg-dev libglu1-mesa-dev; sudo apt-get install -y --no-install-recommends libxrandr-dev libxi-dev libxxf86vm-dev libxinerama-dev libxcursor-dev lcov; sudo apt-get install -y --no-install-recommends libopenal-dev libvorbis-dev libflac-dev; wget https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip; unzip glfw-3.2.1.zip && cd glfw-3.2.1; cmake -DBUILD_SHARED_LIBS=true -DGLFW_BUILD_EXAMPLES=false -DGLFW_BUILD_TESTS=false -DGLFW_BUILD_DOCS=false .; sudo make -j $CPU_NUM install && cd ..; fi - if [ $TRAVIS_OS_NAME == osx ]; then brew update; brew install openal-soft; brew install glfw3; brew install lcov; wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz; tar xvf release-1.8.0.tar.gz; cd googletest-release-1.8.0; cmake .; sudo make -j $CPU_NUM install && cd ..; fi after_success: - bash <(curl -s https://codecov.io/bash)
  • 34. 지속적인 통합 • 이제 코드를 커밋하거나 풀 리퀘스트를 할 때마다 프로젝트가 자동 빌드됩니다. 청강대 특강 프로젝트 제대로 해보기
  • 35. 지속적인 통합 • AppVeyor : https://www.appveyor.com/ (Windows와 Linux 지원) 청강대 특강 프로젝트 제대로 해보기
  • 36. 지속적인 통합 • GitHub 계정으로 로그인한 뒤 새 프로젝트를 추가합니다. 청강대 특강 프로젝트 제대로 해보기
  • 37. 지속적인 통합 • 최상위 경로에 appveyor.yml 파일을 만들고 다음과 같이 작성합니다. (자세한 내용은 https://www.appveyor.com/docs/build-configuration/ 참고) 청강대 특강 프로젝트 제대로 해보기 version: 0.3 ({build}) skip_branch_with_pr: true os: - Visual Studio 2017 platform: - x64 configuration: - Release clone_folder: C:Hearthstonepp install: - git submodule update --init - ps: $env:CMAKE_GENERATOR = "Visual Studio 15 2017 Win64" before_build: - md C:Hearthstoneppbuild - cd C:Hearthstoneppbuild - cmake .. -G "%CMAKE_GENERATOR%" build: project: C:HearthstoneppbuildHearthstonepp.sln parallel: true verbosity: normal after_build: - C:HearthstoneppbuildbinReleaseUnitTests.exe
  • 38. 지속적인 통합 • 이제 코드를 커밋하거나 풀 리퀘스트를 할 때마다 프로젝트가 자동 빌드됩니다. 청강대 특강 프로젝트 제대로 해보기
  • 39. 테스트 • 새로 작성하거나 수정한 코드가 성공적으로 빌드되었나요? 빌드만 된다고 해서 끝난 게 아닙니다. 반드시 테스트를 해야 합니다. • 테스트를 하는 이유 • 내가 원했던 동작과 실제 동작이 일치하는 지 확인할 수 있습니다. • 나중에 코드가 수정되었을 때 나머지 동작에 영향이 없는지를 확인할 수 있습니다. • 비정상적인 데이터가 입력되었을 때 어떻게 처리할 지 고려할 수 있습니다. 청강대 특강 프로젝트 제대로 해보기
  • 40. 테스트 • 테스트의 분류 • 단위 테스트 (Unit Test) : 분리된 기능에 대한 검증으로 단위 테스트 프레임워크를 이용해 개발자가 테스트합니다. • 통합 테스트 (Integration Test) : 컴포넌트간의 상호 작용에 대한 검증으로 테스트 입력 값을 만들어 실행한 후 결과를 확인합니다. • 시스템 테스트 (System Test) : 전체 시스템 동작에 대한 검증으로 시스템 속도 측정, 정확한 데이터 처리 확인, 성공률과 실패율 확인 등이 있습니다. • 인수 테스트 (Acceptance Test) : 사용자 요구 사항 처리에 대한 검증으로 사용자가 요구 기능을 입력하고 기능이 정확하게 수행하는지 확인합니다. • 여기서는 단위 테스트를 해보도록 하겠습니다. 청강대 특강 프로젝트 제대로 해보기 https://www.oss.kr/info_test/show/2ca348d0-d597-4606-971e-4bdc91bed442
  • 41. 테스트 • C++에서 많이 사용하는 단위 테스트 프레임워크는 다음과 같습니다. • Boost.Test • googletest • Catch • 여기서는 googletest를 사용해보도록 하겠습니다. 청강대 특강 프로젝트 제대로 해보기
  • 42. 테스트 • googletest : https://github.com/google/googletest 청강대 특강 프로젝트 제대로 해보기
  • 43. 테스트 • Github 프로젝트에 googletest 프레임워크를 추가하는 방법 • git submodule add <저장소 주소> <저장할 위치> 예) git submodule add https://github.com/google/googletest Librariesgoogletest 청강대 특강 프로젝트 제대로 해보기
  • 44. 테스트 • 먼저 프로젝트 설정을 위해 CMakeLists.txt를 만듭니다. 청강대 특강 프로젝트 제대로 해보기 # Target name set(target UnitTests) # Includes include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # Sources file(GLOB_RECURSE sources ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) # Build executable add_executable(${target} ${sources}) # Project options target_compile_definitions(${target} PRIVATE RESOURCES_DIR="${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/" ) # Link libraries target_link_libraries(${target} PRIVATE ${DEFAULT_LINKER_OPTIONS} Hearthstonepp gtest)
  • 45. 테스트 • 단위 테스트 코드를 만들 차례입니다. main() 함수부터 만들어 봅시다. 청강대 특강 프로젝트 제대로 해보기 #include "gtest/gtest.h" int main(int argc, char* argv[]) { ::testing::InitGoogleTest(&argc, argv); int ret = RUN_ALL_TESTS(); return ret; }
  • 46. 테스트 • 기능별로 정상 동작하는지 확인하기 위해 단위 테스트 코드를 작성해 봅시다. 청강대 특강 프로젝트 제대로 해보기 TEST(TestCards, GetAllCards) { const std::vector<Card*> cards1 = Cards::GetInstance()->GetAllCards(); ASSERT_FALSE(cards1.empty()); EXPECT_EQ(5216, (int)cards1.size()); } TEST(TestCards, FindCardByID) { const Card* card1 = Cards::GetInstance()->FindCardByID("AT_001"); const Card* card2 = Cards::GetInstance()->FindCardByID(""); EXPECT_EQ("AT_001", card1->id); EXPECT_EQ(nullptr, card2); }
  • 47. 테스트 • 테스트 코드를 모두 작성했다면, 모두 통과하는지 확인해 봅시다. 만약 통과하지 못했다면 테스트 코드나 작성한 코드에 문제가 있다는 겁니다. 청강대 특강 프로젝트 제대로 해보기
  • 48. 코드 커버리지 • 여러분이 작성한 코드 중에서 얼마나 많은 부분을 단위 테스트하고 있을까요? 테스트를 진행할 때 코드가 얼마나 실행되었는지를 나타내는 지표를 코드 커버리지(Code Coverage)라고 합니다. 청강대 특강 프로젝트 제대로 해보기 int foo(int x, int y) { int z = 0; if ((x > 0) && (y > 0)) { z = x; } return z; } foo(1, 1)을 호출할 때와 foo(0, 1)을 호출할 때 다른 점이 무엇일까요? https://en.wikipedia.org/wiki/Code_coverage
  • 49. 코드 커버리지 • 언어에 따라 코드 커버리지를 검사하는 툴들이 있습니다. • Cobertura • CppUnit • lcov/gcov • Coverage.py • pytest • 여기서는 lcov를 사용해보도록 하겠습니다. 청강대 특강 프로젝트 제대로 해보기
  • 50. 코드 커버리지 • lcov : http://ltp.sourceforge.net/coverage/lcov.php 청강대 특강 프로젝트 제대로 해보기
  • 51. 코드 커버리지 • lcov 사용 방법 청강대 특강 프로젝트 제대로 해보기 mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Debug make -j 8 lcov -c -i -d Tests/UnitTests -o base.info bin/UnitTests lcov -c -d Tests/UnitTests -o test.info lcov -a base.info -a test.info -o coverage.info lcov -r coverage.info '/usr/*' -o coverage.info lcov -r coverage.info '*/Libraries/*' -o coverage.info lcov -r coverage.info '*/Programs/*' -o coverage.info lcov -r coverage.info '*/Tests/*' -o coverage.info lcov -r coverage.info '*/Tools/*' -o coverage.info lcov -l coverage.info genhtml coverage.info -o out
  • 52. 코드 커버리지 • 페이지를 확인해 보면 폴더별로 커버리지 결과를 볼 수 있습니다. 청강대 특강 프로젝트 제대로 해보기
  • 53. 코드 커버리지 • 좀 더 시각화된 결과를 보고 싶다면 Codecov와 같은 툴과 연동하면 됩니다. • Codecov : https://codecov.io/ 청강대 특강 프로젝트 제대로 해보기
  • 54.
  • 55. 코드 리뷰 • 테스트까지 잘 통과하니, 이제 끝!? => 코드 리뷰를 해야 합니다. • 코드 리뷰를 하는 이유 • 게임은 여러 시스템과 컨텐츠가 서로 상호 작용하는 프로그램입니다. • 내가 새로 구현하거나 변경한 코드로 인해 다른 곳에 영향을 줄 수 있습니다. • 내가 작성한 코드로 인해 발생할 수 있는 버그나 오류를 미리 막을 수 있습니다. • 내가 코드를 바라보는 시각과 다른 사람이 바라보는 시각은 다를 수 있습니다. • 다른 사람의 피드백을 통해 프로그래밍 실력을 발전시킬 수 있는 좋은 기회이기도 합니다. 청강대 특강 프로젝트 제대로 해보기
  • 56. 코드 리뷰 • 내가 작성한 코드를 머지하기 전에 무엇을 추가하거나 변경했는지 작성합니다. 이 때 어떤 작업을 했는지 자세하게 적어주면 좋습니다. 청강대 특강 프로젝트 제대로 해보기
  • 57. 코드 리뷰 • 작성을 완료했다면 코드 리뷰할 담당자를 지정합니다. 청강대 특강 프로젝트 제대로 해보기
  • 58. 코드 리뷰 • 코드 리뷰 담당자가 내가 작성한 코드를 살펴보고 피드백을 해줍니다. 이를 통해 미래에 발생할 수 있는 버그나 오류를 미리 막을 수 있습니다. 청강대 특강 프로젝트 제대로 해보기
  • 59. 코드 리뷰 • 피드백을 모두 반영했다면 코드 리뷰 담당자가 다시 한 번 살펴봅니다. 수정 내역을 확인하고 문제가 없으면 코드 리뷰를 통과했다고 처리합니다. 청강대 특강 프로젝트 제대로 해보기
  • 60. 코드 품질 • 코드 리뷰를 하더라도 세부 사항을 모두 보기에는 한계가 있습니다. • 보통 크래시가 날 수 있는 부분이나 NULL 포인터 체크 위주로 살펴봅니다. • 새로운 컨텐츠를 만드는 경우 구현 로직은 보통 담당자가 책임지는 경우가 많습니다. (모든 컨텐츠 기획을 이해하면서 코드를 살펴보기에는 시간이 너무 많이 듭니다.) • 내가 짠 코드는 잘 짠 코드일까요? • 대학생이던 시절에도, 지금도 항상 하고 있는 생각입니다. • 누군가 확인해줬으면 좋겠는데 부탁할 사람이 없습니다. • 그렇다면 어떻게 해야 할까요? 청강대 특강 프로젝트 제대로 해보기
  • 61. 코드 품질 • 세상에는 코드 품질을 측정해주는 좋은 툴들이 많이 있습니다. • ReSharper Ultimate • CodeClimate • Codebeat • Codacy • Scrutinizer • LGTM • 여기서는 Codacy와 LGTM을 사용해보도록 하겠습니다. 청강대 특강 프로젝트 제대로 해보기
  • 62. 코드 품질 • Codacy : https://www.codacy.com/ 청강대 특강 프로젝트 제대로 해보기
  • 63. 코드 품질 • Github 계정으로 로그인한 뒤 프로젝트를 추가하면 빌드를 진행합니다. (설정 파일을 따로 추가할 필요가 없다는 게 장점!) 빌드가 되면 코드 품질을 측정해 등급과 이슈 개수를 보여줍니다. 청강대 특강 프로젝트 제대로 해보기
  • 64. 코드 품질 • 프로젝트를 클릭해서 들어가면 이슈를 몇 가지 항목으로 분류합니다. (보안, 코드 스타일, 호환성, 사용하지 않는 코드, 성능 등) 청강대 특강 프로젝트 제대로 해보기
  • 65. 코드 품질 • 이슈를 하나씩 살펴보고 싶다면 각 항목을 클릭하면 됩니다. 이제 내 코드에 어떤 성능 문제가 있는지 확인할 수 있습니다. 청강대 특강 프로젝트 제대로 해보기
  • 66. 코드 품질 • LGTM : https://lgtm.com/ 청강대 특강 프로젝트 제대로 해보기
  • 67. 코드 품질 • Github 계정으로 로그인한 뒤 프로젝트를 추가하면 빌드를 진행합니다. Hearthstone++의 경우 빌드하기 위해 별도의 설정 파일을 추가해야 합니다. (별도의 설정 파일 없이 빌드가 되는 경우도 있습니다.) 청강대 특강 프로젝트 제대로 해보기
  • 68. 코드 품질 • 최상위 경로에 .lgtm.yml 파일을 만들고 다음과 같이 작성합니다. (자세한 내용은 https://lgtm.com/help/lgtm/lgtm.yml-configuration-file 참고) 청강대 특강 프로젝트 제대로 해보기
  • 69. 코드 품질 • 이제 LGTM이 빌드를 하고 나서 프로젝트의 코드 품질을 분석합니다. 분석이 끝나면 언어별로 등급이 나오고 프로젝트의 상대적 위치를 보여줍니다. 청강대 특강 프로젝트 제대로 해보기
  • 70. 코드 품질 • 파일별로 코드의 어느 부분이 어떤 문제를 갖고 있는지를 확인할 수 있습니다. 청강대 특강 프로젝트 제대로 해보기
  • 71. 코드 품질 • 툴마다 지원하는 언어가 서로 다르므로 확인한 뒤 선택하는 게 좋습니다. • 툴마다 기능이 다르기 때문에 두 가지 이상의 툴을 사용하기를 권장합니다. • 프로젝트에 따라 설정 파일을 따로 만들어야 할 수도 있습니다. 설정 파일을 만드는 방법은 각 툴의 도움말을 참고하기 바랍니다. 청강대 특강 프로젝트 제대로 해보기
  • 72. 문서화 • 내가 새로 만든 기능을 나중에 다른 사람이 사용하거나 수정할 수 있습니다. 내가 새로 만든 컨텐츠를 나중에 다른 사람이 유지보수 할 수 있습니다. • 다른 사람이 만들어 놓은 기능이나 컨텐츠의 구현 코드를 파악하기 위해서는 꽤 많은 시간이 걸립니다. (몇 달 전에 내가 짠 코드도 다시 보면 기억이…) • 따라서 다음에 작업할 사람을 위해 단서, 힌트를 남겨두면 좋습니다. • 작업 내용을 정리한 문서 • 가독성 있는 코드 • 구현 코드의 이해를 돕기 위한 주석 청강대 특강 프로젝트 제대로 해보기
  • 73. 문서화 • 언어에 따라 주석문을 모아 문서로 만들어 주는 툴들이 있습니다. • Doxygen • Sphinx • Javadoc • pydoc • 여기서는 Doxygen을 사용해보도록 하겠습니다. 청강대 특강 프로젝트 제대로 해보기
  • 74. 문서화 • Doxygen : http://www.doxygen.nl/ 청강대 특강 프로젝트 제대로 해보기
  • 75. 문서화 • Downloads에서 각 플랫폼에 해당하는 설치 파일을 다운로드받아 설치합니다. 청강대 특강 프로젝트 제대로 해보기
  • 76. 문서화 • 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다. • 주석 스타일을 다음 중 하나를 선택해 사용해야 합니다. • JavaDoc 스타일 /** * ... text ... */ • Qt 스타일 /*! * ... text ... */ 청강대 특강 프로젝트 제대로 해보기
  • 77. 문서화 • 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다. • 주석 스타일을 다음 중 하나를 선택해 사용해야 합니다. • C++ 주석 뒤에 /나 !를 붙임 /// /// ... text ... /// 또는 //! //! ... text ... //! 청강대 특강 프로젝트 제대로 해보기
  • 78. 문서화 • 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다. • 몇 가지 특별한 명령을 사용해 클래스, 함수의 매개 변수, 반환 값 등을 지정해줘야 합니다. (자세한 내용은 http://www.stack.nl/~dimitri/doxygen/manual/index.html 참고) • class Test : 클래스 Test • struct Test : C 구조체 Test • enum Test : 열거체 Test • fn Test : 함수 Test • param Test : 매개 변수 Test • return Test : 반환 값 Test • namespace Test : 네임스페이스 Test 청강대 특강 프로젝트 제대로 해보기
  • 79. 문서화 • 문서화를 위한 코드 예시 청강대 특강 프로젝트 제대로 해보기 //! //! brief Account class. //! //! This class stores user information such as e-mail address and nickname. //! Also, it stores a list of decks. A user can construct several decks. //! class Account { public: //! Constructs anonymous account. Account(); //! Constructs account with given p email and p nickname. //! param email E-mail address of user. //! param nickname Nickname of user. Account(std::string&& email, std::string&& nickname);
  • 80. 문서화 • 문서를 만들 준비가 끝났다면 Doxywizard로 doxyfile을 만들어 봅시다. 청강대 특강 프로젝트 제대로 해보기
  • 81. 문서화 • 문서를 만들 준비가 끝났다면 Doxywizard로 doxyfile을 만들어 봅시다. • Project name : 프로젝트 이름 • Project version or id : 프로젝트 버전 • Source code directory : 소스 코드가 있는 위치 • Destination directory : 문서를 출력할 위치 청강대 특강 프로젝트 제대로 해보기
  • 82. 문서화 • 모든 정보를 입력했다면 Run 탭에서 Run doxygen 버튼을 누르면 됩니다. 청강대 특강 프로젝트 제대로 해보기
  • 83. 문서화 • 짜잔! 문서가 만들어졌습니다. 청강대 특강 프로젝트 제대로 해보기
  • 84. 마치며 • 오늘 설명한 것들을 모두 적용한 결과 청강대 특강 프로젝트 제대로 해보기
  • 85. 마치며 • 프로젝트를 제대로 만들면 완성도가 높아집니다. • 완성도 높은 프로젝트는 여러 사람들에게 좋은 평가를 받습니다. • 포트폴리오로 충분히 활용할 수 있습니다. • 회사에 입사하고 나서 훨씬 빠르게 적응할 수 있습니다. 청강대 특강 프로젝트 제대로 해보기