1P by GN⁺ | ★ favorite | 댓글 1개
  • 2006년 여름 개인용 만화 리더 Fiew를 만든 경험이 출발점이 되어, C++와 Windows API로 Photoshop과 비슷한 이미지 편집기 Fedit을 학위 논문 프로젝트로 구현함
  • Fedit은 설치 프로그램, 압축 파일, 레지스트리 키, 추가 런타임 없이 단일 실행 파일로 동작해 제한된 권한의 PC나 USB 드라이브에서도 바로 실행할 수 있었음
  • 인터페이스는 클래식 Photoshop의 작업 흐름을 닮도록 설계됐고, 떠 있는 도구 창, 색상 선택기, 레이어 관리, 되돌리기 히스토리, 이미지 필터, 사용자 정의 픽셀 이동 필터를 포함함
  • 가장 큰 난관은 사용자 인터페이스 재현이었으며, 도구 설정 패널의 스냅/언스냅 동작과 색상·도구 선택기 구현에 많은 시간이 들어감
  • 프로젝트는 논문 성공과 공학 학사 취득으로 이어졌고, 이후 GoldenLine CTO에게 인상을 남겨 대량 이미지 업로드용 WinAPI 앱을 만드는 C++ 일자리로 연결됨

만화 리더 Fiew에서 이미지 편집기 Fedit으로

  • 2006년 초여름, 기존 이미지 리더 앱들이 마음에 들지 않았던 것이 출발점이었음
    • 특히 마우스만으로 독서를 제어할 수 없어 키보드에 계속 손을 뻗어야 하는 점이 방해가 됨
  • 대학에서 C++/Windows API 과정을 마친 직후였고, 여름방학 동안 개인적으로 이상적인 만화 리더를 개발함
  • 이 만화 리더는 Fiew라는 이름을 가짐
  • 2006년 초가을 학위 논문 주제를 정해야 했고, 이미지 뷰어 개발이 순조로웠던 경험 때문에 이미지 편집기도 만들 수 있다고 판단함
  • 당시 Adobe Photoshop을 많이 사용하고 있었기 때문에 목표는 Photoshop과 유사한 편집기가 됨

Fedit의 구현 방식과 배포 제약

  • Fedit은 C++로 작성된 Advanced Image Editor이며, Windows API와 GDI+ 그래픽 라이브러리를 사용함
  • 사용자에게 유리한 배포 형태를 위해 다섯 가지 규칙을 따름
    • 설치 프로그램 없음
    • 압축 파일 없음
    • 레지스트리 키 없음
    • 추가 런타임 없음
    • 단일 실행 파일
  • 결과적으로 설치 없이 바로 동작하고, 제한된 권한의 시스템이나 USB 드라이브에서도 실행 가능하며, 적은 리소스를 사용하는 프로그램이 됨

Photoshop에 가까운 인터페이스와 기능

  • 인터페이스는 클래식 Photoshop처럼 보이도록 신중하게 만들었고, 자주 쓰던 기능을 포함함
  • 주요 기능은 다음과 같음
    • 자유롭게 떠 있는 도구 창
    • 색상 선택기
    • 쉬운 레이어 관리
    • 단계별로 되돌릴 수 있는 히스토리
    • 여러 이미지 필터
    • 직접 픽셀 이동 필터를 인코딩할 수 있는 행렬 인터페이스
  • 이전 프로젝트 Fiew에서 가져온 대규모 이미지 라이브러리 뷰어도 포함함
    • 많은 양의 사진을 빠르고 쉽게 스크롤할 수 있었음

직접 디버깅해야 했던 개발 과정

  • MSDN과 Experts Exchange를 많이 참고했지만, 문제들이 너무 구체적이어서 대부분 직접 분석하고 디버깅해야 했음
  • 학사 논문 마감일을 맞춰야 했기 때문에 마지막 두 달 동안 하루 14시간씩 작업함
  • 가장 까다로운 영역은 사용자 인터페이스였음
    • Photoshop과 최대한 비슷한 작업 흐름을 원했음
    • 도구 설정 패널을 자유롭게 스냅하고 언스냅하는 동작이 특히 어려웠음
    • 색상 선택기와 도구 선택기를 재현하는 일도 쉽지 않았음
  • 프로젝트를 마칠 즈음에는 상당히 지쳤고, WinAPI에 대한 반감도 생김

