28 คะแนน โดย GN⁺ 2024-01-06 | 7 ความคิดเห็น | แชร์ทาง WhatsApp

9 ปีของนักพัฒนาเดี่ยวผู้อยู่เบื้องหลังโปรแกรมแก้ไขข้อความ "Paper"

  • ในปี 2015 เขาเป็นนักพัฒนาเว็บฟูลสแตกทั่วไป และยังห่างไกลจากโลกการพัฒนาของ Apple
  • หลังจากใช้ Mac แล้วรู้สึกหลงใหลในแอปของนักพัฒนาอิสระ จึงตัดสินใจสร้างแอปคล้ายกันโดยได้แรงบันดาลใจจาก iA Writer ซึ่งเป็นโปรแกรมแก้ไข Markdown ที่เรียบง่ายและสง่างาม
  • เพื่อพัฒนาโปรแกรมแก้ไขข้อความแบบเนทีฟสำหรับ Mac เขาจึงเริ่มเรียนรู้เทคโนโลยีสแตกใหม่อย่าง Xcode, AppKit และ Objective-C
  • เขาตั้งชื่อแอปว่า Paper และออกแบบตัวแก้ไขให้เป็นเพียงสี่เหลี่ยมผืนผ้าเรียบง่าย โดยมุ่งสู่ความมินิมัลแบบสุดขั้ว
  • เปิดตัวแอป Mac บน Mac App Store ในปี 2017 และเปิดตัวแอป iOS ในปี 2019

เหตุผลที่เลือกแอปแบบเนทีฟ

  • เขาเลือกแอปแบบเนทีฟแทนแอป Electron เพราะมีเป้าหมายที่จะมอบประสบการณ์ผู้ใช้ที่ดีที่สุด
  • แอปเนทีฟมีน้ำหนักเบาและรวดเร็วกว่า และเปิดทางให้สร้างฟีเจอร์เฉพาะทางเกี่ยวกับข้อความได้มากกว่า

เหตุผลที่เลือก Objective-C

  • ในปี 2015 ตอนที่ Swift ยังอยู่ในช่วงเริ่มต้น เขาคอมไพล์โปรเจกต์ Xcode เปล่าทั้งใน Objective-C และ Swift แล้วเปรียบเทียบแพ็กเกจ .app
  • แอป Swift มี Swift runtime รวมอยู่ด้วยจึงมีขนาดราว 5MB ขณะที่แอป Objective-C เบามาก อยู่ที่ประมาณ 100KB
  • เขาจึงเลือก Objective-C เพราะต้องการแอปที่แจกจ่ายได้โดยมีขนาดเบากว่า

การพึ่งพาไลบรารีภายนอก

  • Paper ไม่มีการพึ่งพาไลบรารีภายนอก
  • เขาสร้างทุกอย่างขึ้นมาเอง ทำให้มีข้อได้เปรียบเล็กน้อยเหนือคู่แข่ง
  • ตัวอย่างเช่น เอนจิน parsing ของ Markdown ใน Paper เป็นแบบเขียนขึ้นเอง และรองรับไวยากรณ์ Markdown น้อยกว่าตัวแก้ไข Markdown แบบดั้งเดิม

วิสัยทัศน์

  • วิสัยทัศน์เริ่มต้นของ Paper คือการมีฟังก์ชันหลักของ iA Writer แต่บรรจุอยู่ในรูปแบบที่สง่างามและมินิมัลยิ่งกว่า
  • เขามุ่งลดสิ่งรบกวนสมาธิของผู้ใช้ให้น้อยที่สุด เพื่อช่วยให้มีสมาธิมากขึ้น
  • เมื่อเวลาผ่านไป Paper ก็ค่อย ๆ หาตำแหน่งของตัวเองในตลาด ด้วยการคงความมินิมัลไว้พร้อมเพิ่มฟีเจอร์อย่างค่อยเป็นค่อยไป

สถาปัตยกรรม

  • โค้ดของ Paper ประกอบด้วย scope สองประเภท: application scope และ document scope
  • สำหรับแต่ละ scope เขากำหนด storyboard เพื่ออธิบาย view และ widget และเชื่อม module ภายใน scope นั้นเข้าด้วยกัน
  • module คือคลาส Objective-C ที่รับผิดชอบส่วนหนึ่งของฟังก์ชันในแอป โดยจัดกลุ่มความสามารถให้รวมอยู่ในที่เดียวตามหน้าที่เฉพาะ

โค้ดข้ามแพลตฟอร์ม

  • AppKit และ UIKit มีความคล้ายกัน แต่ก็แตกต่างกันในหลายจุด
  • เขาใช้ macro และ category ของ Objective-C เพื่อจัดการกับความแตกต่างเหล่านั้น

การดีบัก

  • สำหรับเฟรมเวิร์กของ Apple เขาต้องอ่านเอกสารมากกว่าการอ่านโค้ด และใช้ breakpoint เพื่อวิเคราะห์ stack trace ที่คอมไพล์แล้ว

