전체 글 251

[Swift] Code Smell에 관하여....0

프롤로그코드를 작성할 때면 코드 한 줄 한 줄은 치열한 고민이 있어야 한다. 시간 내에 빨리 제출해야 하는 테스트 패스용 코드가 아닌 이상은 각 코드의 한 줄 한 줄은 고민이 있어야 한다. 그리고 경력자의 코드 한 줄 한 줄이 대충 짜인 것처럼 보일지라도 경력동안 해 온 고민들이 합쳐져 만들어진 결과물이어야 한다. 강연을 하면서 'Loop 혹은 Branch를 위한 코드가 비단 for와 if 뿐만이 아닌 것은 while과 switch의 용도가 분명하기 때문이다'라는 말을 자주 한다. 내가 작성하는 코드는 1차적으로 창조한 사람의 의도를 읽어야 한다. 가령 Python을 예로 들면, 귀도 반 로섬이 Python을 만들 때에 담고자 했던 철학을 이해해야 한다. Java라면 제임스 고슬링이 이 프로젝트를 시작했..

[FP] 함수형/선언형에 대한 고찰

프롤로그요즘 AI Transformation으로 IT 사업이 새로운 국면으로 넘어가는 것 같다. 그래서 최근에 이와 관련된 글도 작성했었다. 그런데 이번에는 함수형과 선언형에 대해서 얘기해보고 싶다. 이는 오래된 주제이기도 하고, 필자가 2016년부터 깊게 파고 있는 주제이다. 필자가 짠 코드가 의도된 대로만 동작하도록 제어하고 싶은 맘에서 학부 시절부터 디자인 패턴과 소프트웨어 공학에 심취했던 나였다. 그런 필자에게 새롭게 다가왔던 개념은 함수형이었다. 함수형은 내가 작성한 코드가 내가 의도한 대로 코드가 동작하도록 하는 강력한 무기가 되었다. 발생할 수 있는 예외 케이스 또한 내가 정의한 에러 코드를 통해서 예측 가능한 범주 내로 가이드해주었다. 진정한 함수형/선언형 코드를 작성했다면, 심지어 코드 ..

[Architecture] 미디어 플레이어의 구조에 대한 고찰

Background처리해야 할 데이터가 많은 경우에는 멀티 코어 프로세서의 환경을 적극 활용하여, 최대한 가용한 리소스를 극한까지 사용해야 할 필요가 있다. 미디어 처리를 최대한 빠르게 처리하여 사용자에게 seemless 한 사용자 경험을 제공하는 것이다. 이를 위해서 여러 가지의 방법이 동원되게 된다. 그리고 소프트웨어 구조에 대해서 얘기하자면, 소프트웨어 구조는 확장성이 가능하도록 구현되어야 한다. 기본적으로 응집도를 높이고 결합도를 낮추라는 말을 많이 들었을 것이다. 예전부터 나는 이에 대해 어마무시하게 집중을 했다. 그리고 실제로 많이 중요하다. 실제로 회사에서 소속되어 개발을 하다 보면, 이를 무시하고 거대한 코드 뭉치를 만들어서 손도 못 대도록 구현할 때가 있다. 그리고 본인이 만든 코드 뭉치..

Engineering/OS 2025.11.17

[iOS] 센서 이야기 - 자이로스코프

Background스마트폰에는 여러 가지의 센서들이 들어가 있다. 자기력계, 가속도계, 자이로스코프, 기압계, 고도계, 위치센서(GPS, Glonass, Galileo, Beidou), 조도센서, 근접센서 등이 대표적이다. 모든 센서들은 자기들의 영역이 있다. 자기력계는 자기장 측정, 가속도계는 가속력 측정, 자이로스코프는 기울기, 기압/고도/조도/근접 등등 모두 현실 세계의 물리량을 수치로 환산하여 OS에 제공하는 역할을 한다. 이번에는 그중에서도 자이로스코프와 가속도계의 협업에 대해서 얘기해보려고 한다. Gyroscope누구냐, 넌?아래는 일반적으로 우리가 보는 자이로스코프의 이미지이다. 원래의 자이로스코프는 중심에 횡방향으로 고속 회전하는 회전판이 있다. 정확한 원리의 이름이 이제는 기억나지 않으나..

