[dev] 구글의 코드 리뷰

이미지
[dev] 구글의 코드 리뷰 기술 블로그에 약간 지침을 느끼고, 하나씩 배운 것들을 정리하고자 최근에 읽었던 글 중 기억에 남는 부분 위주로 번역하겠습니다. Code Reviews at Google are lightweight and fast 라는 글 입니다. 구글에서 코드리뷰는 엔지니어의 중요한 역할 중 하나 입니다. 엔지니어들은 코드를 깔끔하게 관리하고자 하기 때문이죠. 마이크로 소프트의 코드리뷰와 비슷할 수 있으나, 구글만의 특징이 있습니다. 그래서 구글에서의 코드리뷰 방법을 소개하도록 하겠습니다. Code Review Study at Google study to understand Google’s internal code review processes 논문에 기술한 방법으로 코드리뷰를 합니다. Preparing code for review 코드를 수정하면 마크가 생기고, 변경사항이 머지되고 나면 코드리뷰가 시작됩니다. 구글은 내부 코드리뷰 도구인 Critique 로 변경사항을 먼저 체크합니다. 코드리뷰를 보내기 전에는 정적 분석도구를 통해 코드를 실행합니다. 내부에서 사용되는, Tricorder를 실행하고 결과를 검토합니. 그리고 최소 한명 이상의 리뷰자를 선정해 리뷰를 요청합니다. Reviewers give feedback 리뷰어는 코드를 살펴보고 문제가 있거나 설명이 필요한 경우 코멘트를 남깁니다. 그 다음 요청자는 코멘트를 회신하여 코멘트를 처리합니다. 코드가 수정되었을 경우에는 새 버젼을 올려 변경사항을 확인할 수 있게 합니다. 리뷰어가 만족하면 LGTM(Look good to me) 를 표시하여 승인 합니다. Code Reviews at Google 모든 변경된 코드는 리뷰 되어야 합니다. 75% 이상의 코드는 한명의 리뷰어가 승인했습니다. 승인한 리뷰어 또한 코드에 오너쉽을 가지며, 가독성에 대한 보장을 해야합니다. 작은 리뷰는 1시간 이내에, 커도 4시간 안에는 리

[swift] swift 기본 문법 스터디 6주차

이미지
[swift] swift 기본 문법 스터디 6주차 함수 함수란 입력값을 받아 처리하여 반환 하는 형태를 띈 코드의 덩어리를 의미합니다. 여러번 반복되서 작성된 코드를 함수의 호출로 처리할 수 있습니다. 연속적으로 작성하는 것 보다 기능별, 목적별로 나누어 코드의 가독성이 올라갑니다. 수정이 필요할 때 함수 내부만 수정하면되니 유지, 보수에 유리 합니다. 함수의 반환값 함수는 인자 옆에 -> 기호와 함께 반환 값의 타입을 입력해줍니다. return 키워드와 함께 반환해줍니다. 반환값이 없는 경우에도 return 키워드를 입력해서 함수의 종료를 명시적으로 표현해 줄 수 있습니다. 하나의 값만 반환하지만, 컬렉션 타입에 여러개의 값을 담아 한 덩어리로 묶어서 반환하는 방법도 있습니다. 함수의 호출 함수를 호출 할 떄는 이름과 인자를 넘겨주어 호출할 수 있습니다. 레이블이 있다는 것이 스위프트의 독특한 문법 중 하나입니다. 내부 매개변수명, 외부 매개변수명 외부에서 호출될 때와 내부에서 매개변수를 사용할 때 다른이름을 쓸 수 있습니다. _ 를 이용하여 외부 매개변수를 사용하지 않을 수 도 있습니다. 변수의 범위 변수는 영향을 줄 수 있는 범위를 가지고 있습니다. 기본적으로 블록 내부에서 선언된 변수는 블록이 종료되면 사라집니다. 또한 변수를 만나면 어디서 선언되었는지 검색합니다. 함수 내부에서 찾음 함수 외부에서 찾음 글로벌에서 찾음 외루 라이브러리에서 찾음

[swift] swift 기본 문법 스터디 5주차