ฟีเจอร์แบบเสียเงิน

  • ในช่วงปี 2015-17 โมเดลสมัครสมาชิกยังไม่แพร่หลาย และการจ่ายเงินครั้งเดียวเป็นเรื่องปกติในแอปสโตร์
  • เขาต้องการนำเสนอฟีเจอร์เสียเงินในรูปแบบที่เป็นมิตรต่อผู้ใช้ จึงกำหนดให้มีเฉพาะการอัปเกรดด้าน ความสวยงาม เท่านั้นที่ต้องจ่ายเงิน

การตั้งราคา

  • ช่วงแรกเริ่มด้วยการจ่ายครั้งเดียว 5 ดอลลาร์ สำหรับฟีเจอร์ Pro สองชุดแยกกัน
  • ปัจจุบันตั้งราคาเป็นชุดเดียวที่ 10 ดอลลาร์ต่อเดือน หรือ 100 ดอลลาร์ตลอดชีพ
  • จากการทดลองด้านราคา เขาพบว่าผู้ใช้ยินดีจ่ายได้สูงสุดถึง 100 ดอลลาร์สำหรับแอปจากนักพัฒนาที่ยังไม่เป็นที่รู้จัก

ส่วนที่ยาก

  • โปรแกรมแก้ไขข้อความมีความซับซ้อน และทุกครั้งที่ OS อัปเดต ก็จะมีวิธีใหม่ ๆ สำหรับการแทรก อัปเดต และโต้ตอบกับข้อความเพิ่มเข้ามา

ลูกเล่น

  • เขาเพิ่มฟีเจอร์สนุก ๆ เช่น window resize bounce ที่ได้แรงบันดาลใจจากแอป Things

ความเห็นของ GN⁺:

  1. แนวทางที่น่าสนใจ: แม้นักพัฒนาจะไม่มีประสบการณ์ด้านการพัฒนาแอปเนทีฟมาก่อน แต่ก็พัฒนา Paper โดยให้ความสำคัญกับประสบการณ์ผู้ใช้เป็นอันดับแรก ซึ่งน่าประทับใจและแสดงให้เห็นว่าการออกแบบที่ยึดผู้ใช้เป็นศูนย์กลางสำคัญเพียงใดในงานพัฒนาซอฟต์แวร์
  2. การเรียนรู้และการเติบโต: กระบวนการเรียนรู้เทคโนโลยีสแตกใหม่และสร้างผลิตภัณฑ์ขึ้นมาจากสิ่งนั้น สามารถเป็นแรงบันดาลใจให้แม้แต่วิศวกรซอฟต์แวร์ระดับเริ่มต้น และตอกย้ำว่าการเรียนรู้อย่างต่อเนื่องและการกล้าท้าทายตัวเองเป็นสิ่งจำเป็นต่อการเติบโตของนักพัฒนา
  3. ความสำคัญของประสบการณ์ผู้ใช้: หนึ่งในองค์ประกอบที่ทำให้ Paper ประสบความสำเร็จคือความใส่ใจอย่างละเอียดต่อประสบการณ์ผู้ใช้และการโฟกัสที่ความมินิมัล ซึ่งแสดงให้เห็นว่าการเข้าใจสิ่งที่ผู้ใช้ต้องการจริง ๆ และสะท้อนสิ่งนั้นลงในผลิตภัณฑ์สำคัญเพียงใด

7 ความคิดเห็น

 
woung717 2024-01-06

เอกสารสำหรับนักพัฒนาของ Apple ส่วนใหญ่ไม่ค่อยเป็นมิตร เลยต้องคอยค้นเอกสารอย่างละเอียดอยู่บ่อย ๆ... แล้วถ้าข้อมูลยังไม่พอ ก็ยังมีหลายครั้งที่ต้องไปไล่ดูอินเทอร์เฟซของ SDK อีก... น่านับถือจริง ๆ ในอีกความหมายหนึ่งนะครับ

 
ndrgrd 2024-01-06

สงสัยว่าอัปเกรดเชิงตกแต่งคืออะไร แต่พอไปดูต้นฉบับแล้วเป็น visual changes

มีการใช้คำว่าเชิงตกแต่งแบบนั้นกันด้วยเหรอครับ? ผมเพิ่งเคยเห็นเป็นครั้งแรก

 
geeker 2024-01-08

ดูเหมือนว่าเพราะ neo เป็น ai bot เลยกลายเป็นการแปลแบบแข็ง ๆ ไปหน่อยนะครับ 555

 
apkas 2024-01-07

ต้นฉบับคือการอัปเกรดด้านรูปลักษณ์

 
cosine20 2024-01-08

ถ้าอย่างนั้นก็ดูเหมือนว่าการอัปเกรดด้านความสวยงามน่าจะดีกว่านะ...

 
ragingwind 2024-01-06