[iOS] AVFoundation Foundation

PrologAsset과 Track의 이해asset은 하나 혹은 다수의 track으로 이루어져있다. track은 비디오 프레임, 오디오, 자막 등으로 재생에 이용되는 개별 컨텐츠를 의미한다. 이러한 컨텐츠들이 asset이라는 컨테이너에 담긴다. 플레이어는 asset이라는 컨테이너를 읽어와서, 각 track을 적절한 시간에 표시하여 재생한다. AVAsset과 AVPlayerItem의 이해AVAsset은 미디어를 담은 컨테이너인 asset의 데이터를 읽어오고 편집 등을 하기 위한 용도로 사용한다. 편집된거나 합성한 데이터를 읽거나 쓰기 위해서 사용되는 미디어 파일 그 자체라고 생각하면 된다. AVPlayerItem은 AVAsset을 재생하기 위해 사용하는 데이터 모델로서, 플레이어에서 재생에 관한 모든 제어..

[iOS] Core Video Foundation

Prolog레퍼런스 클래스 - 해당 타입의 기반이 되는 클래스로 동일한 기능의 사용을 위해서 상속 받아야하는 클래스인터페이스 (or 프로토콜) - 메소드의 Function Type을 선언하여 하위 구현체들의 용도/행위를 정의하기 위한 추상클래스 About Video비디오에 대한 이해비디오는 기본적으로 정지 이미지(Frame) 가 시간 축을 따라 연속적으로 표시하면서 움직임을 인식하게 만드는 시각적 매체입니다. 하나의 비디오는 수많은 이미지 프레임으로 구성되며, 이 프레임들은 일정한 속도(프레임 레이트, fps)로 표시됩니다. 예를 들어 1초당 30장의 이미지를 순차적으로 보여주는 영상을 30fps라고 합니다. 이때 각 이미지(Frame)는 약 33.3ms 간격으로 화면에 표시되며, 인간의 시각은 이 빠른..

[iOS] Accelerate computing with Metal

BackgroundCreateML/CoreML이 나오면서 Apple 플랫폼에서 ML model과 관련된 학습과 이용이 가능해졌다. 이러한 ML 관련 API의 등장과 함께 내가 관심을 가지기 시작한 것이 있었으니..... Metal Perfomance Shader (이하, 'MPS')이다. MPS는 ML의 백엔드에서 이산형 부동소수점 데이터의 병렬 연산을 위해서 사용된다고 한다. 만약에.... 우리가 데이터의 연산 처리를 하는데, 고도의 연산 처리가 아니면서 각 데이터의 값이 서로 연관이 없을 때는 GPU의 병렬 연산 처리를 사용한다면 속도와 성능 개선에 큰 기여를 할 수 있을 것이다. 2016년부터 함수형 프로그래밍을 공부하면서, 극한의 병렬/비동기 연산에 대해서 어떻게 활용하고 적용할지에 대해서 고민을..

[AI] LLM : AI Literacy에 대한 고찰

Background위키피디아에 AI Literacy (이하, 'AI 리터러시')를 찾아보았다. "개인이 AI 기술을 비판적으로 평가하고 AI와 효과적으로 커뮤니케이션 및 협업하며, 온라인, 가정 및 직장에서 AI를 도구로 사용할 수 있는 일련의 역량"이라고 정의한다. AI 리터러시는 2가지의 측면으로 구상이 가능할 것 같다. 첫째는 'AI의 작동 원리를 이해하고 본인이 원하는 답변을 이끌어 내도록 환경을 구축하고 활용할 수 있는가?'이고, 둘째는 'AI가 처리한 결과물에 대해서 무조건적인 믿음이 아닌 비판적 사고로 받아들이고, 이를 평가 및 판단할 수 있는가'이다. 우리는 이제는 더 이상 괄시할 수 없는 AI에 대해서 보다 활용을 잘하기 위해서, 'AI 리터러시'라는 과제에 대해서 좀 더 고민하고 공부를..

Engineering/Issue 2025.10.20

[iOS] SwiftUI : View update에 대한 고찰

