토요일, 6월 28, 2014

[B급 프로그래머] 소프트웨어 개발을 위한 우수 관례

Best Practices Ever for Software Development라는 글이 트위터에 올라와서 독자 여러분을 위해 간단하게 번역해봤다.

  1. 컴퓨터가 아니라 사람을 위해 프로그램을 작성하라.
    • 독자들에게 한번에 머리에 들어오는 사실을 넘어 더 많은 것을 기억하게 요구해서는 안 된다.
    • 이름은 일관성이 있고, 독특하고, 의미가 있어야 한다.
    • 코딩 스타일은 일관성이 있어야 한다.
    • 소프트웨어 개발의 모든 측면은 대략 한 시간짜리 과업 여러 개로 나눠야 한다.
  2. 반복적인 작업을 자동화하라.
    • 반복적인 작업을 컴퓨터에 의존하라.
    • 재사용을 위해 파일에 최근 명령을 저장하라.
    • 과학적인 작업 흐름을 자동화하기 위해 빌드 도구를 사용하라.
  3. 컴퓨터를 사용해 이력을 기록하라.
    • 계산 작업을 자동으로 추적하기 위해 소프트웨어 도구를 사용하라.
  4. 점진적인 변경을 가하라.
    • 잦은 피드백과 중간 궤도 변경을 곁들여 작은 단계로 나눠 일을 진행하라.
  5. 버전 관리 시스템을 사용하라.
    • 버전 관리를 사용하라.
    • 버전 관리 시스템을 사용하라.
    • 수동으로 생성하는 것은 뭐든지 버전 관리 시스템에 넣어라.
  6. 반복하지 마라(DRY).
    • 모든 자료는 시스템에서 단일 책임을 표현해야 한다.
    • 코드를 복사해서 붙이는 대신 모듈화하라.
    • 코드를 재작성하는 대신 재사용하라.
  7. 실수에 대한 계획을 세워라.
    • 연산을 점검하기 위해 프로그램에 assert를 추가하라.
    • 시중에 나와 있는 단위 테스트 라이브러리를 사용하라.
    • 프로그램을 테스트할 때 가능한 모든 수단을 사용하라.
    • 버그를 테스트 케이스로 전환하라.
    • 심벌릭 디버거를 사용하라.
  8. 제대로 동작하고 난 다음에야 소프트웨어를 최적화하라.
    • 프로파일러를 사용해 병목을 파악하라.
    • 가능한 고차원 언어를 사용해 코드를 작성하라.
  9. 동작 방식이 아니라 설계와 목적을 문서화하라.
    • 구현이 아니라 인터페이스와 이유를 문서화하라.
    • 동작 방식을 설명하는 대신 코드를 리펙터링하라.
    • 소프트웨어 내부에 소프트웨어 일부로 문서를 내장하라.
  10. 공동으로 작업하라.
      합치기 전에 코드 검토를 수행하라.
    • 곤란한 특정 문제를 추적하거나 새로운 신입의 속력을 높이려 할 때는 짝 프로그래밍 기법을 사용하라.
  11. 낡은 코드를 유지보수하고 개선하라.

독자 여러분들께서 추천하는 관례는 무엇인가? 공유를 위해 댓글로 달아주시면 좋겠다.

EOB

금요일, 6월 27, 2014

[독서광] 이것이 C언어다

개인적으로 C 프로그래밍 언어를 강의해야 가르쳐야 하는 상황이라서 교재를 고민하고 있었다. 물론 독보적인 K&R표 교과서가 존재하긴 하지만 이 책으로 진도를 뽑을 경우 처음 배우는 사람들이 떡실신할 가능성이 아아주우 높기에 욕심을 꾹 참고 국내서를 검토하고 있었다. 그러다 지난 주에 한빛미디어 사무실에 방문했다가 아주 좋은 책을 한 권 선물 받았다. 오늘 소개할 책인 "이것이 C언어다"는 무려 3년에 걸쳐 만들어졌으며 목차를 보면 알겠지만 C에 처음 입문하는 장래 개발자를 위해 변수 선언부터 포인터/배열과 동적 메모리 사용에 이르기까지 균형을 잘 맞췄다는 생각이다. 표준 C에서 다뤄야 하는 내용은 빠짐없이 다 나오며, 부록에는 표준 라이브러리에 대한 간략한 소개까지 들어있다.

