본문 바로가기

분류 전체보기27

제 2장 의미 있는 이름 #의도를_분명히 - 고려 사항 - 존재 이유는? 수행 기능은? 사용 방법은? - 주석이 필요하다는건 의도 표현이 불충분했다는 것 #그릇된_정보_지양 - 다르게 해석할 여지가 많은 함축어나 단어는 쓰지 말 것 - 서로 비슷해서 헷갈릴 이름을 사용하지 않게 #의미있는_구분 - 연속된 숫자나 불용어 추가하지 말 것 - a1, a2, ..., aN - a, an, the, Info, Data, Manager, Process - 구분이 안되는 예시 - NameString / Name - moneyMount / money - accountData / account - theMessage / message #발음하기_쉽게, 검색하기 쉽게 - 마음대로 축약해서 넣지 말 것 - 여러 곳에서 사용한다면 검색하기 쉽게 상.. 2021. 4. 11.
제 1장 깨끗한 코드 #코드의_가치 - 코드를 자동으로 짜주는 기대가 오면 프로그래머는 필요가 없나? - 어느 수준에선 코드없이 요구사항을 상세히 표현하는건 불가능. 그럼 추상화도 불가능하게됨 - 앞으로 언어에서 추상화 수준은 점차 높아질 것 - 특정 분야에 적합한 domain-specific language 가 많아질 것으로 예상 (DSL) - 코드란 요구사항을 표현하는 언어 #르블랑의_법칙 - 급하게 짠 코드를 나중에 손보겠다? - 안돌아가는 프로그램보다 돌아가는 쓰레기가 낫다? - 나중은 결코 오지 얂는다. #깨끗한_코드? - 기한을 맞추고 빨리가는 유일한 방법은 코드를 최대한 깨끗하게 유지하는 습관뿐 - 깨끗한 코드를 작성할 땐 '청결'이라는 감각으로 기법을 적용하는 절제와 규율이 필요 == 코드 감각 - 비야네 스트.. 2021. 4. 3.
[golang] interface와 reflect, 그리고 OOP golang에는 type 문이 있다. 속성들의 집합을 표현하는 struct와 행위의 집합을 표현하는 interface를 정의할 때 주로 쓰인다. struct는 Custom Data Type을 정의하며 interface는 해당 type이 정의해야하는 함수 원형을 정의한다. #interface golang에는 전통적인 class, object, 상속 개념이 정의되어 있지 않은 대신 struct와 interface라는 기능으로 OOP를 지원한다. 기존 class는 사용자 정의 타입을 정의하는 struct로 표현되는데, 속성(==field)과 행위(==method)를 함께 표현하지 않는다. struct는 필드만을 가지게, method는 함수 이름 '앞'에 선언되는 매개 변수인 receiver 인수를 받는 fun.. 2021. 3. 28.
I/O Multiplexing 톺아보기 (2부) 이전 1부에서 Blocking/Non-Blocking, Synchronous/Asynchronous 기본 개념과 Linux 환경에서의 기법들을 살펴보았다. I/O 동작의 가장 기본 형태인 Synchronous Blocking 방식은 굉장히 직관적이긴 하지만 2개 이상의 파일을 처리할 때는 multi-process 또는 multi-thread 기법으로 동작해야했다. Non-Blocking이라 한들 지속적인 Context Switching이 일어나기도 한다. 즉 Synchronous 방식에서 성능을 고려하면 multi-processing 또는 multi-threading 을 구현하지 않을 수 없다는 것이다. 하지만 multi-processing 환경에선 IPC(프로세스간 통신)나 동기화(semaphore, .. 2021. 2. 16.
I/O Multiplexing 톺아보기 (1부) “Everything is a File” 이 말은 Linux/Unix에서는 socket도 하나의 파일(File), 더 정확히는 File Descriptor(FD, 파일 디스크립터)로 관리된다는 것에서 착안되었다. 이처럼 Low Level File Handling을 통해 socket 기반의 데이터 송수신이 가능하다. 즉 I/O 작업은 단순히 단일 server 내에서 일어나는 읽기/쓰기 뿐만 아니라 Server-Client 간 네트워크 통신에도 적용되는 개념인 셈이다. 이번 포스팅에서는 각종 I/O 모델 들을 이해하기 위한 선수 개념과 기본 동작 방식을 숙지하고 일련의 과정을 설명하기 위해 Linux 계열에 대한 Multiplexing 기법까지만 다루도록 한다. 그 외 Windows, Solaris, Ope.. 2020. 11. 25.
go map 초기화 Map in golang 키(Key)에 대응하는 값(Value)을 신속히 찾는 해시테이블(Hash table)을 구현한 자료구조 format : map[Key]Value # 선언 var results map[string]string map은 reference 타입이므로 nil 존재 이 상태의 map을 "Nil Map" 이라함 panic: assignment to entry in nil map goroutine 1 [running]: main.main() /Users/larva/go/src/go-study/main.go:8 +0x4f exit status 2 초기화 하지 않은 nil map을 사용하려고 하면 panic 발생 panic : 컴파일러가 찾아내지 못하는 error nil map에는 어떠한 값도 .. 2020. 10. 18.
gRPC 배경부터 활용까지 1. 등장 배경 1.1 Server-Client Model PC(Personal Computer)의 개념이 없던 시절, 프로그램은 하나의 메인 프레임에서 동작하는 Monolothic 구조로 설계되었다. 이때까지만 해도 모든 기능들이 한 공간에서 구동되다보니 지금처럼 네트워크 통신이 크게 중요하진 않았을 것이다. 기술 발전에 따라 소형 컴퓨터 장비들(PC, 워크스테이션 서버 등)이 등장하게 되고, 기업 입장에선 매우 고가인 메인 프레임워크를 비교적 저가의 워크스테이션 서버로 대체하고 싶어했지만! 메인 프레임워크의 초고사양 서비스를 워크스테이션 서버에서 그대로 제공하기엔 한계가 있었다. 때문에 메인 프레임워크의 기능을 워크스테이션 서버로 분산시키고, 네트워크 연결로 서비스하는 방식을 채택하게되었다. 흔히 말.. 2020. 7. 26.
core dump 분석을 위한 gdb 사용법 간단 정리 살다보면 기껏 키워놓은 프로그램이 어느 날 갑자기 죽었거나 hang 걸리며 뻗어버리는 반항하는 모습을 보게 됨. 내가 널 어떻게 키웠는데 일반적인 운영 로그/에러는 직접 logger를 만들어 따로 잘 저장해두겠지만 미처 고려하지 못한(생각보다 low한) 부분에선 바로 원인을 파악하기가 힘듦. 따라서 프로그램 실행 시, core dump를 남기게 설정한다면 프로그램이 돌연사했을때 특정 시점의 메모리 상태를 알 수 있어 이슈 파악에 매우 유용 unix 환경에서 이를 도와주는 디버깅 툴이 gdb (=gnu debugger) 1. core dump 구조 core 파일은 ELF 형식 [ ELF - Executable and Linkable Format ] 실행 파일, 오브젝트 파일, 공유 라이브러리 그리고 '코어.. 2020. 5. 15.