Vzhytok: Від ідеї до застосунку

Зміст

Вступ

Цей довгочит має дві важливі мети: розкриття власного шляху розробки застосунку Vzhytok та привертання уваги цільової авдиторії. Власне, я писав Vzhytok чотири рази з нуля, тому хотілось би трішки рефлексії (можливо поверхневої) на цю тему, що може бути корисним іншим. Пишу просто з мінімальним редагуванням (думаю зрозумієте в кінці чому), можливо це просто якийсь потім думок, буде нудно, але почнімо.

Застосунок вже доступний на iOS та Android

Зародження ідеї - Русифікація

Як типовий харківʼянин, я все життя послуговувався російської мовою, тому при переході на українську, у мене були деякі труднощі. Формування речень українською та маленький русифікований словниковий запас - основні проблеми при переході для мене. Тож для вирішення цього, я вирішив повністю відмовитись в своєму інформаційному просторі від будь-чого російськомовного на користь українськомовного (далі - українського). Ну бо як я почну думати українською та покращувати свій словниковий запас, якщо все, що я споживаю створене російською.

Почавши читати українською книжки, я почав помічати цікаві та незнайомі слова. Я використовував застосунок СУМ (Словник української мови) аби дивитись значення цих слів… і деякі навіть запамʼятовував: “либонь”, “почасти” тощо. І ці слова були в бізнес літературі, але коли мені друг подарував на день народження книжку “Сковорода: Самовладання” (Тарас Лютий), то я був дуже здивований кількістю незнайомих мені слів, що вирішив навіть її відкласти. Наведу історію пошуку слів в СУМ: буріння, барієвий, барій, хтіти, розлогість, розлог, торувати, затушкати, поняти, переострога тощо. Можливо не всі були саме з цієї книжки, але суть ви зрозуміли, слів було багато, та всі вони були мені не відомі.

Я запитувався як так сталося, що я їх не знаю, та взагалі чому я розмовляв російською. Розгорнувши книжку з історії (яку також подарував мені друг) та гортаючи Вікіпедію, я згадав ті уроки української мови, літератури та історії, яким я чомусь не приділяв стільки уваги, не бачив причини та наслідки. Щодо мови напряму - Емський указ, Валуївський циркуляр тощо. Щодо народу - геноцид, політики русифікації (після надії з коренізацією), розстріли українських митців тощо. Тож, це все тільки загартовувало позицію українізації (дерусифікації) в моєму житті.

Я вирішив зробити щось з політикою перепису словників, тому вирішив цікавитись репресованими/маловживаними/автентичними словами. Ось я вже читаю статті де бачу цікаві слова, що далі? Всі ми знаємо, що просто прочитати слова не достатньо, через хвилину ти їх вже забудеш, їх треба вживати. Але як я можу вживати, якщо я їх постійно забуваю? Я вирішив записувати їх, для цього згодились б нотатки.. але я ж програміст, напишу свій застосунок.

Формування вимог

Цитую свої думки, моя перша проблема:

Тож що треба зробити? Опишемо функціонал, так це особистий словник, куди я можу записувати всі цікаві мені слова. Модель слова буде мати слово, синоніми, помилки (калька), визначення, приклади та нотатку, добре, це зробив. Але ж треба якось організовувати слова, тому треба додати сортування - по алфавіту чи даті додавання, та щоб можна було обрати за зростанням та спаданням вже тоді. Але ж цього не достатньо, треба робити пошук слів, але щоб користувач шукав не тільки по словам а й по всім полям, тоді треба якось по доречності збігу сортувати: спочатку збіги в словах, потім в помилках та синонімах, потім в визначеннях й так далі. Але ще підсвічувати знайдені частини, бо щоб ти знав чому це слово в пошуку зараз. Але слів буде багато, тому треба якось організовувати їх, тому треба додати теки (папки). Але тоді треба буде придумати як зручно користувачу організовувати слова по цим текам. А порядок тек треба ж також змінювати, тому треба додати можливість щоб користувач міг змінювати їх порядок, це ж база. Але ж словами можна поділитись, треба додати можливість імпортувати/експортувати слова. Але ж треба ще їх запамʼятати ці слова, тому додам туди ще карточки з інтервальним повторенням……………..

Прорвемо цей потік думок тут, продовжимо цю частину потім, а зараз про иншу частину проблеми - технологію для написання.

SwiftUI чи Flutter

Треба обрати інструменти, яким писати застосунок. Варіанти: SwiftUI (iOS) та Flutter (iOS + Android). Вибір може здавати очевидним, але ми люди не завжди раціональні.

Я люблю SwiftUI, це відносно новий набір інструментів для розробки застосунків під Apple який випустили в 2019 році, на заміну старому UIKit, який був з 2008 року. Новий інструмент, нова парадигма, инший підхід до розробки - любов з першого погляду. Лаконічний код, який дає безкоштовно безліч системних компонентів, всі стандарті елементи, які використовуються в рідних застосунках Apple, робляться майже в 2-3 рядки коду на цьому SwiftUI. До того ж, з виходом нових версій iOS розробникам даються ще круті нові інструменти розробки, ось в iOS 17 вийшла нова бібліотека для збереження даних, треба використовувати.