사람마다 추구하는 바가 다르므로 자기가 직접 집필하기 전에는 완벽한 C 책을 기대할 수는 없지만, C 언어를 배우는 과정에 필요한 요소가 빠짐없이 들어 있고 설명이 제대로 되어 있다면 그 자체로 충분한 가치를 발휘한다는 생각이다. 이 책의 특징 중 하나는 풍부한 그림이다. 코드와 설명만 계속 나오는 대신 메모리 레이아웃이 그림으로 표현되어 있으므로 C를 처음 접할 경우 가장 난해하게 다가오는 정적/동적 메모리 레이아웃이 실행 과정에서 어떻게 바뀌는지 한 눈에 들어온다.

본문에서 실습을 위해 완전히 컴파일 가능한 예제는 물론이고 각 절마다 연습 문제가 나오므로 실력을 점검할 수 있다. 출판사 공식 페이지에 들어가보면 예제 소스도 제공하므로 타이핑이 귀찮은 분이라면 내려받아 사용하면 된다. 물론 처음 배우는 입장에서는 타이핑 연습도 할 겸 C와 친해지기 위해 직접 입력하는 방식을 권장한다. 제공되는 소스 코드와 관련해 주의할 사항이 하나 있는데, 소스 코드가 UTF-8이 아니라 윈도우 인코딩 방식을 따르므로 맥/리눅스에서 한글이 제대로 안 보이고 개행문자가 DOS 방식을 따르므로 vi 등이 불평을 늘어놓을 것이다. 또한 운영체제와 아키텍처 특성으로 인해 일부 예제에서 경고 메시지와 실행 결과가 다를 수 있으므로 '이것이 C언어'(응?)라는 사실에 다시 한번 주목하면 좋겠다.

결론: C언어를 처음 배우는 분들이 처음 접하기에 적합한 책이다. 참고로 동영상 강좌 쿠폰(12개월)도 들어 있으므로 독서와 병행해 유용하게 활용하기 바란다.

간이 설문: C언어 입문자를 대상으로 공부 방향에 대한 지침을 주제로 세미나를 하면 참석할 의향이 있는지? 설명할 내용은 C 컴파일러 개괄 + gcc/gdb 기초 중의 기초 설명 + make 기초 중의 기초 설명 + C에서 가장 어려운 배열/포인터/메모리 모델(스택, 힙)/문자열 개념 소개 + 보너스로 깃허브 등 소스 코드 저장소 간략 소개다(2시간). 다뤄야 할 내용이나 방향과 관련해 댓글로 피드백을 주시면 감사하겠다.

EOB

화요일, 6월 24, 2014

[독서광] The Modern Web: 웹의 미래를 책임지는 멀티플랫폼 반응형 웹 프로그래밍

초창기 웹 기술이 전파되는 시점과 요즘 시점을 비교해보면 격세지감을 느낀다. PC뿐만 아니라 스마트폰, 스마트TV, 심지어 콘솔 게임기에도 브라우저가 장착되어 있으며, 단순한 자료 검색을 넘어 쇼핑은 물론이고 문서 작업까지도 웹 브라우저에서 수행하는 세상이 되었다. '멀티플랫폼'과 '반응형'이라는 용어는 일반화되어 흔히 들을 수 있게 되었다. 한 마디로 웹 기술이 폭발적으로 발전하고 있다. 그렇다면 이렇게 빠르게 바뀌는 세상에서 길을 잃어버리지 않으려면 어떻게 해야 하나?

에이콘 출판사에서 선물로 주신 'The Modern Web'이 (완벽하지는 않지만) 좋은 해법을 제시하고 있다. 이 책은 세부 기술에 대한 방대한 레퍼런스가 목적이 아닌 현대적인 웹 기술에 대한 소개서로 보는 편이 타당하다. 따라서, 이 책 한 권으로 신형 기술을 모두 독파하리라는 기대는 접는 편이 좋다. 하지만 현대적인 웹 기술 관점에서 무엇에 신경을 써야 하고 주의해야 하는지를 파악하고 싶다면 번지 수를 제대로 찾아온 것이다.