이미지
[swift] swift 기본 문법 스터디 5주차 옵셔널 옵셔널은 스위프트에서 도입된 새로운 개념입니다! 값이 없음을 의미하는 nil의 개념은 다른언어에도 존재하는데요, 값이 없을 수도있다는 nil이 될 수 있다는 타입을 옵셔널 이라고 합니다. 에러를 내는 것 보다는 무언가 문제가 있다, 혹은 해당 연산에 대한 결과 값은 없다라는 의미로 사용되어 에럴 없이 코드가 동작하게 도와주는 녀석입니다. Optional(“값”) 으로 감싸줍니다. 만약 감싼 값이 없다면? 그렇죠 nil이 들어있겠죠! 이렇게 Optional에 Wrapping 되어있는 옵셔널 타입의 값은 Unwrapping 해서 사용해야 하죠. 그럼 정의부터 하나씩 살펴볼까요 옵셔널의 선언 type+? 입니다. 예를 들어 var age: Int? 이런식이죠. 옵셔널인지 아닌지는 nil을 대입해보면 됩니다. 여기서 추가적으로, Int 와 Int?는 다른 타입이므로 연산이 불가합니다. Unwrapping해서 사용해야 하지요. Optional Unwrapping 옵셔널안에 있는 값을 꺼내오는 방법은 어러가지가 있지만, 그 중에 가장 쉬운 방법은 ! 연산자를 사용한 강제 추출 방법이 있습니다. age! 와 같은 방법으로 값을 꺼낼 수 있습니다. 문제는 age안에 nil이 들어있을 때 앱이 죽을 수 있으니 조심해서 사용해야 합니다. Optional Binding을 사용하면, 안전하게 값을 꺼내올 수 있습니다. 내가 필요한 값은 꺼내오고 없으면, 실행하지 않습니다. if let, guard let 과 같은 방법으로 언래핑 할 수 있습니다. 비교할 때에는 컴파일러 단에서 자동으로 값을 꺼내오기도 합니다. 옵셔널의 묵시적 해제 옵셔널 타입이긴 하지만, 값을 사용할 때는 자동으로 옵셔널 타입이 해제되는 방법입니다. var name: String! = "Leeo" 이렇게 사용합니다. 형식상 옵셔널로 정의해야 하지만, 실제로는

TokenMemo 앱을 배포하고 난 후

이미지
TokenMemo 간단하게 터치 한번으로 메모 내용을 복사할 수 있습니다. 메모를 추가하고, 그 내용을 입력하면됩니다. 클립보드에 내용이 있다면, 자동으로 추가 할지를 물어봅니다.

[swift] swift 기본 문법 스터디 4주차

이미지
[swift] swift 기본 문법 스터디 4주차 집단 자료 (collective Types) 관련있는 데이터 끼리 모아서 관리 할 수 있는 자료형입니다. 같은 형태의 여러개의 자료를 다룰 때 유용하게 쓸 수 있습니다. Array Set Tuple Dictionary Array 데이터에 index로 접근할 수 있습니다 순서가 있어서 계속 인덱스가 늘어납니다 하지만 중간에 데이터가 사라지면 앞으로 당겨집니다 반복 반복을 하는 방법이 다양합니다. 처음부터 끝까지 반복됩니다. 초기화 초기화 하는 방법에는 다양한 방법이 있습니다. 선언 : var name: [String] 초기화 : name = [String]() 동적할당 append - 맨뒤에 추가됩니다 insert(at) - 해당 인덱스 자리에 추가 후 나머지는 1씩 뒤로 밀립니다 append(contentsOf) - 여러개의 인자를 추가됩니다 범위 연산자 할당 당하는 영역보다 할당하는 영역이 크면 -> 길이가 늘어납니다 반대는 길이가 줄어듭니다 Set 중복이 없으며, 순서에 대한 보장도 없습니다. 대신 해시연산의 결과 값을 이용하여, 저장하기 때문에 불러올 때 성능이 매우 빠릅니다. 정의 Set () 추가는 .insert 로 할 수 있습니다. 순회가 가능합니다. 집합연산이 가능합니다. Array와 Set을 비교해서 사용처를 구분하는게 좋지 않을까요? 여부판단 말고 어떤 예제가 있을까요? Tuple 특별한 성격 집단의 자료형으로, 여러 타입의 데이터를 한번에 담을 수 있습니다. 하지만, 최초에 선언된 상태의 아이템만 사용하고, 수정삭제 추가 불가능 하다는 것이 특징입니다. () 을 사용하여 정의합니다. Dictionary 키와 밸류가 연결되어있는 자료형입니다. 배열과 같은 어노테이션을 사용하며, 같은 타입만 들어갈 수 있습니다. 값을 업데이트 할 수 있습니다. 또한 순회하면서 탐색할 수