เป็นนักพัฒนาที่น่าเอาเป็นแบบอย่างจริง ๆ

 
GN⁺ 2024-01-06
ความเห็นจาก Hacker News
  • "รายละเอียดเล็กๆ น้อยๆ ตรงขอบนี่แหละที่เหมือนเวทมนตร์"

    • ผู้ใช้อาจยังไม่สังเกตรายละเอียดปลีกย่อยของแอปในตอนแรก แต่เมื่อเวลาผ่านไปก็จะค่อยๆ ค้นพบสิ่งเหล่านั้น
    • ฟีเจอร์เสริมที่ใส่ใจรายละเอียดเหล่านี้เป็นปัจจัยที่ทำให้ผู้ใช้จากแค่ชอบแอป กลายเป็นรักแอปได้
    • มันให้ความรู้สึกว่านักพัฒนาเข้าใจผู้ใช้ และตัวผลิตภัณฑ์ก็ได้รับการดูแลอย่างดี
    • ยกแอป Procreate เป็นตัวอย่าง พร้อมชื่นชมว่าทำ UI ให้เรียบง่าย แต่ก็ยังมีฟีเจอร์ซ่อนอยู่มากมายให้ค้นพบ
  • "เป็นบทความที่ยอดเยี่ยมจากประสบการณ์ 15 ปีในฐานะนักพัฒนาแอป iOS"

    • กล่าวว่าการยึดแนวทาง native development, ตัดการพึ่งพา third-party และเลือกใช้ Objective-C เป็นการตัดสินใจที่ดี
    • แม้จะย้ายไปใช้ Swift แล้ว แต่บางครั้งก็ยังคิดถึงข้อดีของ Objective-C
    • บอกว่าได้ดาวน์โหลดแอปมาลองใช้ และชอบคำใบ้เล็กๆ ใน menu bar
  • "ความเป็นไปได้ของการพัฒนาแบบพึ่งพาน้อย/ไม่พึ่งพาเลยบนแพลตฟอร์ม Apple"

    • ด้วยความสมบูรณ์และลุ่มลึกของ AppKit/UIKit จึงสามารถสร้างแอปคุณภาพสูงได้อย่างใช้งานจริงโดยไม่ต้องพึ่งองค์ประกอบจากภายนอก
    • ยังกล่าวด้วยว่าเมื่อเทียบกับเฟรมเวิร์กอื่นๆ เช่น Qt แล้ว เฟรมเวิร์กของ Apple ก็ยังแข่งขันได้ดี
  • "พัฒนาการของ Swift และการคาดเดาเกี่ยวกับการฝังไว้ในแพลตฟอร์มหรือการปรับแต่งระดับไบนารี"

    • Swift 5 เป็นต้นมา ABI (Application Binary Interface) ได้มีเสถียรภาพแล้ว
    • ระบุว่าการตัดสินใจใช้ Swift เพียงอย่างเดียวตั้งแต่ปี 2014 นั้นได้ผลดี
    • สำหรับ SwiftUI ยังมองว่ายังมีอีกมากที่ต้องพัฒนาก่อนจะมาแทน UIKit/AppKit ได้
  • "ความไม่ไว้วางใจในการเลือก dependencies และความสำคัญของการเรียนรู้"

    • แสดงความไม่ชอบต่อการเพิ่มแพ็กเกจและไลบรารีภายนอกก่อนที่จะเริ่มเขียนโค้ด
    • ชื่นชมแนวทางของผู้เขียนที่เปลี่ยนข้อเสียของ ecosystem ของ Apple ให้เป็นประสบการณ์การเรียนรู้ในทางบวก
  • "การขอคำแนะนำและแหล่งเรียนรู้เกี่ยวกับ AppKit และการพัฒนา Mac"

    • กล่าวว่าตนเองประสบปัญหาในการหาข้อมูลเกี่ยวกับการพัฒนา Mac
    • อธิบายว่าส่วนเอกสารล่าสุดของ Apple ยังไม่เพียงพอ และเอกสารเก่าก็ไม่ได้อัปเดตให้รองรับ Swift ทำให้ต้องพึ่ง Xcode autocomplete
  • "ความใส่ใจในรายละเอียดและความเคารพต่อความเป็นช่างฝีมือ"

    • ชื่นชมความใส่ใจอย่างละเอียดและความเป็นช่างฝีมือของผู้เขียน พร้อมบอกว่าบทความนี้งดงามและสร้างแรงบันดาลใจ
  • "การกล่าวถึง gesture หมุนเพื่อ undo ที่น่าสนใจ"

    • บอกว่าเป็น gesture ที่ชวนให้นึกถึงฉากที่ตัวเอกในภาพยนตร์ "Doctor Strange" หมุนเวลากลับและเดินหน้าเวลา
  • "คำชมต่อความมินิมัลของบล็อกและแอป"

    • แสดงความสุขที่ได้ใช้แอปที่ตัวเองสร้าง และบอกว่ารู้สึกคล้ายกันเวลาใช้ vim-motions หรือ Neovim
  • "ความประหลาดใจต่อการเข้าถึงโค้ด SDK ที่มีอยู่อย่างจำกัดใน ecosystem การพัฒนาของ Apple"

    • แสดงความสงสัยกับเรื่องที่ต้องไปดู assembly code โดยตรง และขอให้มีการยืนยันเรื่องนี้