이 책의 특징은 다음과 같은 두 항목으로 정리가 가능하다.

  • 웹 개발 기술의 범위는 매우 방대해서 이 책 한 권에서 모두를 다룰 수는 없다. 따라서 이 책에서는 다양한 기기에 걸쳐 웹 프로젝트를 구축할 때 필요하다고 여겨지는 핵심 기법이나 기술을 위주로 다루었다.
  • 이 책에 있는 내용이 모두 폭넓게 적용될 수 있는 것은 아니다. 적어도 이 책에서 설명하는 유형은 그렇지 않다. 웹은 지속적으로 발달하고 있고, 책 출판이란 특정한 한 순간을 하나의 스냅샷으로 담는다는 것을 의미한다. 몇 가지는 변화할 것이고, 몇 가지는 쇠퇴하여 사라질 것이다.

웹 기술의 범위가 무척 넓은데다 아주 빠르게 변하고 있기에 끊임없이 호기심을 품고 공부하는 사람만이 승자가 되리라는 생각이다. 이 책의 지향점을 파악하기 위해 책 목차를 함께 보자.

  1. 웹 플랫폼: 본격적으로 시작하기 앞서 웹을 플랫폼으로 바라보는 시각을 정리한다.
  2. 구조와 시멘틱: 좋은 컨텐츠는 구조부터 제대로 잡혀 있다. HTML5를 시작으로 마이크로포맷, RDFa, 마이크로데이터라는 구조와 시멘틱 관련 표준을 소개한다.
  3. 기기 반응형 CSS: 제대로 잡힌 구조 위에서 멀티플랫폼에 대응하는 CSS 작성 방식을 설명한다. 미디어 쿼리를 시작으로 '반응형'과 '적응형' 개념의 차이와 크기가 다른 화면을 인식해 내용을 배열하는 방법을 소개한다.
  4. CSS 레이아웃에 대한 새로운 접근법: 고정된 좌표에서 벗어나게 돕기 위해 CSS 레이아웃과 관련해 다중 열, 유연한 박스, 그리드 레이아웃 기법을 소개한다.
  5. 모던 자바스크립트: 자바스크립트의 새로운 기능, 중요한 라이브러리, 호환성 격차 해서(폴리필), 디버깅 기법을 설명한다.
  6. 기기 API: 스마트폰/태블릿 등에 탑재된 센서와 주변 장비를 이용하는 API를 소개한다.
  7. 이미지와 그래픽: SVG와 캔버스를 소개한다.
  8. 새로운 폼: 구식 폼 대신 다양한 자료 유형을 인식하고 클라이언트 쪽 검증이 가능한 신형 폼을 소개한다.
  9. 멀티미디어: HTML5에서 새로 추가된 미디어 요소와 대응하는 API를 소개한다.
  10. 웹 앱: 웹 앱, 하이브리드 앱, 애플리케이션 캐시를 소개한다.
  11. 향후 전망: 앞으로 기술 추이를 전망한다.

주의 사항을 하나 언급하고 넘어가겠다. 단순한 용어와 개념 제시를 넘어서 320페이지 곳곳에 실제 HTML 코드와 대응하는 화면 예제, 자바스크립트 코드와 설명이 잘 정리되어 있으므로 쉽게 생각하고 접근했다가는 애로 사항이 꽃필 가능성이 있다. HTML 코드, CSS 코드, 자바스크립트 코드를 기본적으로 읽을 수 있어야 쉽게 따라갈 수 있다. 완전히 첫 걸음을 내딛는 초보자용 도서가 아니라는 사실에 주의해야 한다.

결론: 이 책은 큰 틀에서 기술 동향을 소개하고 있으므로 웹 퍼블리셔와 개발 담당자들이 현재 웹 기술 상태를 조감하기 위한 목적으로 읽어보면 좋겠다. 추천!

EOB

토요일, 6월 21, 2014

[B급 프로그래머] 6월 3주 소식

금주에도 풍성한 소식을 전해드려서 무척 기쁘다.

  1. 웹/앱 소식
  2. 개발/관리도구 소식
  3. 고성능 서버/데이터베이스 소식
  4. 기타 읽을거리
EOB

화요일, 6월 17, 2014

