- 웹/앱 소식
- 개발/관리도구 소식
- Chaos Engineering
- Linux Performance charts
- Invite friends to SSH into your laptop using their Github handle
- pipeenv - Sacred Marriage of Pipfile, Pip, & Virtualenv.
- Style guides for Google-originated open-source projects
- 애플의 새로운 파일 시스템, APFS의 모든 것
- Make Better Software의 추천 도서
- ODP: An Infrastructure for On-Demand Service Profiling
- 한시간에 만드는 대용량 로그 수집 시스템
- doctl - A command line tool for DigitalOcean services
- "OpenSSH Keys: A Walkthrough"
- JavaScript: Past, Present, Future
- Gitea - Git with a cup of tea - A painless self-hosted Git service.
- JWT brute force cracker written in C
- The Awk Programming Language (1988) [pdf]
- Hellogopher: "just clone and make" your conventional Go project
- Gatling vs. JMeter
- How quickly can you remove spaces from a string?
- Dafny is a programming language with a program verifier.
- 2016 JavaScript Rising Stars
- My Go Resolutions for 2017
- Dismissing Python Garbage Collection at Instagram
- Java 8: New features in ConcurrentHashMap
- How to add file to a previous commit?
- systemd 살펴보기
- Golang 체험기
- Grammarly for Chrome - 영작용 크롬 확장
- FlatBuffers Benchmarks(for JSON parsing)
- Standard Notes - A standard notes app with an un-standard focus on longevity, portability, and privacy.
- 스타웍스 개발기 (3) - 사파리 익스텐션과 웹킷 인젝션
- The Top 50 Developer Tools of 2016
- Front-End Developer Handbook 2017
- Everything you need to know about HTTP security headers
- Teaching Modern Software Development Techniques at University
- Mastering Bash and Terminal
- 고성능 서버/데이터베이스 소식
- Amazon Web Services’ secret weapon: Its custom-made hardware and network
- Microsoft Azure for AWS experts: Compare services for multicloud solutions and migration
- Træfɪk is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease.
- Introduction to High Performance Scientific Computing(PDF)
- 빌링 시스템 장애, 이러지 말란 Maria~
- emulamda - Python emulator for AWS Lambda
- Postgres Parallel indexing in Citus
- Peloton - The Self-Driving Database Management System
- Improving Azure SQL Database Performance Using In-Memory Technologies
- '신한은행의 美 AWS 클라우드' 사례...국내선 냉담한 이유
- Setup ProxySQL for High Availability (not a Single Point of Failure)
- The Infrastructure Behind Twitter: Scale
- MongoDB, ElasticSearch hackers now target Hadoop with ransomware
- New – Create an Amazon Aurora Read Replica from an RDS MySQL DB Instance
- Analysis and Mitigation of NoSQL Injections
- 대규모 분산 스토리지(Kage)의 발전과정
- RethinkDB: why we failed
- 빅데이터/인공지능 소식
- Bitesnap recognizes the foods in your meals by machine learning technologies
- How to Learn Math for Data Science, The Self-Starter Way
- 머신러닝 피드백을 이용한 게임 지표 분석
- Apache Eagle Graduates to Top-Level Project
- Velodyne Plans a Lidar Megafactory
- Unexpected Consequences of Self Driving Cars
- https://www.theguardian.com/politics/2017/jan/19/crisis-of-statistics-big-data-democracy?CMP=share_btn_tw
- The Rise of the Data Engineer
- 테슬라 모델 S 첫 사망 사고 "차량 안전 결함 없어"···NHTSA 조사
- NHTSA's full report on Tesla's 2016 fatal Autopilot accident
- Tesla’s Autopilot Vindicated With 40% Drop in Crashes
- NHTSA’s full final investigation into Tesla’s Autopilot shows 40% crash rate reduction
- '뉴 SKT 호' 밑그림 나왔다...T 브레인 신설하고 30대 AI 전문가 수장으로 영입
- Robotics - AI Software Learns to Make AI Software
- PyTorch - Tensors and Dynamic neural networks in Python with strong GPU acceleration.
- Playing with 80 Million Amazon Product Review Ratings Using Apache Spark
- Python Machine Learning: Scikit-Learn Tutorial
- 구글, 아파치 스파크 경쟁자 키운다
- DeepTraffic - Hightway traffic simulator
- Ad-hoc Data Visualization and Machine Learning with mysqlshell
- Massive Throughput Database Queries with LLVM on GPUs
- Analyzing 1.1 Billion NYC Taxi and Uber Trips, with a Vengeance
- 6.S094: Deep Learning for Self-Driving Cars
- 왓슨 쇼크… 10년 뒤 우리 동네 약사님은 로봇?
- Which Algorithm Family Can Answer My Question?
- Developing Korean Chatbot 101
- [2017 디트로이트 선언] 자율 주행차 시대… IT·車업계 수익모델 어떻게 변하나
- 기타 읽을거리
- Libor scandal: the bankers who fixed the world’s most important number
- THE HEROISM OF INCREMENTAL CARE
- 삼성은 단순한 폰팔이가 아니다: 삼성전자의 파운드리 산업
- Minimum Desirable Product
- https://www.bloomberg.com/news/articles/2017-01-23/when-their-shifts-end-uber-drivers-set-up-camp-in-parking-lots-across-the-u-s
- The hell of Apollo 1: Pure oxygen, a single spark, and death in 17 seconds
- The Not-So-Fine Tuning of the Universe
- [Infographic] Galaxy Note7: What We Discovered
- Why Paper is the real 'killer app'
- 부트스트래핑 그리고 계획
- 오라클, '스팍·솔라리스' 버리나
- The world couldn’t afford engineering degrees without philosophy majors
- Top IT Trends to Watch in 2017
- Paul Kalanithi,
- 행동을 변화시키는 서비스가 안 되는 이유 – 유저에게 자유를 허하라
- 최고의 플래시카드 앱은 Studies가 아니다!
- Investing Is More Luck Than Talent
- You (and Your Therapist) Can Change Your Personality
- 경력 개발이 멈췄다··· 늪에 빠진 개발자들을 위한 조언
- 넷플릭스 Q4 실적 분석
- Netflix’s international growth is exploding as its looks beyond the U.S.
- FAP80 - A Z80 retro computer without the retro baggage
- Some Colleges Have More Students From the Top 1 Percent Than the Bottom 60. Find Yours.
- AMAZON IS BECOMING THE GREATEST THREAT GOOGLE EVER ENCOUNTERED
- 리사 수의 ‘마법’, AMD를 구원하다
- The Deceptions of Luck
- Seminar Refreshments!
- CIA releases 13m pages of declassified documents online
- Galileo satellites experiencing multiple clock failures
- Why Medical Advice Seems to Change So Frequently
- It’s shockingly easy to hijack a Samsung SmartCam camera
- How to Criticize with Kindness: Philosopher Daniel Dennett on the Four Steps to Arguing Intelligently
- Science vs. Cinema: THE MARTIAN - Full Episode
- The One Question You Should Ask About Every New Job
- How much does employee turnover really cost?
- 진화하는 번역기… 사라지는 번역가?
- What Matters More to Your Workforce than Money
- The World Could See Its First Trillionaire in the Next 25 Years
- 영역별 영어 공부 사이트 모음 BEST 37
- 말 안하는 수요일
- 80,000 Hours career plan(Your A/B/Z career plan)
- An analysis of 10,000 scientific studies on marijuana concretely supports only three medical benefits
- 탄소 나노튜브 기반 메모리 기술 NRAM의 파괴력, 얼마나 될까
- Want kids to learn well? Feed them well
- 인사전문가 김성수 교수가 보는 직장의 미래
- Essential reading: nine experts on the books that inspired them
- 마음의 허기
- 6개월 경력자와 6년경력자의 차이
- 2017 : WHAT SCIENTIFIC TERM OR CONCEPT OUGHT TO BE MORE WIDELY KNOWN?
- The Pruitt-Igoe Myth: an Urban History – Film Trailer
- How Designers Engineer Luck Into Video Games
토요일, 1월 28, 2017
[B급 프로그래머] 1월 4주 소식
토요일, 1월 21, 2017
[독서광] 레시피보다 중요한 100가지 요리 비결
2017년도 새해를 기념해서 첫 책을 소개해드리겠다. 놀랍게도 오늘은 '요리책'이 아닌 '요리책'이다. '레시피보다 중요한 100가지 요리 비결'이라는 제목이 붙은 이 책은 요리를 잘 하기 위한 기본기를 소개한다는 면에서 상당히 특이하다. 일반적인 요리책은 조리법에 집중을 하기 때문에 재료나 준비 과정에 있어 필요한 각종 지식은 건너 뛰기 마련이다. 하지만 사소하다면 사소하다고 볼 수 있는 이런 배경 지식이 요리의 완성도를 극대화하기 때문에 이 책에서 제시하는 여러 가지 팁을 허투루 취급해서는 곤란하다는 생각이다.
주제는 크게 야채/과일, 육류, 해산물, 계란(!), 밥/빵/면류에 대한 비결, 밑준비, 요리 준비, 간, 조리 도구 식재료 선택/저장/보관에 대한 비결로 나뉘어진다. 다음에 소개하는 몇 가지 비법에 대한 제목만 봐도 도움이 될 것이다.
- 감자를 통째로 익힐 때에는 찬물에서부터 넣어서 삶는다
- 고기를 익히거나 가열하기 전에 칼집을 넣는다
- 햄버그스테이크는 센 불에서 시작하여 약 불에서 익힌다
- 흰 살 생선은 단시간에, 붉은 살 생선은 시간을 들여 조린다
- 계란 지단을 부칠 때에는 기름을 부은 뒤 팬을 한 번 닦아낸다
- 샌드위치를 만들 때에는 빵 한쪽 면에 버터를 바른다
- 파스타를 삶는 시간은 표준보다 약간 짧게
- 양파를 자를 때 눈물이 나지 않게 하는 방법
- 토막을 낸 고기나 생선은 물에 씻지 않는다
- 샌드위치에 넣을 야채는 키친타월로 수분을 제거한다
- 고기와 야채는 센 불에 빨리 볶아낸다
- 만두를 팬에 구울 때에는 기름을 넣기 전에 물부터 넣는다
- 볶는 요리의 재료는 팬 크기의 절반 이하로 한다
"조림 요리는 만든 뒤에 식혀 두는 시간을 갖는다"에 나오는 설명을 가져와봤다. 이 책 본문이 어떤 방식으로 서술되었는지 감이 올 것이다.
조림은 대체로 끓어오른 뒤 4~5분 정도가 되면 양념을 넣어 간을 맞춥니다. 그런데 ‘조림은 한 번 식혀 두고 난 후에 맛이 속까지 잘 배어든다’라는 말을 들어보신 적이 있을 거예요. 이것은 조림이 끓고 잇을 때에는 재료의 내부에서 수분이 증발하고, 온도가 내려가면 외부보다 내부의 압력이 낮아지기 때문입니다. 그러면 수분이 빠져나간 만큼 국물을 빨아들이기 때문에 빨리 맛이 배어드는 것이지요. 따라서 무 등의 야채를 두툼하게 썰어서 조리할 때 맛을 잘 스며들게 하고 싶으면 조린 뒤에 일단 불을 꺼서 잠시 그대로 식혀 두도록 합니다.
결론: 집에서 요리를 하는 과정에서 뭔가 부족함을 느끼는 분들께 적극 추천!
EOB토요일, 1월 14, 2017
[B급 프로그래머] 1월 2주 소식
- 웹/앱 소식
- 개발/관리도구 소식
- What lies beneath async/await in C# ?
- streama - It's like Netflix, but self-hosted!
- Kuzzle – An On-premises Document Back-end
- Python 3, asyncio와 놀아보기
- clean-code-javascript(한국어판)
- git-secrets - Prevents you from committing secrets and credentials into git repositories
- Java EE and Docker Tips
- Efficient String Concatenation in Go
- 구글 드라이브 이용해서 단어 정리하기
- The Surprising Truth of Java Exceptions: What Is REALLY Going on Under the Hood?
- 무료 한글 개발자 도서
- Learn Computer Science by Google CS Education
- Foundations of Computer Science by Aho & Ullman
- Guide to NumPy
- Q8 - Experiment with low level machine code programming in your browser
- DokanCloudFS - A virtual filesystem for various publicly accessible Cloud storage services on the Microsoft Windows platform.
- Randomness in Linux
- 보이지 않는 전우
- How To Spy on Your Ruby Methods
- Programming Languages online tutorial
- JVM Options Cheat Sheet
- Coffeefy: 스타벅스 와이파이 자동 접속 애플리케이션
- A Tourist’s Guide to the LLVM Source Code
- V8 마이크로 최적화 가이드
- Research papers in the .NET source
- [일상다반사] 좋은 질문을 하려면?(본인이 작성한 글)
- Java 9 Will Change the Way You Traverse Stack Traces
- flatpickr - lightweight and powerful datetimepicker with no dependencies
- 유니코드 한중일 잔혹사
- 서문: 프로그래밍은 어렵다
- Myths about /dev/urandom
- Easy 6502
- Ruby Meta-programming
- How One Line of Text Nearly Killed 'Toy Story 2'
- So Long, Prog21: 프로그래머들에게 좋은 링크!
- Harnessing the Power of Architectural Design Principles
- Grumpy: Go running Python!
- Really, POSIX? Really? memset() isn't async-signal-safe? How is it not safe? … oh … that's why
- Why Recursive Data Structures?
- Why HTTPS for Everything?
- Libraries.io The Open Source Discovery Service.
- [B급 프로그래머] 코딩 실력을 개선하기 위한 확실한 방법: 코드 읽기(본인이 작성한 글)
- Top 10 algorithms in Interview Questions
- The memory models that underlie programming languages
- The Container Landscape: Docker Alternatives, Orchestration, and Implications for Microservices
- Be Careful with Python's New-Style String Format
- In 2017, learn *every* language
- 10 Programming Tips to Create Maintainable Java Applications
- x86 Assembly Guide
- 고성능 서버/데이터베이스 소식
- Freenom World is a fast and anonymous Public DNS resolver
- MongoDB hackers now sacking ElasticSearch
- Google Infrastructure Security Design Overview
- A Year Without a Byte
- 이제는 리눅스 기반 SQL 서버를 준비할 시점
- 당신이 AWS 계정을 만들고 가장 먼저 해야 할 일 들과 하지 말아야 할 일 들
- Garbage Collector Basics and Performance Hints
- Moving persistent data out of Redis
- 알렉스 이야기
- MySQL 8.0.1: The Next Development Milestone
- 국내 클라우드 시장, 지난해 첫 1조 돌파...기업 경쟁 치열
- The InnoDB Storage Engine for MySQL
- Chaos Engineering
- AWS sees growth in database migrations
- Multiple DNS Providers to Mitigate DDoS Attacks
- Millions of Queries per Second: PostgreSQL and MySQL’s Peaceful Battle at Today’s Demanding Workloads
- Let’s Encrypt 2016 In Review
- How to Best Architect Your AWS Marketplace SaaS Subscription Across Multiple AWS Accounts
- Security Engineering — The Book
- LeoFS is an unstructured object/data storage for the Web and a highly available, distributed, eventually consistent storage system.: S3 API도 지원!
- Testing MySQL/MariaDB/Percona versions with Docker
- How and why the leap second affected Cloudflare DNS
- Some DNS lookups causing 5xx errors due to leap second bug
- Amazon Aurora: TCO, Performance, and Migration
- Best practices for MySQL High Availability
- Beringei is a high performance, in-memory storage engine for time series data.
- 빅데이터/인공지능 소식
- The Google Brain team — Looking Back on 2016
- “New Jersey Open Data Initiative;” requires certain information be made available on Internet by State departments and agencies.
- 내수 불황에도 稅收 호황… 부동산과 '엔티스'의 힘
- Organ transplants in the US are on the rise, but the reason why means it’s not exactly a public health triumph
- An economics analogy for why adversarial examples work
- 정부청사 얼굴 인증 시스템은 '뽀샵 판독기'?
- Deep Learning by Stanford Univ.
- Data Visualization - New York City: One Day on Waze | Waze
- Google just made a big move to bring down the cost of self-driving cars
- Difference between Machine Learning, Data Science, AI, Deep Learning, and Statistics
- Uber’s new tool gives cities a mind-bogglingly detailed view of traffic patterns
- Google’s new self-driving minivans will be hitting the road at the end of January 2017
- Deep Text Corrector
- Markov Chains - Explained Visually
- The Riemann Hypothesis, explained
- 현대 신경과학은 과연 동키콩을 이해할 수 있는가
- The Extraordinary Link Between Deep Neural Networks and the Nature of the Universe
- MuGo - Replicating AlphaGo's architecture in a readable manner
- 현대차 자율주행차 타보니··· "아직 상용화 수준 아니다"
- 6장으로 끝내는 고등학교 수학공식 큰그림
- Google BigQuery Adds New Public Datasets
- 지도기업 히어, 어떻게 자율차 기대주 됐나
- How to Partition a Billion-Node Graph(PDF)
- Google reveals secret test of AI bot to beat top Go players
- TensorKart: self-driving MarioKart with TensorFlow
- manim - Animation engine for explanatory math videos
- Three challenges you’re going to face when building a chatbot
- DeepMind’s work in 2016: a round-up
- 미국 독일 일본의 스마트 팩토리 전략
- 차원이 다른 구글 번역기의 도래 (1)
- 위대한 AI, 깨어나다
- Expect Deeper and Cheaper Machine Learning
- Self-Driving Cars Could Cause a Major Organ Shortage
- Deep Learning 2016: The Year in Review
- BigDL: Distributed Deep learning Library for Apache Spark
- Intel Open-Sources BigDL, Distributed Deep Learning Library for Apache Spark
- 기타 읽을거리
- Equipping people to stay ahead of technological change
- The curious case of high blood pressure around the world
- Study finds association between eating hot peppers and decreased mortality
- 윈도우 10의 문제 해결을 도와주는 마이크로소프트의 ‘무료’ 도구 총정리
- Why open offices are bad for us?
- Fund managers who come from poor backgrounds are better investors than rich ones
- 이름이 뽑힌 사람은 반드시 2주를 쉬어야 한다.
- Making Slack Faster By Being Lazy
- When the Computer Wore a Skirt: Langley’s Computers, 1935–1970
- 전기차 판매가 부품 회사의 수익에 끼치는 영향
- 상사의 '터무니없는' 결정을 속단해선 안 되는 이유
- 테슬라는 자동차의 미래다
- 모든 관리자의 이상
- 김영세 이노디자인 회장 - 집필부터 디자인까지 기본 앱만 써도 충분(트위터!)
- Alcohol flips brain into hungry mode
- When Narrative Matters More Than Fact
- "차기 정권 몫?" 이공계 병역특례 폐지 논의 제자리걸음
- Atlassian acquires Trello for $425M
- Obama in Science: The Renewable Revolution Will Outlast Trump
- 인텔 옵테인에 기대할 수 있는 모든 것 : 출시일, 성능, 제품, 하드디스크, 운영체제
- The Year of Conquering Negative Thinking
- Mathematicians bring ocean to life for Disney's 'Moana'
- 20 signs your boss secretly hates you
- Is Emirates Airline Running Out of Sky?
- SpaceX says it figured out why its rocket exploded and will fly again within days
- Inside the 74181 ALU chip: die photos and reverse engineering
- How Rogue One Created Princess Leia, Grand Moff Tarkin
- OKR – 개인 목표 설정에 적용해보기
- IT 프리랜서가 단골 고객을 확보하는 6가지 방법
- The best and worst ways to quit your job
- Coal Fire, Not Just Iceberg, Doomed the Titanic, a Journalist Claims
- "사랑받을 때의 태도를 보면 그 사람의 인격을 알 수 있습니다. '사랑받음'은 당연한 것이 아니에요"
- Game in-app purchases are warping kids’ understanding of basic economic ideas
- 2017 Is the Year That Twitter Learns to Thrive or Dies
- Two reasons the red Solo Cup is a marvel of modern engineering
- Why doing a PhD is often a waste of time
- 생명 그영원한신비 E01 생명의탄생
- NHK스페셜 1988년작 "지구대기행"
- 토마 피케티는 왜 파레토의 법칙을 비판하나
- How to Become a ‘Superager’
- Why Don't Mars Rovers Move Faster?
- Cargo Cult Science
- Rogue One: A Star Wars Story - soundtrack
- How Much Sugar Can You Avoid Today?
마지막 마무리
EOB토요일, 1월 07, 2017
[일상다반사] 좋은 질문을 하려면?
줄리아 에반스가 작성한 How to ask good questions라는 글을 읽다보니 독자 여러분께 소개하고픈 생각이 들어 본문 내용을 정리해봤다. 개발자로서 훌륭하게 성장하려면 질문을 잘해야 한다는 에반스의 의견에 적극 동의하는데, 비단 개발뿐만 아니라 사람들과 함께 뭔가를 해내기 위한 필수 조건이라는 생각이다.
우선 좋은 질문이 무엇일까? 대답하기 쉬운 질문이다. 당연한 듯이 들리겠지만, 어떻게 질문하느냐에 따라 완전히 상황이 바뀌기 때문에 그렇게 쉽지는 않다. 대답하기 쉬운 질문을 하기 위한 방법은 다음과 같다.
- 무엇을 아는지 언급하라. 지금까지 주제에 대해 연구한 바를 언급한 다음에 "제가 이해한 내용이 맞습니까?"라고 물어보자(B급 프로그래머 생각: 어떤 경우에는 질문을 위해 여러 가지 복잡한 사안을 정리하다가 답을 스스로 구하는 경우도 많다. :)).
- 정답이 사실인 질문을 하라. '어떻게'가 들어가면 경우의 수가 너무 많아져서 곤란하므로, 문제 범위를 좁혀서 참인지 거짓인지를 알 수 있는 질문 형태로 만드는 편이 시간을 절약할 수 있다(B급 프로그래머 생각: 조금 구체적인 질문이 좋다. 너무 범위가 넓으면 어디서부터 답을 해줘야할지 대답하는 사람도 당황스럽다).
- 이해하지 못하는 사실에 대해서도 기꺼이 말하라. 설명을 듣는 도중에 잘 모르는 용어나 개념이 나오면 추가로 질문을 해야 한다. 이렇게 해야 질문자의 지식 범위를 대답자가 갸늠할 수 있다.
- 이해하지 못하는 용어를 확인하라. X가 이런저런 내용이 맞습니까? 이런 식으로 질문하면 나중에 대답할 때 용어 이해 수준을 고려해 진행할 수 있다.
- 질문하기 전에 연구를 해보자. 구글 등을 검색하기 전에 무작정 질문을 던지지 마라(B급 프로그래머 생각: 대부분 구글 검색으로 해결되는 경우가 많다는 사실을 기억하자. 구글에 안 나오면 아주 어렵거나 너무 당연해서 질문이 안 나오거나 둘 중 하나일 가능성이 높다).
- 누구에게 질문할지를 생각하라. 적절한 질문자를 대상으로, 질문자가 대답하기 편한 시간에 맞춰, 적절한 분량의 질문을 하자.
- 명백하지 않음을 보여주는 질문을 하라. 고급 질문은 숨겨진 가정을 잘 드러내는 특성이 있다. 숨겨진 정보를 공유하는 방식은 상당히 효과가 있다(B급 프로그래머 생각: 아주 뻔한 질문이지만 완전히 어려운 사안으로 바뀌는 경우가 있다. 예를 들어, 엔디안을 예로 들면 x86-64 아키텍처에서는 너무나 명백한 사안이 ARM 아키텍처에서는 고민 거리를 던져준다).
훌륭한 질문이 엄청난 기여를 하는 경우도 있다. 질문하는 행위 자체에 너무 겁먹지 말자!
EOB월요일, 1월 02, 2017
[B급 프로그래머] 코딩 실력을 개선하기 위한 확실한 방법: 코드 읽기
프로그래머라면 누구나 자신의 코딩 실력을 개선하고 싶어한다. 코딩 실력을 개선하기 위한 아주 손쉬운 방법은 없지만 노력하면 성공 가능한 방법은 존재한다. 오늘은 One Sure-Fire Way to Improve Your Coding에 나온 몇 가지 코드 읽기와 관련된 힌트를 정리해드리겠다.
코딩을 잘하려면 많이 작성해보면 된다. 이는 거의 확실한 진리지만 함정이 하나 있다. 엉터리로 코드 수 만 줄을 작성해봐야 소용이 없으며, 오히려 제대로 된 코드 수 천 줄을 작성하는 편이 훨씬 바람직하다. 제대로 된 코드를 만들려면? 답은 간단하다. 남이 만든 제대로 된 코드를 많이 읽어보면 된다. 그러면 코드를 읽기 위한 힌트가 없을까? 제로드 산토는 다음과 같은 방법을 제시한다(추가로 괄호 안에 B급 프로그래머의 경험을 추가했으므로 참고하기 바란다).
- 무엇을 읽을까?
- 여러분이 의존하는 코드를 읽어라: 이미 사용 중인 라이브러리나 플러그인으로 시작하자. 예로 워드프레스 플러그인, 루비 젬, jQuery 플러그인을 고려해보자.
- 감명 깊은 소프트웨어 코드를 읽어라: 오픈소스 프로젝트 중에서 아키텍처가 잘 잡혀 있고 문서화가 잘 된 코드부터 시작하면 된다(B급 프로그래머: 스프링 소스 코드 일부를 읽어보고 사용자(개발자!)를 배려하는 치밀함에 정말 놀란 적이 있다.
- 존경하는 사람이 만든 소프트웨어 코드를 읽어라: 오픈소스를 이끄는 사람 중에서 존경하는 개발자가 있다면 거기서 출발하자(B급 프로그래머: 클린코드에서 작성한 로버트 C. 마틴이 작성한 코드 사례를 추천한다).
- 실제 다룰 수 있는 코드를 읽어라: 처음부터 너무 욕심내어 대규모 프로젝트를 구성하는 코드를 읽으면 혼란에 빠진다. 전체 논리를 한 번에 머리에 넣을 수 있는 작은 프로젝트부터 읽어보자(B급 프로그래머: 되도록 초기 버전을 권장한다. 버전이 올라갈수록 복잡도는 기하급수적으로 증가하기 때문이다. 피보탈에서 만든 Cloud Foundry도 초기 버전은 정말 읽고 이해할만 했다. 이 코드 덕분에 루비 실전 기술을 몇 가지 배웠다.).
- 어떻게 읽을까?
- 큰 그림을 보자: 개별 단위 함수부터 파고드는 대신 웹 사이트, 튜토리얼, 문서, 코드 이외 다른 참고 자료부터 살펴보자. 프로젝트 구조 파악이 우선이다. 코드 계층 구조를 파악하고 어떤 코드가 어떤 코드를 import 하는지, namespace는 어떻게 명명되어 있는지를 살펴보자(B급 프로그래머: 코드 내부에서 함수는 헤더 파일에 대한 교차 참조를 걸어주는 여러 가지 도구를 사용하면 시간을 절약할 수 있다).
- 찾아낸 사실을 문서로 만들자: 코드 읽기는 수동적인 활동이 아니다. 찾아낸 사실을 문서로 만들고 프로그램 흐름에 맞춰 가정과 결론을 나중에 찾아볼 수 있게 주석으로 달아놓자.
- 테스트를 사용하라 루크!: 아마도 테스트 코드가 프로젝트 내에 포함되어 있을 것이다. 테스트는 출발점으로 아주 좋다. 코드가 어떻게 동작하고 어떤 가정을 내포하는지를 설명하기 때문이다. 실제로 코드 읽기에 앞서 테스트를 돌려서 환경이 제대로 구성되어 있는지 확인할 필요가 있다(B급 프로그래머: 테스트에 앞서 일단 빌드부터 성공해야 한다. 컴파일 언어에 대한 환경 구성이 확실히 어렵긴 하지만 스크립트 언어인 경우에도 의존성 맞추느라 고생할 가능성이 상당히 높다. 충격에 대비하라!).
- 실행하고, 변경하고, 다시 실행하자: 일단 모든 것을 분해했다 다시 조립하면서 이해도를 높이자. 정말 멋진 기능을 하나 추가해서 테스트가 통과하는지 살펴보자. 다양한 코드 상태를 확인할 수 있게 로그 수준을 높여보자(B급 프로그래머: 이 과정에서 디버거를 사용해 흥미로운 부분에 중단점을 걸어 내부 상태를 파악하기도 한다).
- 어디서 시작할까? 깃허브와 같은 공개 소스코드 저장소에서 출발하자. git clone 만으로 손쉽게 코드를 복제해서 시작할 수 있다.