[UXKit] 앱 탐구 생활 - 29CM

이미지
[app review] 앱 살펴보기 (1) - 29CM 에디터 추천 이 붙어있는 앱을 한번 살펴볼까 합니다. 29CM이라는 앱이고, 디자인적으로 굉장히 잘 되어있다고 해서 선정하게 되었습니다. 앱 구성 크게 5개의 탭바로 되어있습니다. 깔끔한 아이콘과 복잡하지 않은 탭바 아이콘 설명이 깔끔한 느낌을 줍니다. 가운데는 영상을 위한 페이지이며, 탭바의 색이 반전되어 있습니다. 다른 화면이지만 나머지 화면들과 디자인 적으로 같아보였습니다. 디자인에 무지해서인지, 화면 전반에 존재하는 왼쪽의 여백에 눈이 많이 갔습니다. 어떤 미적 의미가 있는지 아시는 분은 댓글로 알려주세요. 메인의 투명한 네비게이션바와 우측의 하얀색버튼이 눈에 걸리지 않게 색변화 하는 점이 매우 신기 했습니다. 또한 속도에 따른 네비게이션 버튼과 탭바의 등장과 사라짐은 신기한 경험이었습니다. 따라 구성해보고 싶은 부분 화면이 움직이는 속도에 따라 반응하는 컴포넌트 들 텍스트라벨 부터 탭바, 네비게이션까지 사용자가 빠르게 스크롤 할 때와 느리게 할떄가 반응이 달랐습니다. 화면을 아래로 스크롤링 했을 때 탭바가 올라오고, 위로 스크롤링 했을 때 탭바가 내려가는 기능 29TV에 있는 공유하기 버튼 귀욤뽀작하게 SNS버튼으로 구성된 커스텀 공유 버튼을 구현해보고 싶습니다. 이미지 배너를 스크롤링 할 때 자연스럼게 백그라운드 컬러로 fade out 빠른 스크롤링에도 끊김없는 카드로딩과 스크롤링

[swift] swift 기본 문법 스터디 3주차

이미지
[swift] swift 기본 문법 스터디 3주차 이번주는 흐름제어에 대해 정리해 놓으려고 합니다. 가장 정확한 문서는 공식문서라고 생각하고, 링크 를 첨부해 놓겠습니다. 불면증을 위해 한 번 정독했습니다. 반복문 for ~ in 루프상수, 순회대상 루프상수의 생략가능 다중루프 -> 차원을 줄이는 것이 가능? 몇번 돌지 보통은 알지 않을까요? while 조건을 만족하는 동안 실행 한번은 실행을 보장해주는 repeat while 어떻게 만들어 진걸까요? Dictionary Array set 범위데이터 문자열 Sequence Iterator 조건문 if if 키워드 뒤에는 반드시 조건식이 와야합니다. 참 일 경우에는 if 뒤의 구문을 실행합니다. 중첩된 이프문의 조건 정리하는 꿀 팁 아시는 분? guard 조기 종료 참일 때 실행되는 구문이 없다 조건 체크에 사용하면 좋습니다 #available(<플랫폼이름 버전>, <플랫폼이름 버전>, <플랫폼이름 버전>…) switch 일치하는 패턴이 있다면 실행하고 switch문 종료 default 패턴 매칭 제어 전달문 break switch에서 사용, 반복문에서 사용 종료 continue 종료하지 않고 패스! label 신기! fallthrough 다음으로 넘어가지 않음! return 함수와 메소드에서 사용 값을 반환, 종료