[독서광] 창문 넘어 도망친 100세 노인

1990년대 중반에 개봉한 포레스트 검프라는 영화를 알고 계신 분이 많으실테다. 우연히 20세기 미국 역사의 격변기마다 얼굴을 내미는 주인공(톰 행크스)의 이야기인데, 소설을 영화로 만들어 흥행과 비평 양쪽으로 공전의 히트를 쳤다. 그런데, 할배판 '포레스트 검프'라는 평을 듣고 있는 책이 있어 6월 연휴를 틈타 번개처럼 읽어봤다. 세계 각국에서 인기를 끌었으며 영화로도 만들어진 "창문 넘어 도망친 100세 노인"이 오늘 소개할 책이다.

이 책의 가장 큰 특징은 100세 노인의 현재 기행과 과거 경험이 절묘하게 교차 편집되며 20세기를 관통하는 데 있다. 포레스트 검프 못지 않게 알란 칼손(100세 노인)도 세계 역사의 격변기마다 얼굴을 내밀며 예상치 못한 흐름을 창조해낸다. 검프가 지능 지수가 낮다는 핸디캡이 있다면 칼손은 가족 사정상 아홉살 때 학업을 중단하고 고달픈 노동의 현장으로 뛰어들었다는 핸디캡이 있다. 하지만 특유의 낙천적이면서 질러놓고 보는 성향으로 인해 칼손은 여기저기서 사랑(응?)을 받아 수 많은 역경을 해쳐나간다.

아무래도 한국사람이다 보니 가장 흥미로웠던 부분은 한국의 김일성과 김정일을 만나는 과정에서 절대절명의 위기에 처하는 장면이었다. 북한에서 이 책이 확실히 금서로 지정될 것 같다는 생각이 들었다(스포일러 방지를 위해 자세한 설명은 생략).

마침 한국에서는 2013년 말에 만들어진 동명의 영화까지 개봉한다는 소식이 있다. 며칠 전 서점에 가보니 책 표지가 모두 영화 포스터처럼 바뀌었다는...

결론: 개인적인 일이 있어 마산에 다녀왔는데, 버스 안에서 시간 가는 줄 모르고 읽었다. 여름 휴가에 최적의 친구라는 생각!

뱀다리: 책 표지 종이를 펼쳐보기 바란다. 꼼꼼함에 놀랄지도!

EOB

토요일, 6월 14, 2014

[B급 프로그래머] (Quora) 정말로 코드 작성을 "좋아하지" 않더라도 전산을 전공해야 하나요?

Quora에 다음과 같은 질문이 올라왔다.

Should I major in computer science if I don't really "love" writing code?

한글로 번역하자면, "정말로 코드 작성을 "좋아하지" 않더라도 전산을 전공해야 하나요?"

인기를 끈 대답을 정리해보았다


당연합니다. 다음과 같이, 배울 수 있는 수 많은 지식이 존재합니다.

저도 코드 작성은 좋아하지 않지만, 전산과에 들어와서 기쁘답니다. 위에서 열거한 모든 지식을 배우게 도와주었기 때문입니다.


위에 소개한 내용이 궁금해지기 시작했는가? 그렇다면 작년에 소개한 [독서광] 미래를 바꾼 아홉 가지 알고리즘을 읽어보기 바란다. 아주 재미있고 알찬 내용이 들어있음을 보증한다.

EOB

화요일, 6월 10, 2014

[독서광] Sublime Text 따라잡기

워낙 vi에 익숙하다보니(vim도 아니고 오리지널 vi!), 솔직히 급할 때 운영체제에 기본으로 설치된 텍스트 편집기 이외에 다른 텍스트 편집기를 잘 사용하지 않는다(아, 딱 한 가지 예외로... 김성동님이 만드신 acroedit는 윈도우에서 종종 쓰곤 했었구나...). 하지만 서브라임 텍스트라는 프로그래머용 텍스트 편집기가 있다는 이야기를 듣고 맥에 설치를 했으나... 사실상 vi에 밀려 먼지만 덮어쓰고 있었다. 하지만 이제 슬슬 vi를 대신해 vi와 함께 사용하는 텍스트 편집기를 찾아봐야겠다는 생각이 들기도 한다. 이런 와중에서 출판사 놀러갔다가 선물 받은 Sublime Text 따라잡기라는 책을 번개처럼 읽은 소감을 정리해보겠다.