Тож почав я писати застосунок на SwiftUI (під iOS).

Перше написання Vzhytok

Створив я проєкт 23 серпня 2023 року. Вже можна зрозуміти, що цей величезний список “потрібного функціоналу” це була одна з основних проблем під час розробки. Функціонал словника я майже повністю реалізував: слова, сортування, теки, експорт\імпорт. Проблеми були з пошуком, нова бібліотека, яку я використовував для збереження слів та папок, мала свої обмеження, більшість з яких я б охарактеризував як “приколи”, не буду вдаватись в деталі, але навіть писав в підтримку Apple, щоб почути, що це виправити не можна. Звичайно був варіант обійти це, але тоді треба було значно більше навантажити процесор. Тому пошук був обмежений до слова, помилок та синонімів, а сортувався по слову за алфавітом, а не за доречністю. Але ну ок, підійде. Закінчив я функціонал словника 2 жовтня та вирішив реалізовувати функціонал навчання. Треба описувати список “потрібного функціоналу” для тренування? Я думаю ви зрозуміли.

Магістратура та бізнес-план

Якщо не помиляюсь, 3 жовтня почалась магістратура, я поступив на “Інженерія програмного забезпечення” (121), де у нас є предмет “Інноваційне підприємництво в інженерії програмного забезпечення”. На цьому предметі треба написати бізнес-план якогось інноваційного продукту та реалізувати його в наступному семестрі. Основна проблема в тому, що треба довести, що продукт інноваційний. Я обожнюю поєднувати свої проєкти з предметами по університету (двох зайців одним пострілом), тому Vzhytok - тепер мій проєкт на цьому предметі, для якого я напишу бізнес-план. Але треба додати щось, щоб зробити це більше, аніж застосунок для нотаток. Тому я придумав: поєднання словника, вбудований функціонал для інтервального повторення та галереї слів від кваліфікованих спеціалістів - здалось мені інноваційним продуктом. Викладач дозволила взяти цей проєкт, маленька перемога.

При написанні бізнес-плану (перший розділ писав десь в кінці жовтня, а в середині у мене вже була іконка від дизайнерів за 30$), треба було оцінити конкурентне середовище, до цього я не робив це, бо писав застосунок спочатку для себе, тому навіщо зважати на конкуренцію. Я побачив застосунок Р.І.Д, в принципі, це те, що я хотів зробити, й тільки я хотів його завантажити, я побачив, що проєкт закрили. Стало трішки сумно, а потім я побачив ще 50к завантажень на GooglePlay… Повертаючись до проєкту, я вже придумав мільйона варіацій масштабування продукту, ще не маючи навіть якогось на руках.

Друге написання Vzhytok

Мені потрібно випустити застосунок й на Android - слушна думка. Спочатку я подумав продовжити писати свою першу версію, а потім зробити ще версію під Android пізніше. Тоді це потрібно буде писати під Android на Kotlin чи на кросплатформу з Flutter (iOS + Android). Нагадаю, що у мене вже є нативна версія Vzhytok під iOS, але я вирішив не триматись за неї, та обрати Flutter, щоб не дублювати код, не писати його два рази.

Другого листопада я почав писати застосунок на Flutter. Вирішив трішки відкинути зайвого з мого списку “необхідних вимог”. Я реалізував просто словник, де ти можеш створити слово, відредагувати, видалити чи відсортувати за датою чи назвою. Пошук також зробив по 3 полям як й раніше. Ніяких тек не робив. Почав писати функціонал тренування, вирішив що це буде як в Anki, але з новим алгоритмом FSRS. Багато часу я витратив на формулювання вимог, продумував алгоритми навчання та отримування необхідних даних. Читав документацію Anki, користувався, думав чого мені не вистачає. Реалізував вже частково функціонал повторення, але постійно знаходив якісь деталі, які мені не подобались.

Експертна думка

У нас в програмі магістратури ще йде предмет “Методологія конструктивного мислення” де треба було зробити дослідження для майбутнього диплому. Предмет та викладач мені дуже сподобались, тому я вирішив прийти на консультацію та обговорити Vzhytok та мої проблеми з ним. Ми домовились зустрітись на вихідних, мені треба було тільки підготувати невеличку презентацію, щоб зацікавити його.

У суботу я пішов у бібліотеку де планував зробити презентацію. Я одразу вирішив зробити все по суті, у мене на слайдах не було більше 2 рядків тексту. Але в кінці слайду, мені треба було вставити скриншоти застосунку, тому я вирішив швиденько зробити прототип на SwiftUI. За маленьку кількість рядків коду я отримав вже майже функціональний застосунок. Додав скриншоти та пішов на зустріч. Ми годину обговорювали концепцію, реалізацію, проблеми тощо. Як підсумувати зустріч?

