28P by neo 10달전 | favorite | 댓글 7개

"Paper" 텍스트 편집기 솔로 개발자의 9년

  • 2015년, 일반적인 풀스택 웹 개발자로서 Apple 개발 세계와는 거리가 멀었음.
  • Mac을 사용하며 독립 개발자들의 앱에 매력을 느껴, 간단하고 우아한 Markdown 편집기인 iA Writer에 영감을 받아 비슷한 앱을 만들기로 결정함.
  • Mac용 네이티브 텍스트 편집기 개발을 위해 Xcode, AppKit, Objective-C 등 새로운 기술 스택 학습 시작.
  • 앱 이름을 Paper로 정하고, 극단적인 미니멀리즘을 추구하여 편집기를 단순한 직사각형으로 디자인함.
  • 2017년 Mac 앱 스토어에 Mac 앱 출시, 2019년에는 iOS 앱 출시.

네이티브 앱을 선택한 이유

  • Electron 앱 대신 네이티브 앱을 선택한 이유는 최상의 사용자 경험 제공을 목표로 했기 때문.
  • 네이티브 앱은 가볍고 빠르며, 텍스트와 관련된 독특한 기능을 구현할 수 있는 더 많은 방법을 제공함.

Objective-C를 선택한 이유

  • 2015년 Swift가 초기 단계였을 때, Objective-C와 Swift로 각각 빈 Xcode 프로젝트를 컴파일하여 .app 패키지를 비교함.
  • Swift 앱은 Swift 런타임이 포함되어 약 5MB였고, Objective-C 앱은 매우 가벼운 100KB 정도였음.
  • 더 가벼운 배포 가능한 앱을 원했기 때문에 Objective-C를 선택함.

서드파티 의존성

  • Paper는 서드파티 의존성이 없음.
  • 모든 것을 직접 구축하여 경쟁자들에게 약간의 우위를 점함.
  • 예를 들어, Paper의 Markdown 파싱 엔진은 맞춤형으로, 전통적인 Markdown 편집기보다 적은 Markdown 구문을 지원함.

비전

  • Paper의 초기 비전은 iA Writer의 핵심 기능을 가지되, 더욱 우아하고 미니멀한 패키지로 만드는 것이었음.
  • 사용자의 주의를 산만하게 하는 요소를 최소화하여 집중력을 높이는 데 초점을 맞춤.
  • 시간이 지나면서 Paper가 미니멀리즘을 유지하면서도 점진적으로 기능을 추가하는 방식으로 시장에서의 위치를 찾아감.

아키텍처

  • Paper의 코드는 두 가지 범위로 구성됨: 애플리케이션 범위문서 범위.
  • 각 범위에 대해 스토리보드를 정의하여 뷰와 위젯을 설명하고 범위 내 모듈을 결합함.
  • 모듈은 앱 내 기능의 일부를 담당하는 Objective-C 클래스로, 기능을 특정 기능과 관련된 하나의 장소에 그룹화함.

크로스플랫폼 코드

  • AppKit과 UIKit은 유사하면서도 많은 부분에서 다름.
  • 차이점을 해결하기 위해 Objective-C의 매크로와 카테고리 기능을 사용함.

디버깅

  • Apple 프레임워크의 경우 코드 대신 문서를 읽어야 하며, 브레이크포인트를 사용하여 컴파일된 스택 트레이스를 분석함.

유료 기능

  • 2015-17년에는 구독이 아직 널리 퍼지지 않았고, 앱 스토어에서는 일회성 결제가 일반적이었음.
  • 사용자 친화적인 방식으로 유료 기능을 제공하고자 하여, 기능적이 아닌 화장적 업그레이드만 유료로 제공함.

가격 책정

  • 처음에는 두 세트의 Pro 기능에 대해 각각 5달러의 일회성 결제로 시작함.
  • 현재는 월 10달러 또는 평생 100달러의 단일 세트로 가격을 책정함.
  • 가격 실험을 통해 사용자들이 알려지지 않은 개발자의 앱에 최대 100달러까지 지불할 의사가 있음을 발견함.

까다로운 부분

  • 텍스트 편집기는 복잡하며, OS 업데이트마다 새로운 텍스트 삽입, 업데이트, 상호 작용 방법이 추가됨.

기믹

  • Things 앱에서 영감을 받은 창 크기 조절 바운스와 같은 즐거운 기능을 추가함.

GN⁺의 의견:

  1. 혁신적인 접근: 개발자는 네이티브 앱 개발에 대한 경험이 없음에도 불구하고, 사용자 경험을 최우선으로 고려하여 Paper를 개발했다는 점이 인상적임. 이는 소프트웨어 개발에서 사용자 중심의 설계가 얼마나 중요한지를 보여줌.
  2. 학습과 성장: 새로운 기술 스택을 배우고 이를 통해 제품을 만들어낸 과정은 초급 소프트웨어 엔지니어에게도 영감을 줄 수 있음. 이는 지속적인 학습과 도전이 개발자로서 성장하는 데 필수적임을 강조함.
  3. 사용자 경험의 중요성: Paper의 성공적인 요소 중 하나는 사용자 경험에 대한 세심한 주의와 미니멀리즘에 대한 집중임. 이는 사용자가 실제로 원하는 것을 이해하고 이를 제품에 반영하는 것이 얼마나 중요한지를 보여줌.