Sublime Text 따라잡기는 130페이지라는 짧은 분량으로 '서브라임 텍스트'라는 요즘 뜨는 편집기에 접근하기 위한 기초 지식을 빠짐없이 전달하기에 진입 장벽을 낮춰준다는 생각이 들었다. 목차를 잠시 볼까?

  1. 서브라임 텍스트 설치: 프로그램 설치에 필요한 필수적인 설명(특히 데이터 디렉터리와 패키지 컨트롤 설치하기에 주목하자)
  2. 코드 편집: 찾기와 바꾸기, 컬럼과 다중 선택, 필수 플러그인 소개, 단축키 소개(Goto Anything에 주목하자)
  3. 스니펫과 매크로, 키 바인딩: 코드 조각을 자동으로 채워넣는 스니펫, 반복 작업을 단순하게 만들어주는 매크로, 그리고 자주 쓰는 명령을 단축 키에 할당하는 키 바인딩 소개
  4. 사용자 설정과 테마 개발: 사용자 설정과 관련한 기초 지식 소개
  5. 빈티지 모드 사용: 서브라임 텍스트를 vi처럼 사용하는 방법 소개
  6. 코드 테스트: PHP, 파이썬, 루비에서 단위 테스트 수행 방법 소개
  7. 디버깅: PHP, 자바스크립트, C/C++ 디버깅 방법 소개
  8. 플러그인 개발: 간단한 루이 온 레일스 플러그인 개발

목차를 보면 알겠지만, 서브라임 텍스트를 사용하기 위해 필요한 최소한의 지식을 담고 있으므로 공력이 높은 고급 개발자가 아니라 도대체 서브라임 텍스트가 어떤 편집기인지 맛을 보고 싶은 개발자에게 적합하다. 일단 이 책을 읽고나면 LISP 해석기가 내장된 emacs 대신 파이썬 해석기가 내장된 서브라임 텍스트를 어떻게 확장하고 활용할지 감이 오리라는 생각이다. 추가로 몇 가지 유용한 정보를 공유하니 서브라임 텍스트에 관심이 많다면 읽어보면 좋겠다.

깜짝 반전: 이 글을 쓰는 시점에서 서브라임 텍스트는 공짜가 아니다. 다운로드해서 평가할 때까지만 공짜이며 계속 사용하려면 돈을 내야 한다. 따라서 회사에서 서브라임 텍스트를 사용하려는 분들께서는 각별히 주의하시기 바란다.

Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use. There is no enforced time limit for the evaluation.
EOB

토요일, 6월 07, 2014

[B급 프로그래머] (Quora) 페이스북에서 '고급' 소프트웨어 엔지니어란?

Quora에 다음과 같은 질문이 올라왔다.

What does it take to be a "Senior" Software Engineer at Facebook?

한글로 번역하자면, "페이스북에서 '고급' 소프트웨어 엔지니어란?"

인기를 끈 대답을 정리해보았다

페이스북에서 아주 영향력이 큰 끝내주는 엔지니어를 만날 때, 몇 가지 공통적인 특질을 목격했다. 이런 엔지니어들은 더 많은 자율성으로 더 많은 영향력을 미칠 만한 능력이 있는 사람으로 압축된다.

  • 남들이 풀 생각도 풀 능력도 없는 기술적인 문제를 풀 수 있다.
  • 특정 분야를 아주 깊게 파고드는 지식이 있거나 특정 영역에서 다른 영역을 건너 다니며 쉽게 문제와 씨름하며 남들과 함께 일한다.
  • 자신들의 문제를 해결할 뿐만 아니라 다른 팀이나 회사 내 더 큰 부서가 빠르고 제대로 문제를 풀 수 있게 해법이나 프레임워크를 만들어낸다(자신들의 영향력을 크게 높이는 방법을 알고 있다).
  • 씨름할 가치가 있다고 밝혀질 때까지 어려운 문제를 여러 달이나 심지어 여러 해 동안 잡고 있어도 부끄러워하지 않는다.
  • 대다수 사람들이 자신의 인생 경력에 위험이 된다고 생각하는 범위를 벗어나며 개인적인 업무 평가에 연연하지 않는다.
  • 이런 엔지니어 중 많은 사람들은 정말 뛰어난 의사 소통자이자 조직화에 능숙한 사람이지만, 의사 소통과 친밀감이 필수 요구 사항은 아닌 듯이 보인다. 몇몇 사람은 정말로 뛰어나서 분야가 좁고 어려운 문제를 혼자 푸는 역량을 갖추고 있기 때문이다.