Третє написання Vzhytok

Друге написання мені не подобалось, не подобався код, не подобався функціонал, не подобався дизайн, не подобалась бізнес логіка, хотілось переписати. А цей прототип, який я зробив для наради, нагадав мені чому я вирішив писати на SwiftUI.

Цього разу я вирішив зважати на свої помилки: величезний список “необхідного функціоналу”, прокрастинація щодо того, як краще зробити той чи инший елемент. Тому я вирішив зробити реальне MVP: Користувач може додати слово, відредагувати чи видалити. Основне це форма створення слова, зробити її зручною, можливість поставити наголос. Пошук слова простий, без підсвічувань. Ніяких тек. Тому я почав писати свій третій проєкт з нуля, реальне MVP.

Четверте написання Vzhytok

Почавши писати не було проблем, але коли я захотів зробити зручну форму слова, то тут почались “приколи”. Виявилось, що деякі моменти я просто фізично не можу реалізувати, це доповнювалось помилками в роботі самого SwiftUI. Ще багато потрібного мені функціоналу в цьому проєкті не додано до SwiftUI, а можна зробити лише на UIKit. Помилка виліту застосунку при спробі видалити текстове поле стало останньою краплею. Я вже не хотів шукати можливості обійти це, а такі були, я просто вирішив що не буду використовувати сирий SwiftUI.

Тому я вирішив повернутись, вкотре, на Flutter. Де я реалізував цей самий функціонал але вже без “приколів”. Деякий код я взяв з другого проєкту, але то була менша частина. Багато коду треба було допрацювати, деякі деталі мені не подобались. 3 рази переписував функціонал поставлення наголосу, бо здавалось якимось не тим, складним, зайвим. Але потім я вирішив забити на перфекціонізм та випустити вже хоча б якусь версію.

Відмова AppStore в публікації

“Недостатньо функціоналу, ми не можемо це публікувати”

Хоча GooglePlay дозволив викласти застосунок, Apple сказала, що цей застосунок замінить просто будь-які нотатки. Я подав апеляцію, один тільки функціонал наголосу вже для мене був унікальною можливістю. Ось як мені в нотатках поставити наголос?

Але ну що поробиш, вирішив доповнювати функціонал - інтервальне повторення. Хоча в другому проєкті я вже робив це, я майже все переписав, оскільки було багато помилок БА. До того ж, мені не подобався дизайн, розташування елементів, самі елементи. Найняти дизайнера не міг зараз, тому працював за нього. Багато разів перероблював інтерфейс, аби зробити його “зручніше”. Думав про “філософію” розташування елемента саме в цьому місці, чи не логічніше зробити інакше. Мені подобається дивитись на суть, що реально треба показати на цьому екрані, й коли я про це думав, то зіткнувся з тим, що екран буде пустий, тому додав елемент цитати на домашньому екрані, щоб було легше тягнутись до кнопок. Але я все ж таки дописав функціонал вивчення, все, що мені не подобалось я записував, але не витрачав на це час.

Висновки

Не подобається мені те, що я написав вище, наче не те, що я хотів сказати, але я всеодно опублікую цей довгочит таким. Але я спробую поглянути на свої основні проблеми, які гальмували мою розробку.

Безпідставно великий список функціоналу для реалізації та бажання зроби все ідеально - основні проблеми. Мені подобається дивитись в суть, думати, що реально важливо, але на початку розробки я не ставив під сумнів свої вимоги. Я чомусь вважав що це все потрібно реалізувати. Але реальна цінність мого застосунку це можливість зберегти слово, запамʼятати та почати вживати. Теки, глибокий пошук слів, статистика навчання та інше, що я хотів додати в першу версію - це все не важливо, це тільки гальмує. Навіть якщо користувачі захочуть бачити ті ж теки, то я це можу зробити в наступних ітераціях застосунку. Я не будую будинок, я зможу свій застосунок ще сто разів переписати чи змінити, але не важливо як виглядає той код, важлива цінність, яку отримують люди. Ітеративно ти створиш продукт, який буде тобі подобатись, але для цього, його треба хоча б випустити. Зараз я зробив цей перший крок, тепер я можу зробити наступний - збирати відгуки користувачів та реалізовувати функціонал галереї. Але якби я не поборов перфекціонізм, цього б не було. Сподіваюсь застосунок буде вам корисним

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Горєлов Данило
Горєлов Данило@horielov

56Прочитань
0Автори
3Читачі
На Друкарні з 1 травня

Вам також сподобається

Коментарі (2)

Дякую за таку чудову статтю!

Я доволі довго шукала подібний застосунок, який би поєднував адекватний функціонал та гарний інтерфейс. Маючи досвід проєктування інтерфейсів як для IOS, так і для Android, я доволі чуттєва в цьому питанні, але ваш інтерфейс мене підкорив. Окреме дякую за систему карток, читавши статтю, очікувала щось схоже на Knudge.me, але виявилося ще краще. Обов’язково буду рекомендувати друзям.

Вам також сподобається