Today I.. 22

[Clean Code] Chapter 01. 깨끗한 코드

Clean Code 클린 코드 - 로버트 C. 마틴 저 를 읽고, 해설 강의를 통해 보충 이해한 내용을 정리한 글입니다. 기계가 실행할 정도로 상세하게 요구사항을 명시하는 작업, 바로 이것이 프로그래밍이다. 이렇게 명시한 결과가 바로 코드다. 1. Bad Code 1) 나쁜 코드란 성능이 나쁜 코드: 불필요한 연산이 들어가서 개선의 여지가 있는 코드 의미가 모호한 코드: 이해하기 어려운 코드나 네이밍과 그 내용이 다른 코드.. 등 여러 경우가 될 수 있음. 중복된 코드: 비슷한 내용인데 중복되는 코드들은 버그를 발생시킬 가능성이 매우 크다. 음...음..? 엥? 의미도 모르겠고, 이 코드는 또 중복이 되고, 포맷팅도 이상하고,.. 어쨌든 이런 느낌이 드는 코드들은 '나쁜 코드'다. 2) 나쁜 코드를 짜는..

[Git] git submodule

배경 여러 프로젝트(main project)에서 사용하는 공통 모듈(sub project)이 있을 때, main project와 sub project들은 어떻게 git으로 관리할 수 있을까? 이 sub project는 어느 repo에 저장이 되는 것이 좋을까? 이럴 때, sub project가 독립적인 Repo에서 버전관리 되고, 이 모듈을 사용할 프로젝트인 main project들에는 원하는 폴더에 이 sub project 들이 연결되어 있어서 사용할 수 있으면 좋을 것이다. 이런 기능 뿐만 아니라, sub project에 여러 버전이 있을 때, 특정 버전과 이를 사용할 main project의 디렉토리를 연결시켰다가, 또 다른 버전이 준비되었을 때, 손 쉽게 다른 버전으로 변경할 수 있다면 버전 관리..

[소프트웨어 장인] 나의 커리어와 프로페셔널로서의 미래는 누구의 책임인가?

소프트웨어 장인 - 산드로 만쿠소 저 의 '4장. 소프트웨어 장인의 태도'를 읽고 정리함과 동시에, 나는 책에서 소개하고 있는 것들을 어떤 방식으로 하고 있는지, 깨달은 바는 무엇인지를 중간중간 적어보았다. 나의 커리어와 프로페셔널로서의 미래는 누구의 책임인가? SW 프로페셔널로 대우 받기를 원한다면 프로처럼 행동해야 한다. 그러기 위해서는 언제/무엇을/어떻게 배울 것인지 스스로 결정하고, 스스로의 발전에 돈과 시간을 투자해야 한다. 1. 내 커리어 주도적으로 이끌기 독서 특정 기술에 대한 서적: 현재의 업무에서 다음에 하고 싶은 업무로 옮겨가기 위해 필요한 특정 기술에 대해서 상세하게 또는 이용 방법을 급하게 알아야 할 때 필요하다. 그러나 배운 가치가 상당히 빨리 떨어진다. 새 버전의 기술이 릴리즈 ..

마이크로서비스와 애자일 개발 프로세스

중 4장. 마이크로서비스와 애자일 개발 프로세스를 읽고 정리한 글입니다 마이크로서비스를 구현하기 위한 필요조건 팀 구성: 기술별로 팀이 분리되는 것이 아니라(UI팀, 서버개발팀, DB팀) 업무 기능을 중심으로 기술이 다양한 사람들이 하나의 팀(BE개발자, 기획자, 디자이너, FE개발자, 테스터)(Cross-Function Team)이 되어 서비스를 만들어나간다. 문화: 자율적인 업무 기능 중심 팀과 자율적인 개발 문화가 필요. 관리체계: Cross-Function Team이 개발과 운영을 책임진다. (You built it. You run it). 각 마이크로서비스를 맡은 Cross-Function Team이 그 서비스에 맞는 최적의 언어와 저장소를 자율적으로 선택한다. 빠르게 서비스를 만드는 것을 최우..

211021) docker-compose --exit-code-from

name: ML application unittest on: push: branches: [test] jobs: test: runs-on: [self-hosted, gpu] steps: - uses: actions/checkout@v2 - name: ML inference code Unittest run: docker-compose -f docker-compose-unittest.yml up 이런 github actions workflow script가 있다고 하자. 그런데 docker-compose 을 통해 실행된 unittest가 실패해서 FAILED (errors=1) [container] exited with code 1 으로 실행이 종료되어도 docker-compose가 정상적으로 작동하였다면 ..

