İçeriğe geç
Tüm yazılar

Hydrame'i geliştirmek: dırdır etmeden akıllı hatırlatıcılar

Bir hatırlatıcı uygulaması, bildirimleriyle var olur ya da yok olur. Hydrame'in bildirimlerini seni nazikçe dürtsün — ve gününle savaşmak yerine ona uyum sağlasın diye nasıl tasarladığımı anlatıyorum.

MFKAPPS 3 dk okuma

Çoğu hatırlatıcı uygulaması aynı ölümcül kusuru taşır: hatırlatıcıların kendisi. Sabit bir programa göre çalışır, ne yaptığını umursamaz ve zamanla sana onları okumadan kaydırıp atmayı öğretir. Bir bildirim gürültüye dönüştüğü anda, tüm uygulama gürültüye dönüşür.

Hydrame bir su takibi uygulaması ve su takibi tamamen bir hatırlatıcı problemidir. Dürtmeler iyiyse uygulama işe yarar. Dırdır ederlerse perşembeye kalmadan uygulamayı silersin. Bu yüzden tasarım süresinin çoğunu tam olarak tek bir soruya ayırdım: birine su içmesini, nefret ettiği şeye dönüşmeden nasıl hatırlatırsın?

Sabit programlar düşmandır

Naif yaklaşım, her iki saatte bir çalan bir alarmdır. Geliştirmesi kolay, onunla yaşaması berbattır. Toplantı sırasında, kısa bir uykuya daldığında ve daha yeni bir bardak su içtikten on dakika sonra vızıldar. Yanlış zamanlanmış her hatırlatıcı sana biraz güven kaybettirir ve o güveni geri kazanamazsın.

Hydrame’i şekillendiren içgörü şuydu: bir hatırlatıcı, ancak gerçekten harekete geçebileceğin bir anda geldiğinde iyidir. Geri kalan her şey, yardımsever kostümü giymiş gürültüdür.

Güne uyum sağlamak

Sabit bir zamanlayıcı yerine Hydrame, günlük bir hedefi uyanık olduğun saatlere yayar ve yalnızca gerçekten geride kaldığında ve son dürtmeden bu yana yeterince zaman geçtiğinde dürtme yapar. Bir içecek kaydetmek bir sonraki hatırlatıcıyı ileri iter. İstikrarlı bir şekilde su içersen, belki hiç sesini duymazsın — ki bütün mesele de bu.

Temel zamanlama mantığı bilinçli olarak küçük tutuldu:

interface ReminderContext {
  now: Date;
  wakeHour: number;       // e.g. 8
  sleepHour: number;      // e.g. 23
  goalMl: number;         // daily target
  consumedMl: number;     // logged so far today
  lastNudge: Date | null;
  minGapMinutes: number;  // breathing room between nudges
}

function shouldNudge(ctx: ReminderContext): boolean {
  const hour = ctx.now.getHours();

  // Never during sleeping hours.
  if (hour < ctx.wakeHour || hour >= ctx.sleepHour) return false;

  // Respect a minimum gap so we never feel pushy.
  if (ctx.lastNudge) {
    const gapMin = (ctx.now.getTime() - ctx.lastNudge.getTime()) / 60000;
    if (gapMin < ctx.minGapMinutes) return false;
  }

  // How much *should* you have had by now, given the day's progress?
  const dayLength = ctx.sleepHour - ctx.wakeHour;
  const elapsed = Math.max(0, hour - ctx.wakeHour);
  const expectedMl = ctx.goalMl * (elapsed / dayLength);

  // Only nudge if you're meaningfully behind the curve.
  return ctx.consumedMl < expectedMl * 0.85;
}

Matematikte akıllıca bir şey yok ve bu bilinçli. 0.85 eşiği “geride, ama cezalandırırcasına değil” anlamına gelir. minGapMinutes koruması, bir yoldaşla bir dırdırcı arasındaki farktır. İşin çoğu, ateşleme nedenleri eklemek değil, onları çıkarmaktı.

Bildirim metni, zamanlama kadar önemlidir

Mükemmel zamanlanmış bir hatırlatıcı bile, kelimeler yanlışsa kötü hissettirebilir. “Hedefinde başarısız oluyorsun!” teknik olarak bir dürtmedir. Aynı zamanda, birinin kilit ekranına davet ettiğin minik bir düşmanlık edimidir.

Hydrame’in hatırlatıcıları kısa, sıcak ve asla suçluluk yükleyen türden değil:

  • “Bir bardak su için güzel bir an.”
  • “Günün yarısı geçti — biraz açığı kapatalım mı?”

Dikkat için savaşan ünlem işaretleri yok. “Bozulmak” üzere olan bir seri yok. Ton, bir arkadaşın bunu hatırlatması gibi, bir koçun bağırması gibi değil.

Varsayılan olarak sakin, tercihe göre yapılandırılabilir

Varsayılanlar, herhangi bir uygulamadaki en önemli tasarım kararıdır, çünkü çoğu insan onları asla değiştirmez. Bu yüzden Hydrame sessiz gelir: temkinli sayıda dürtme, gece hiç yok, hepsi daha da azaltması kolay.

Daha sıkı hedefler veya daha sık kontroller istersen, oradalar. Ama daha fazlasına dahil olursun, daha azından çıkmazsın. Bu tek tersine çevirme — tavan değil, taban olarak sakinlik — uygulamayı saygılı hissettiren şeyin büyük kısmıdır.

Amaç asla bildirimleri en üst düzeye çıkarmak değildi. Her birini hak etmekti.

Bir hatırlatıcı uygulaması yapan herkese söyleyeceğim şey

  1. Hatırlatıcıları saate değil, harekete geçilebilir anlara bağla. Harekete geçemeyeceğin bir dürtme sadece gürültüdür.
  2. Her zaman nefes alacak alan bırak. Uyarılar arasında minimum bir aralık pazarlığa açık değildir.
  3. Metni bir metrik gibi değil, bir insan gibi yaz. Sıcaklık hiçbir şeye mal olmaz ve çok fazla güven kazandırır.
  4. Sakin seçeneği varsayılan yap. İnsanlar senin varsayılanlarında yaşar.

Hydrame artık Google Play’de yayında ve bildirimler hâlâ üzerinde durmaksızın çalıştığım kısım. Denersen, dürtmelerin nasıl hissettirdiğini bana anlat — o geri bildirim, sırada ne olacağını şekillendiriyor. Elbette sessizce.