BackgroundSwiftUI는 선언형 기반으로 구현하도록 설계되어 있다. 이 선언형의 관점을 이해하기 위해서는 함수형 프로그래밍에 대한 깊이있는 이해가 필요하다. Immutable type을 왜 쓰는지, Value type을 왜 사용하는지, 순수함수를 왜 쓰고 어떻게 비지니스 로직을 구현해야 하는지 등이다. 그리고 SwiftUI의 동작 체계에 대한 이해도 필요하다. View의 업데이트는 어떻게 이루어지는지, 이에 대한 최적화 작업은 어떻게 해야 하는지 등이다. SwiftUI를 가볍게만 사용하던지라 이에 대한 이해가 부족했고, 그러기에 이에 대해서 정리하려고 합니다. SwiftUI가 iOS 13부터 지원했지만, 최근까지 버그도 많고 아직 기술 자체가 덜 성숙했던지라 어떤 변화가 생겼는지 정도만 관심을 ..

[iOS] Swift Concurrency Foundation

async-await 비동기 함수 혹은 메소드 (이하 '비동기 함수')는 다른 비동기 방법 (GCD, Operation 등)과 몇가지 다른 차이점을 보인다. return 및 thorows 등을 일반적인 함수들과 같이 지원한다. 이는 유연하고 확장 가능한 비동기 실행 방법을 제공한다. 그리고 실행 흐름을 busy wait 하지도 않고 suspend 상태로 남겨두었다가 마저 실행된다. suspend 상태로 남겨두는 곳을 suspension point로 칭하기도 하는데, 이를 await라는 키워드를 통해서 표시한다. thread는 이 suspension point를 만나면 실행의 흐름을 넘기고 다른 코드를 즉시 실행하는 동작을 수행한다. async-let 'async let'을 사용하면 비동기 함수의 실행을..

[iOS] SwiftUI Foundation

ProtocolsApp 프로토콜 앱의 구조를 설정하기 위한 프로토콜. @main을 통해서 main() 메소드의 기본 구현을 통해 entry point를 제공한다. Scene 프로토콜을 구현하여 App의 body를 구현한다. 각 scene은 각각의 root view와 life cycle을 가진다. 모든 scene을 넘어서 데이터를 공유하기 위해서 App을 구현한 곳에 StateObject 등을 구현하여 사용하는 방법이 있다. 공유하는 데이터의 성격에 따라 ObserbedObject나 EnvironmentObject 등을 사용한다. @preconcurrency @MainActor는 기본적으로 상속됨으로써 isolation 처리되어 있다. @MainActor를 opt out 처리하기 위해서는 extension..

[Kotlin] 함수형으로 데이터 구조 만들기

주요 개념 - 함수형 개념을 사용하여 List를 구현 - 순수 함수 (Pure function) - 꼬리 재귀 (Tail recursion) - 고차 함수 (High order function) - 패턴 매칭 & 코틀린 매칭 - 이진트리를 직접 구현 아래의 코드는 단일 연결리스트의 구조 정의로, 비어있는 리스트와 값이 들어가 있는 리스트를 생성할 수 있는 형태이다. 값을 넣는 head와 리스트를 연결할 수 있는 tail 형태로 이루어져있다. 다형적으로 사용하기 위해서 A로 타입을 추상화 했다. sealed class List object Nil: List() data class Cons(val head: A, val tail: List): List() 아래는 companion object를 통해서 Jav..

Programming/Kotlin 2023.09.06

[Kotlin] 함수형 프로그래밍 시작하기

