구글 엔지니어는 이렇게 일한다.(Software Engineering At Google)

이책은 구글의 엔지니어링의 전반적인 내용을 다루고 있다. 구글의 문화, 프로세스, 도구를 모두 다루고 있다. 다양한 구글 엔지니어들의 경험을 바탕으로 쓰여졌다. 다양한 이야기 중에서 팀워크와 테스트에 대한 2가지의 이야기가 가장 인상깊어다. 구글의 엔지니어링 문화 구글은 구글다움이라는 것을 겸손 존중 신뢰를 드러내는 태도와 행동들을 정의 하였다. 모호함을 뚫고 번창한다. 끓임없이 변화하는 환경 속에서도 상충하는 메시지와 방향을 잘 대처하고, 합의를 이끌어내고, 문제에 대한 진전을 이룰 수 있습니다. 피드백을 소중히 한다. 피드백을 주고받을 때 품위와 겸손을 유지하고 개인과 팀의 발전 피드백을 주는 가치를 이해합니다. ...

June 20, 2022 · 4 min · 665 words · Hillfolk

2021년 회고

K (잘한것) 회사 프로젝트에서 초기 개발시작하기 전부터 자동화된 CI/CD(배포+테스트+정적분석)시스템을 구축하고 나서 프로젝트를 진행하도록 하였다. 그 결과로 팀원들의 코드 퀄리티와 개발품질이 향상되었다. 테스트 코드를 추가하면서 인지하지 못한 사소한 버그를 확인 하였고 정적 분석툴(SonarQube)을 도입한 이후에 코드 컨벤션은 물론이고 팀원들의 잘못된 습관들을 많이 바로 잡을 수 있었다. 프로젝트 단위에서 도메인 주도 개발을 부분적으로 도입하였다. 프로젝트팀들과 이벤트스토밍을 통해서 언어의 통일과 발생되는 이벤트와 프로세스도 팀원 전체가 동일하게 이해할 수 있도록 하였다. 하지만 아직 개발팀원들이 코드 레벨로 도메인 주도 개발을 적용하는 부분은 어려움을 격고있다. 하지만 지속적으로 도입을 위한 노력을 하고 있고 코드 레벨에서의 도메인 주도 개발 방법도 여러가지를 시도중이다. ...

January 1, 2022 · 2 min · 424 words · Hillfolk

실용주의 프로그래머 Tip

실용주의 프로그래 Tip 자신의 기술에 관심과 애정을 가져라. p.21 소프트웨어 개발을 잘 해보려는 생각이 없다면 왜 인생을 그 일을 하면서 보내는가? 자신의 일에 대해 생각하면서 일하라! p.21 자동 조종 장치를 끄고 직접 조종하라, 스스로의 작업을 지속적으로 비판하고 평가하라. 어설픈 변명을 만들지 말고 대안을 제시하라. p.32 변명하는 대신 대안을 제시하라. 그 일을 할수 없다고 말하지 말고, 무엇을 할 수 있는지에 대해 설명하라. 깨진 창문을 내벼려 두지 마라. p.35 눈에 뜨일 때마다 나쁜 설계, 잘못된 결정, 좋지 않은 코드를 고쳐라. ...

August 23, 2021 · 6 min · 1278 words · Hillfolk

Go 서비스를 Github Action 을 이용해서 AWS ECS 에 배포하기

소개 배포 자동화 시스템 소개 Go 서비스의 운영 및 배포를 위한 시스템 구성을 소개 하도록 하겠습니다. 저희는 다른 기술에 비해 접근이 용이했던 ECS 를 사용하여 시스템을 구성하였습니다. 사용 Tool 클라우드 : AWS 소스 레파지토리 : Github Docker 컨테이너: ECS API 서비스 구성 배포 자동화 프로세스 API 서버 배포 테스트용 Go API 서버 만들기 Echo 와 Swagger 를 설정한 초간단 API 를 구성해 보겠습니다. Simple Code Echo-Swagger 소개 Echo-Swagger 는 Echo기반의 컨트롤러를 자동으로 문서화 해주는 기능을 해주는 라이브러리 입니다. Ehco 사용시 사용자 및 협업 하는 개발자 에게 API 문서를 제공할때 유용 합니다. ...

July 15, 2020 · 6 min · 1141 words · Hillfolk

Go 동시성 프로그래밍 하기

Goroutine 고루틴은 함수를 동시에 실행시키는 기능이다. 다른 언어의 쓰레드보다 운영체제의 리소스를 적게 사용한다. 클로저 클로저를 고루틴으로 실행할 때 반복문에 의해 바뀌는 변수는 반드시 매개변수로 넘겨 준다. 멀티코어 활용 체널 사용 채널은 고루틴끼리 정보를 교환하고 실행의 흐름을 동기화하기 위해 사용한다. 채널 생성시 보내기 전용 이나 받기 전용으로 생성 가능한다. package main import "fmt" func sum(a int, b int, c chan int) { c <- a + b } func main() { c := make(chan int) go sum(1 ,2 ,c) n := <-c fmt.Println(n) } range close 사용하기 close 는 채널을 닫을 수 있으며 이미 닫은 채널을 닫게되면 패닉 발생 채널을 닫으면 range 루프가 종료 됩니다. 채널이 열려 있고 값이 들어 오지 않으면 range 는 실행되지 않고 계속 대기 한다. package main import "fmt" func main() c:= make(chan int) go func() { for i := 0; i >5 i++{ c <- i // 채널에 값을 보냄 } close(c) }() for i:= range c { fmt.Println(i) } } Select 사용하기 Go 언어는 여러 채널을 손쉽게 사용할 수 있도록 select 분기문을 지원 select문은 지정한 채널의 데이터가 있을 경우 case 수행한다. select문에서는 지정한 체널에 데이터를 보내는 case는 항상 수행 된다. for{ case c1 <- 10: // 매번 체널 c1 에 값을 보냄 case s:= <-c2: // c2 값이 들어 왔을때는 값을 꺼낸뒤 s에 대입 } 동기화 객체 Mutex: 뮤텍스 ,상호 배제, 공유 데이터 보호에 주로 사용 RWMutex: 읽기/쓰기 뮤텍스 입니다. 일기와 쓰기 동작을 나누어서 잠금을 걸수 있습니다. Cond: 조건 변수 (condition variable) 입니다. 대기하고 있는 하나이상의 객체를 깨울수 있다. Once: 특정함수를 딱 한번만 실행할때 사용합니다. Pool: 멀티 쓰레드 (고루틴)에서 사용할 수 있는 객체풀 입니다. 자주 사용하는 객체를 풀에 보관하여 사용가능 하다. WaitGroup:고루틴이 모두 끝날 때까지 기다리는 기능 Atomic: 원자적 연산이라고도 하며 더 이상 쪼갤 수 없는 연산 의미 고루틴에서 안전하게 값을 연산하는 기능 입니다.

May 3, 2019 · 2 min · 289 words · Hillfolk