Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

بات تلگرام English Boss

تمرین زبان سر استمرار می‌لنگد، نه سر محتوا؛ و یک اپ مستقل سه نقطه‌ی ریزش تازه هم اضافه می‌کند: نصب، بازکردن، به‌یادآوردن. این بات تمرین زمان‌بندی‌شده را داخل Telegram می‌رساند، جایی که مخاطب همین حالا هست؛ به‌یادآوردن کار زمان‌بند است و توزیع کار چت.

مسئله تجاری

اپ‌های تمرین یک هفته با اشتیاق باز می‌شوند و بعد دیگر هیچ. محتوای خوب رایگان بیش از آن است که کسی فرصت استفاده از همه‌اش را داشته باشد، ولی تقریباً هیچ‌کس بدون کمک، عادت روزانه را نگه نمی‌دارد. هر طراحی‌ای که منتظر بماند زبان‌آموز خودش شروع کند، دارد با همه‌ی چیزهای دیگر روی گوشی او رقابت می‌کند و می‌بازد؛ خود تمرین‌ها بخش آسان کارند، رسیدن به هفته‌ی چهارم مسئله‌ی اصلی است. اپ مستقل هم سه مانع دیگر روی همین مسیر می‌گذارد: باید نصب شود، باز شود و یادش بماند، و هر کدام نقطه‌ای است که زبان‌آموز از قیف بیرون می‌زند. وقتی همان تمرین از یک پلتفرم چت برسد، هر سه حذف می‌شوند، ولی مسئله جابه‌جا می‌شود: حالا بات باید آپدیت‌ها را مطمئن بگیرد، وضعیت هر زبان‌آموز را نگه دارد و ارسال‌ها را زمان‌بندی کند، بدون هیچ رابط کاربری که پشتش پناه بگیرد.

آنچه تحویل دادم

  • یک سرویس FastAPI که آپدیت Telegram را روی وب‌هوک می‌گیرد، نه با polling؛ پس تحویل push است و اجرایش ارزان.
  • جلسه‌های تمرین و یادآوری‌های زمان‌بندی‌شده که خودشان سراغ زبان‌آموز می‌روند، نه اینکه منتظر بمانند کسی بازشان کند. کل سیستم روی همین سازوکار ایستاده است.
  • تمرین‌های کوتاه، از جمله تمرین گفتاری، به اندازه‌ی وقت‌های خالی وسط روز؛ جلسه‌ای که نیم ساعت فراغت بخواهد اصلاً انجام نمی‌شود.
  • ثبت پیشرفت، زنجیره‌ی روزهای پشت‌سرهم و بازخورد بازی‌گونه، به‌علاوه‌ی مرور عملکرد در طول جلسه‌ها؛ تا تمرین یک مسیر قابل‌دیدن پیدا کند و خودِ زنجیره دلیل ادامه‌دادن شود.
  • روال‌های آیلتس‌محور برای کسانی که هدفشان یک آزمون مشخص است، جدا از تمرین عمومی.
  • یک لایه‌ی بات مستقل با هندلرها، کیبوردها و متن پیام‌های خودش، جدا از بک‌اندی که وضعیت و زمان‌بندی را نگه می‌دارد.
  • یکپارچه‌سازی OpenAI برای بخش ارزیابی و بازخورد، پشت ماژول خودش و نه از داخل هندلرها.
  • تعریف کانتینر و فرایند، تا سرویس یک‌جا دیپلوی شود، نه به‌شکل اسکریپتی که هر بار کسی دستی اجرا کند.