211012) 하던 작업 임시 저장 및 적용 git stash, 원격 저장소와 local저장소의 소스코드를 일치 git fetch, git reset

하던 작업을 임시로 저장해두고 나중에 그대로 적용시키고 싶을 때가 있다. 예를 들면 A branch에서 신나게 작업을하고 있는데 알고보니 B branch에서 해야했던 작업일 경우 또는 하던 작업을 멈추고 잠시 브랜치를 바꿔야하는데 작업 중인 것이라 commit을 할 만한 것은 아닐 때 최근 이런 경우가 생겨 git stash를 사용해 보았다. git stash git stash apply [Git] git stash 명령어 사용하기 - Heee's Development Blog Step by step goes a long way. gmlwjd9405.github.io git stash (feat. 내가 왜 마스터 브랜치에 있지) 개인적으로 프로젝트를 하다 보면, 브랜치를 생성하지 않은 채로 (그러니까 실..

211014) Docker multi-stage build

https://www.hahwul.com/2020/10/07/docker-multistage-build-for-optimazation/ Docker multi-stage build를 통해 이미지 경량화하기 Why? 보통 베이스가 되는 도커 이미지는 생각보다 큰 용량을 가지고 있습니다. 거기에 의존성으로 추가적인 도구를 설치하고, 빌드하게 되면 생각보다 엄청 큰 용량으로 탄생합니다. 이런 경우에 www.hahwul.com https://docs.docker.com/develop/develop-images/multistage-build/ Use multi-stage builds docs.docker.com

211013) 리눅스 터미널 환경에서 다른 서버와 파일 복사/받기

[SCP] 리눅스 터미널 환경에서 다른서버와 파일 복사 리눅스 작업을 하다보면 의외로(?) 다른 리눅스 서버와 파일을 복사 할 경우가 생긴다. 여러 방법 들이 있을 수 있겠지만... SCP(Secure CoPy)를 사용하면 편리하다. 사용법은 대략 아래와 같다. 다른 noota.tistory.com # from 다른 서버 to 내 서버 $ scp [옵션] [다른 서버 계정]@[다른 서버 주소]:[다른 서버의 파일 또는 디렉터리] [지금 서버의 디렉터리] # from 내 서버 to 다른 서버 $ scp [옵션] [지금 서버의 파일 또는 디렉터리] [다른 서버 계정]@[다른 서버 주소]:[다른 서버의 디렉터리] 리눅스 scp 사용법 - 제타위키 다음 문자열 포함... zetawiki.com

재택근무와 신뢰

https://now.rememberapp.co.kr/2021/07/25/13835/ 직원을 감시하려 하지 마세요 코로나가 없던 시절이나 지금이나 원격 관리는 특히 경영진들에게 매우 까다로운 방식으로 여겨졌습니다. 까다롭게 만드는 가장 큰 요인은 '감시 비용'입니다. 경영을 할 때는 직원들을 감시하 now.rememberapp.co.kr 감시를 할 필요가 없는 조직을 만들고자하는 접근이 필요 '내가 지켜보지 않으면 분명히 농땡이 피울 사람들을 관리한다'는 마인드를 버려야한다. 현업의 목소리와 연구들은'관리'가 아닌 '신뢰'로 움직이는 조직이 되어야 한다는 메세지를 던지고 있음. 근거는 있는가? => 실제로 조직 내 구성원간 신뢰의 수준이 높을 때 감시 비용이 현저히 줄어들고 심지어 재무적 성과까지 늘어난..

[Coding Style] Return Early Pattern

본 글은 Leonel Menaia의 “Return Early Pattern” 글을 번역한 것입니다. Return Early Pattern 프로그래밍에 대해 배우고 함수를 만들 때의 기본적인 사고방식은 '함수를 만들 때, 어떤 결과를 도출하기까지 어떤 조건에 맞는지 검사'해나가는 것이었다. public String returnStuff(SomeObject argument, SomeObject argument2){ if(argument1.isValide()){ if(argument2.isValide()){ SomeObject otherVal1 = doSomeStuff(argument1, argument2) if(otherVal1.isValid()){ someObject otherVal2 = doAnothre..