위에서 설명한 특질은 페이스북에서 일반적으로 볼 수 있으며, 다른 첨단 기술 회사도 마찬가지다. 계속해서 사람의 성장 관점에서 독특한 페이스북 문화를 소개한다.

  • 모호하고 바뀌는 요구 사항에 재대로 대응한다. 우리 핵심 가치 중 하나는 빠르게 움직이는 것이며, 이는 여러 회사가 자신들이 어떤 일을 해야할지 문서로 만들어 내느라 여러 달을 소비하는 동안, 우리는 프로토타입으로 넘어가 반복해서 개선함을 의미한다.이는 프론트엔드 개발자들이 여러 플랫폼(웹, 안드로이드, 아이폰, 태블릿 등)에 다양한 버전을 유지할 수 있는 능력을 갖춰야 함을 의미한다. 우리가 만드는 모든 제품은 첫날부터 바로 확장 가능해야 하므로, 벡엔드 엔지니어는 새로운 제품을 빠르게 수용할 수 있는 기반 구조나 프레임워크를 만들거나 확장 가능한 해법을 잽싸게 내놓으며, 계속해서 소프트웨어가 조금씩 바뀌어 나간다는 사실을 이해해야 한다.
  • 주고받는 피드백 관점에서 직설적이다. 페이스북의 열린 문화는 어느 누구도(어느 누구라는 단어를 사용할 때 마크 주커버그도 해당한다) 일방적으로 피드백을 주기만 하지 않는다. 열리고 솔직한 피드백은 사람들이 성장하게 만든다. 최고의 엔지니어는 피드백에 기반해 성장할 영역을 인식하는 사람들이다. 권위에 붙잡혀 있는 사람들은 가까워지기 어려우며, 피드백도 제대로 받아들이지 못한다.

덧붙이자면, 비록 가끔 이 용어를 사용해야만 하는 어쩔 수 없는 상황도 있긴 하지만, 나는 "고급(senior) 엔지니어"라는 용어를 정말 싫어한다. "고급 엔지니어"라는 용어는 기술 수준과 시간이라는 함수가 연관을 맺고 있음을 암시하기 때문이다. 하지만 솔직히 말해 페이스북에는 2년도 지나지 않아 회사를 위해 가장 중요하고 도전적인 몇 가지 작업을 수행하는 사람들도 있다.

언급하고 싶은 또 다른 주제가 있다. 많은 고급 엔지니어들이 죽치고 앉아서 "여기서 최고 엔지니어가 되려면 무엇을 해야할까?"라고 생각하며 지낸다고 믿지 않는다. 대부분은 정말 공부밖에 모르는 겸손한 사람이며, 어려운 문제들이 자신들의 관심을 끌기에 늘 깨어 있다. 보통 사람들이 잠자고 있을 때 열심히 일하고 노력하며, 뭔가 잘못되었을 때 초점을 잃지 않고, 자신들의 해법에 만족할 때까지 결코 포기하지 않는다.

만일 당신이 끝내주는 엔지니어/관리자/디자이너/PM/등이 되고 싶으면, 바로 가까이에 있는 문제에 뛰어들고, 더 큰 문제에 부딪힐 수 있게 정열과 아이디어를 집중하고, 당신이 최고로 잘하는 분야가 아닌 이상 현실에 안주하지 말기 바란다.

수요일, 6월 04, 2014

[B급 프로그래머] 6월 1주 소식

애플 WWDC가 있어 금주는 조금 빨리 정리된 소식을 올려드리겠다.

  1. 웹/앱 소식
  2. 개발/관리도구 소식
  3. 고성능 서버/데이터베이스 소식
  4. 기타 읽을거리

흥미로운 소식으로 3주에 찾아뵙겠다.