رویکرد فنی

  • زمان‌بند قابلیت اصلی است و بقیه‌ی چیزها محتوای آن. محصولات این حوزه معمولاً همین را برعکس می‌بینند، و همین یک تصمیم کل معماری را تعیین می‌کند.
  • وب‌هوک به‌جای polling. پولینگ مدام منابع می‌سوزاند تا بفهمد هیچ اتفاقی نیفتاده، و برای سرویسی که بیشتر وقت بیکار است بد مقیاس می‌گیرد.
  • لایه‌ی بات فقط Telegram را می‌شناسد و بک‌اند فقط زبان‌آموز را. همین مرز اجازه می‌دهد پلتفرم دوم اضافه شود بدون بازنویسی منطق تمرین.
  • یکپارچه‌سازی مدل در یک ماژول جمع شده، تا عوض‌کردن ارائه‌دهنده یا مدل یک ویرایش محدود باشد و نه دست‌بردن در تک‌تک هندلرها.
  • متن پیام‌ها از منطق هندلر جدا است، چون متن مدام عوض می‌شود و منطق نباید سر هر تغییر متن دست بخورد.
  • جلسه‌ها عمداً کوتاه‌اند. نرخ تکمیل از طول جلسه مهم‌تر است، چون چیزی که روی‌هم جمع می‌شود عادت است.
  • پیشرفت را نشان می‌دهیم چون اثر تمرین روزبه‌روز دیده نمی‌شود، و پیشرفتی که دیده نشود با نبود پیشرفت فرقی ندارد.
  • روال آزمون‌محور از تمرین عمومی جدا شده، چون این دو واقعاً ساختار و معیار موفقیت متفاوتی دارند.

نتیجه و شواهد

تمرین، یادآوری و بازخورد همه داخل Telegram و از یک سرویس وب‌هوک می‌رسند و زبان‌آموز پیشرفتش را در طول جلسه‌ها می‌بیند. لایه‌ی پلتفرم، لایه‌ی وضعیت و یکپارچه‌سازی مدل هرکدام جای خودشان مانده‌اند. آنچه راستی‌آزمایی شده سازوکار تحویل و لایه‌بندی است؛ برای این نوشته عدد نگهداشتی اندازه‌گیری نشده، پس «هفته‌ی چهارم» هدف طراحی است، نه نتیجه‌ی گزارش‌شده.

اهمیت برای کارفرما

هر محصولی در این حوزه رقیبش محتوای رایگان است؛ وجه تمایز خود مطالب نیست، این است که زبان‌آموز هفته‌ی چهارم هنوز دارد استفاده می‌کند یا نه. رسیدن به او در اپلیکیشنی که همین حالا استفاده می‌کند، از هر فیچری که یک اپ مستقل بدهد ارزش بیشتری دارد، چون سخت‌ترین قدم قیف را کنار می‌گذارد.

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "English Boss Telegram Bot"
  پشته: "Python، FastAPI، Telegram Bot API، OpenAI"
  فیچر_اصلی: "زمان‌بند؛ تمرین‌ها محتوای آن‌اند"
  تحویل: "وب‌هوک، نه polling"
  لایه‌ها: "بات (هندلر/کیبورد/پیام) | بک‌اند
           (وضعیت، زمان‌بندی) | یکپارچه‌سازی مدل"
  جداسازی: "فراخوان‌های OpenAI در یک ماژول، نه در هندلرها"
  متن: "محتوای پیام جدا از منطق هندلر"
  طراحی_جلسه: "کوتاه، به اندازه‌ی شکاف‌های یک روز"
  نگهداشت: "پیشرفت قابل‌دیدن + استمرار + بازبینی عملکرد"
  مسیرها: "تمرین عمومی و روال آیلتس، جداشده"
  رقیب: "محتوای رایگان — پس هفته‌ی چهارم معیار است"
  دیپلوی: "کانتینری با یک تعریف فرایند"
}

ارزش حرفه‌ای این پروژه

دو تصمیم را دوست دارم بازبینی شود. اول اینکه زمان‌بند را محصول دیدم و نه تمرین‌ها را؛ کل معماری از همین یک تصمیم درمی‌آید. دوم لایه‌بندی: جزئیات Telegram، وضعیت زبان‌آموز و فراخوان مدل سه دغدغه‌ی جداگانه‌اند و جدا ماندنشان است که سیستم را قابل گسترش نگه می‌دارد.

انتخاب پلتفرم چت به‌جای اپ مستقل یک تصمیم توزیع بود، نه فنی، و معمولاً همین توزیع است که واقعاً دست آدم را می‌بندد. کوتاه نگه‌داشتن جلسه‌ها هم یعنی ارزش ظاهری را فدای تکمیل واقعی کردن؛ و اینجا فقط تکمیل است که نتیجه می‌دهد.