주요 개념 - 꼬리 재귀 함수를 이용한 루프 작성 - 고차 함수 (High-order function) - 타입 추상화 순수함수 만을 사용하여 프로그래밍을 하는 것이 함수형 프로그래밍의 기본이다. 그럼 순수함수만 이용해서 루프를 구현하라고 하면 대부분의 사람들은 어려워할 것이다. 이를 위해서 우리는 꼬리 재귀 함수를 사용한다. 아래와 같이 피보나치 함수를 꼬리재귀를 이용해서 짜보자. 피보나치 말고도 구구단 출력이나 기타 수열 문제들을 꼬리 재귀를 통해서 해결해보도록 한다. 재귀함수는 오로지 매개변수만을 참조하여 처리하도록 구현한다. 즉, 순수함수를 이용한 재귀 호출로 루프를 구현하는 것이다. fun factorial(i: Int): Int { fun go(n: Int, acc: Int): Int = if..

Programming/Kotlin 2023.09.05

[Kotlin] 함수형 프로그래밍이란? (순수함수)

Side effect를 유발하는 코드 - 블럭 외부에서 변수를 변경하는 경우 (공유 자원) - 메모리에 직접 접근하여 값을 변경하는 경우 (공유 자원) - 객체에 필드를 설정하는 경우 (공유 자원) - 예외를 던지거나 발생해서 프로그램을 중단 (실행 흐름) - 콘솔 출력이나 사용자의 입력 대기 (실행 흐름) - 파일을 입출력 (공유 자원) - 화면 출력 (공유 자원 /. 실행 흐름) 위와 같은 Side effect를 줄이는 방법으로 프로그래밍을 하도록 한다. IO 수행, 오류 처리, 데이터 변경 등의 처리를 보다 제한적이고 안전한 방법으로 한다. 이를 위해 함수형 프로그래밍을 살펴본다. 함수형 프로그래밍을 하기 위해서는 순수 함수를 이해하는 것이 중요하다. 위의 Side effect를 유발하는 코드의 공..

Programming/Kotlin 2023.09.05

[Life] '8년 10개월'의 개발자 소회.1 - 회고록

Prolog 3. 기사, Knight (2017~2019)나의 개발자로서의 커리어의 여정은 세 번째 회사에 당도하기에 이른다. 세 번째 회사는 나의 커리어의 전환점이자, 내가 가지고 왔던 생각과 활동들을 모두 할 수 있게 해 준 회사였다. 처음으로 이 회사에서 임원을 하고 싶다는 생각이 들게 만들었던 회사인 것 같다. 물론 결론부터 말하자면 Tech Lead까지 맡았으나, Manager로서의 트랙은 이행하기 전에 퇴사했다. 워낙 욕심도 많았고 책임감도 많았던 지라, 3번째 회사에서는 직책이 많을 때는 겸직을 포함해서 5가지의 직책을 수행한 적도 있었다. 그저 손만 들어주면 뭐든 시키는 회사가 어떤 때는 좋았으나, 어떤 때는 야속했던 애증의 관계였던 것 같다. 세 번째 회사에 와서 가장 먼저 했던 일은…...

Tips/Life 2022.06.06

[Life] '8년 10개월'의 개발자 소회.0 - 회고록

사내 발표 자료 정리하면서 영어사전 뒤져보다가 무슨 바람이 불었는지..... 그동안의 개발자 생활을 소회 해보고 싶어졌다. 여러 강연과 술자리에서 많이 했던 얘기들이라 대부분의 주변 분들은 지루해할지도 모르지만, 어리다면 어리고 늙었다면 늙은 한 개발자의 소회 정도로 지나가면서 심심할 때 읽을만한 글이 되기를 바라며 적어본다. 1. 영링, Youngling (2010~2013) 2010년은 군대에서 전역을 한 해이다. 나는 이때부터 인생이 뭔가 빠르게 진행되는 편이었던 것 같다. (* 훨씬 빠른 분들이 주변에 있는지라, 빠르다는 말을 입에서 꺼내지는 잘 못 한다....) 분대장은 일병 때 달았던 것으로 기억한다. 상병 말쯤엔가 분대장을 넘겨주고 인생에 대한 고민을 시작했다. 열심히라면 열심히 살았고, 놀..

Tips/Life 2022.06.01

[Apple] WWDC 2018 키노트 요약

메인 키노트 요약Welcome home, developers77개국 개발자가 모임전세계 2천만명의 애플 개발자매주 5억명의 앱스토어 방문자iOSIos11 81% 설치 : 안드로이드 6% – 만족도 95%Ios11이 동작하는 모든 기기에서 ios12가 동작 할 수 있다.구형 기기를 target으로 성능 향상 : 앱 런치 40%, 키보드 50%, 카메라 70%, share sheet 2배, overload 환경에서 앱 런치 2배ARKit : 픽사와 새로운 AR 파일 포맷 만듦 -> USDZ어도비 CC에서 USDZ 지원Measure : 센서를 이용한 측정 앱 (길이, 넓이 등)ARKit 2 : 멀티유저 증강현실 지원Photo : search suggestion (장소, 카데고리, 이벤트 등), for you ..

WWDC/2018 2018.10.14