논문 이후의 결과와 공개 자료

  • 논문은 성공했고, Warsaw University of Technology에서 Bachelor of Science in Engineering 학위를 받음
  • Fedit은 온라인에서 몇몇 긍정적인 리뷰를 받았지만 적극적으로 홍보하지는 않았음
  • 이후 Fiew와 Fedit이 GoldenLine CTO에게 인상을 남겼고, Flickr 클론을 위한 대량 이미지 업로드용 고효율 WinAPI 앱을 만드는 C++ 업무로 이어짐
  • 공개 자료

댓글과 토론

Hacker News 의견들
  • “사용자에게 이익이 되는 다섯 가지 규칙: 설치 관리자 없음, 압축 파일 없음, 레지스트리 키 없음, 추가 런타임 없음, 단일 실행 파일”이라는 문장을 읽고 따뜻하고 행복한 느낌이 들었음
    레지스트리가 왜 존재하는지, 오늘날 Windows 소프트웨어 생태계가 왜 이렇게 돌아가는지는 이해하지만, 예전처럼 대부분의 데스크톱 소프트웨어가 단순했던 시절이 정말 그리움
    요즘은 가능하면 포터블 설치를 쓰고, 이런 방식이 더 흔했으면 좋겠음. 설정을 완전히 복구할 수 있을지 모르는 시간·불편·불확실성 때문에 Windows 재설치를 적극적으로 피하게 됨

    • 설치 관리자가 하는 유용한 일도 많고, 최종 사용자 상당수는 실제로 원함. 예를 들면 시작 메뉴에 바로가기를 추가해 찾거나 검색할 수 있게 하고, 파일 형식을 연결하고, Windows 프로그램 목록에 등록하는 것 등임
      예전에는 포터블 소프트웨어를 아주 좋아했지만, 요즘은 둘 다 제공되면 오히려 설치 관리자를 선호함. 아니면 검색 가능하게 하려면 시작 메뉴에 직접 추가해야 하기 때문임
      다만 레지스트리 키는 싫음. 운영체제를 재설치하면 자주 사라지기 때문임. 설정은 그냥 %appdata% 에 보관해 줬으면 함
    • 그래서 Go를 좋아함. 단일 실행 파일이라 다른 사람이 도구를 쓰기 쉬워짐
      대안으로는 NSIS로 단일 실행 파일을 패키징해서 실행 전에 임시 디렉터리에 전부 풀어내는 방식도 씀
      Windows 레지스트리는 일관성 없고 설계가 나쁜 잡동사니에 가깝다고 봄. 비교하자면 Gnome의 레지스트리는 잘 설계돼 있음. 키 설명, 제한이 있는 값 선택지, 기본값 표시 같은 건 좋은 사용자 인터페이스 설계임
      Windows 그룹 정책과 레지스트리 매핑만 봐도 같은 논리 구조가 제각각이고, 키에 이중 부정까지 섞여 있음
    • 레지스트리의 원래 목적은 COM이 GUID를 보고 DLL 파일 위치를 찾게 해 주는 것이었음. 그러면 COM이 객체 인스턴스를 만들 수 있었음
      지금도 HKEY_CLASSES_ROOT에서 그 흔적을 볼 수 있음
      기술적으로는 레지스트리 없이도 객체를 만들 수 있음. DLL을 로드한 뒤 내보낸 함수를 호출해 Factory 객체를 만들고, 그 Factory 객체로 인스턴스를 만들면 됨. COM 자체가 하는 일이 그 방식임
    • 그런 단순하고 가벼운 설계가 나에게도 와닿았음
      글도 정말 멋진 회고였음. 다만 초반에 저자가 살짝 암시한 어려움들을 더 깊게 다뤘다면 좋았을 것 같음. 그래도 사소한 트집일 뿐이고, 글은 아주 좋으며 실제로 꽤 인상적인 작업으로 보임
    • 라이브러리를 정적 컴파일로 포함하지 않으면서 단일 바이너리 앱을 만드는 최선의 길이 뭔지는 잘 모르겠음. 라이선스 때문에 보통은 감당하기 어려워짐
  • Photoshop에는 기능이 정말 많아서, 이미지 필터 몇 개만으로는 재현이라고 보기 어려움

    • 하지만 사용자 인터페이스를 제대로 맞추는 건 매우 어렵고 매우 중요함
      2006년의 GIMP도 기능은 엄청 많았지만, Photoshop의 인터페이스와 비교하면 정말 끔찍했음
    • 그래도 학부 작업치고는 매우, 매우 인상적임
    • 여기서 “재현”을 문자 그대로 받아들이라는 뜻은 아닌 것 같음
    • 맞음. Photopea가 가장 가까운 복제 시도라고 보지만, 그것도 많은 기능이 빠져 있음
    • “기본 이미지 편집기를 만들었다”고 하면 당연히 그렇게 인상적으로 들리지는 않음. 글이 이렇게 시작하는 걸 보면 놀랍지도 않음

      As I’m getting older I look back on all the things I’ve done as a creative developer, and I see so many cool projects!
      참 겸손하네…

  • 이 멋진 프로젝트로 바로 가는 링크도 있어야 함
    https://github.com/f055/fedit-image-editor

  • “홍보는 하지 않았다. 몇 달 뒤 C++ 일자리를 얻었다. 결국 그 모든 노력이 보상받은 셈이다”라는 대목이 흥미로움
    우리는 본능적으로 힘들게 한 일은 보상받아야 한다고 알지만, 오픈소스 개발자들이 특히 프로덕션에서 널리 쓰이는 코드에 많은 노력을 쏟고도 실제 보상을 거의 받지 못하는 일이 너무 잦다는 게 아쉬움
    그래서 평판 보상을 찾거나, NPM이 “이 라이브러리 저자에게 기부해 보는 건 어떨까요” 같은 기능을 넣고, GitHub가 Patreon 연동을 만든 것 같음
    순진하지만 성실한 젊은 창작자들을 이용하지 않는, 지금보다 더 나은 모델이 필요함

  • 2000년대 초에 pixel32, 나중에는 Pixel Studio Pro라는 프로젝트가 있었음. 정말 괜찮아 보였고 얼리 액세스로 판매됐음
    하지만 결국 베이퍼웨어가 됐고, 돈을 낸 사람들은 크게 화가 났으며, 만든 사람은 빠르게 영웅에서 악당으로 바뀌었음
    https://discuss.haiku-os.org/t/pixel-studio-pro-in-past-call...

  • 글쓴이가 Warsaw University of Technology를 졸업했다고 했는데, 여기서는 항상 꽤 좋은 학교 중 하나로 여겨졌음
    그와 별개로 당시의 학위 논문이 지금과 얼마나 달랐는지도 눈에 띔. 최근에 다른 큰 도시의 공과대학에서 논문을 썼는데, 우리 공학사 논문의 90%는 수준이 꽤 낮았고 내 것도 포함됨

    • 요즘이라고 크게 다를까 싶음. 알기로는 목표가 분야를 발전시키는 게 아니라, 학사나 석사 학위를 주는 사람들에게 논문 형태의 결과물을 만들 수 있음을 증명하는 데 있음
      돋보이는 논문도 있겠지만, 대부분은 아마 꽤 지루할 것임
  • 그래서 Windows를 좋아함. 특정 틈새를 잘 채우는 작고 공개된 소스의 소프트웨어가 엄청나게 많음
    예전에는 sourceforge.net과 freshmeat, 이름이 그거였던 것 같은데, 그런 곳을 돌아다니며 찾아보곤 했음

  • Phonegap에서 일하던 친구가 10년 전쯤 Adobe에 인수된 뒤, 재미 삼아 곧바로 Photoshop을 JavaScript로 포팅했음

    • 반대표에 불평하려는 건 아니지만, Hacker News가 싫어할 만한 이야기로 보이는 게 꽤 이상함
      소프트웨어 엔지니어의 내부 해킹 프로젝트 이야기는 흥미로울 거라고 생각했는데, 뭐 어쩔 수 없음
  • 사람들이 만들어 놓고 세상에 알리지 않는 것들이 있음. GitHub에 올라와 있어서 다행이고, 정말 인상적임