대부분의 애플 개발 문서들이 불친절해서 문서를 잘 뒤져봐야하긴하는데...또 정보가 부족하면 SDK 인터페이스를 뒤져야하는 상황이 많아서...다른의미로 존경스럽네요.

화장적 업그레이드가 뭔가 했는데 원문이 visual changes네요.
화장적이다 라는 단어를 쓰나요? 저는 처음 봤어요.

neo 가 ai bot 이다보니 기계적인 번역이 됐나보네요ㅋㅋ

원문은 cosmetic upgrade네요

그럼 미적 업그레이드 정도가 더 괜찮아보이는데...

롤모델이 될말한 개발자네요

Hacker News 의견
  • "주변부의 세심한 부분들이야말로 마법과 같음"

    • 사용자들은 처음에는 앱의 세밀한 부분들을 눈치채지 못할 수 있지만, 시간이 지나면서 그러한 부분들을 발견하게 됨.
    • 이러한 세심한 추가 기능들이 사용자가 앱을 단순히 좋아하는 것에서 사랑하게 되는 요소로 작용함.
    • 개발자가 사용자를 이해하고 있으며, 제품이 잘 관리되고 있다는 느낌을 줌.
    • Procreate 앱을 예로 들며, 사용자 인터페이스(UI)를 간결하게 만들면서도 발견할 수 있는 숨겨진 기능들이 많음을 칭찬함.
  • "iOS 앱 개발자로서 15년 동안의 경험을 바탕으로 한 훌륭한 글"

    • 네이티브 개발을 고수하고, 제3자 의존성을 배제하며, Objective-C를 사용한 결정들이 좋았음을 언급함.
    • Swift로 전환했지만, 때때로 Objective-C의 장점이 그리워짐.
    • 앱을 다운로드하여 사용해보고, 메뉴 바에 있는 작은 힌트들이 마음에 들었다고 함.
  • "Apple 플랫폼에서의 저/무 의존성 개발 가능성"

    • AppKit/UIKit의 풍부함과 깊이 덕분에 제3자 요소 없이도 완성도 높은 앱을 실용적으로 만들 수 있음.
    • 다른 프레임워크들, 예를 들어 Qt와 비교해도 Apple의 프레임워크가 경쟁력이 있음을 언급함.
  • "Swift의 발전과 플랫폼 내장 또는 바이너리 최적화에 대한 추측"

    • Swift 5부터 ABI(Application Binary Interface) 안정화가 이루어짐.
    • 2014년부터 Swift만 사용하기로 한 결정이 잘 작동하고 있음을 밝힘.
    • SwiftUI에 대해서는 아직 UIKit/AppKit를 대체할 만큼 발전해야 할 부분이 많다고 생각함.
  • "의존성 선택에 대한 불신과 학습의 중요성"

    • 코드를 작성하기 전에 외부 패키지와 라이브러리를 추가하는 것에 대한 반감을 표현함.
    • Apple 생태계의 단점을 긍정적인 학습 경험으로 바꾼 글쓴이의 접근 방식을 높이 평가함.
  • "AppKit과 Mac 개발에 대한 학습 자료와 추천 요청"

    • Mac 개발에 대한 정보를 찾는 데 어려움을 겪고 있음을 언급함.
    • Apple의 최신 문서가 부족하고, 오래된 문서도 Swift 업데이트가 되지 않아 Xcode 자동완성에 의존해야 하는 상황을 설명함.
  • "세부 사항에 대한 주의와 장인정신에 대한 존경"

    • 글쓴이의 세심한 주의와 장인정신을 높이 평가하며, 글이 아름답고 영감을 준다고 칭찬함.
  • "회전하여 실행 취소하는 제스처에 대한 흥미로운 언급"

    • 영화 "닥터 스트레인지"의 주인공이 시간을 되돌리고 앞으로 돌리는 장면을 연상시키는 제스처라고 언급함.
  • "블로그와 앱의 미니멀리즘에 대한 칭찬"

    • 자신이 만든 앱을 사용하며 느끼는 기쁨을 표현하고, vim-motions이나 Neovim 사용 시 비슷한 감정을 느낀다고 함.
  • "Apple 개발 생태계에서 SDK 코드에 대한 접근 부족에 대한 놀라움"

    • 어셈블리 코드를 직접 봐야 한다는 사실에 대해 의아함을 표현하며, 이에 대한 확인을 요청함.