Dersler, sınavlar, ilerleme takibi, sertifikalar ve yönetici paneli ile online bir kurs web uygulaması planlayın ve oluşturun—veri modelleri, UX, güvenlik ve lansman ipuçları dahil.

Teknoloji yığını seçmeden veya UI ekranları tasarlamadan önce “bitti”nin ne demek olduğunu netleştirin. Bir çevrimiçi kurs platformu basit bir ders kütüphanesinden kohortlu, notlandırmalı ve entegrasyonlu tam bir LMS’e kadar her şey olabilir. İlk işiniz bunu daraltmak.
Öncelikle ana kullanıcılarınızı ve her birinin ne yapabilmesi gerektiğini adlandırın:
Pratik bir test: bir rolü tamamen kaldırırsanız ürün hâlâ çalışır mı? Evet ise, o rolün özellikleri muhtemelen lansmandan sonra eklenmelidir.
İlk sürüm için, öğrenenlerin gerçekten hissettiği sonuçlara odaklanın:
Diğer her şey—sınavlar, tartışmalar, indirmeler, kohortlar—eğitim modeliniz için elzem değilse bekleyebilir.
Temiz bir MVP genellikle şunları içerir:
Sonrası için saklayın: gelişmiş değerlendirmeler, otomasyon iş akışları, entegrasyonlar, çoklu eğitmen gelir payları.
Hedeflerinize uyan 3–5 metrik seçin:
Bu metrikler, özellik istekleri biriktiğinde kapsam kararlarını dürüst tutar.
Net kullanıcı rolleri, bir çevrimiçi kurs platformunu inşa etmeyi kolaylaştırır ve bakımını çok daha yönetilebilir kılar. Kim ne yapabilir diye erken karar verirseniz, ödeme, sertifikalar veya yeni içerik türleri eklediğinizde acı veren yeniden yazımlardan kaçınırsınız.
Çoğu kurs web uygulaması üç rol ile başlayabilir: Öğrenci, Eğitmen ve Yönetici. Sonradan rolleri bölebilirsiniz (ör. “Öğretim Asistanı” veya “Destek”), ama bu üçü temel iş akışlarını karşılar.
Bir öğrencinin yolu zahmetsiz hissetmeli:
Tasarımın kilit detayı: “kaldığı yerden devam etme”, ürünün her kurs için bir öğrencinin son etkinliğini (açtığı son ders, tamamlama durumu, zaman damgaları) hatırlamasını gerektirir. İleri düzey ilerleme takibini erteleseniz bile, bu durumu baştan planlayın.
Eğitmenlerin iki büyük yeteneğe ihtiyacı vardır:
Pratik bir kural: eğitmenler genellikle ödemeleri, kullanıcı hesaplarını veya platform düzeyindeki ayarları düzenleyememelidir. Onları içerik ve kurs düzeyindeki içgörülerle odaklı tutun.
Yöneticiler operasyonel görevlerle ilgilenir:
Kodu yazmadan önce izinleri basit bir matris olarak yazın. Örneğin: “Sadece yöneticiler bir kursu silebilir”, “Eğitmenler yalnızca kendi kurslarındaki dersleri düzenleyebilir” ve “Öğrenciler yalnızca kayıtlı oldukları kurslardaki derslere erişebilir.” Bu tek egzersiz güvenlik açıklarını önler ve gelecekteki veri taşımalarını azaltır.
Öğrenenler platformunuzu yönetici ayarlarına göre değil, bir kursu ne kadar hızlı bulabildiklerine, ne elde edeceklerini anlayabildiklerine ve dersler arasında sorunsuz ilerleyebildiklerine göre yargılar. MVP’niz net yapı, güvenilir bir ders deneyimi ve basit, öngörülebilir tamamlama kurallarına odaklanmalı.
Tarama açısından kolay bir hiyerarji ile başlayın:
Yazar deneyimini basit tutun: modül/dersleri yeniden sırala, görünürlüğü (taslak/yayın) ayarla ve öğrenci olarak önizle.
Katalogunuzun üç temel şeyi olmalı: arama, filtreler ve hızlı gezinti.
Yaygın filtreler: konu/kategori, seviye, süre, dil, ücretsiz/ücretli ve “devam eden”. Her kursun bir iniş sayfası olmalı: öğrenme çıktıları, müfredat, önkoşullar, eğitmen bilgisi ve nelerin dahil olduğu (indirmeler, sertifika, sınavlar).
Video dersler için öncelik verin:
Opsiyonel ama değerli:
Metin dersleri başlıkları, kod bloklarını ve temiz bir okuma düzenini desteklemeli.
Ders türüne göre tamamlama kurallarını kararlaştırın:
Ardından kurs tamamlama kuralını belirleyin: tüm gerekli derslerin tamamlanması ya da isteğe bağlı derslerin hariç tutulması. Bu seçimler ilerleme çubuklarını, sertifikaları ve destek taleplerini etkiler—bu yüzden erken açık olun.
İlerleme takibi, öğrenenlerin momentum hissettiği alan ve destek taleplerinin sık başladığı yerdir. UI’yi inşa etmeden önce her seviyede (ders, modül, kurs) “ilerleme”nin ne anlama geldiğine dair kuralları yazın.
Ders seviyesinde net bir tamamlama kuralı seçin: bir “tamamla” düğmesi, videonun sonuna gelme, bir sınavı geçme veya bunların kombinasyonu. Ardından toplayın:
İsteğe bağlı derslerin sayılıp sayılmayacağını açıkça belirtin. Sertifikalar ilerlemeye bağlıysa, belirsizlik istemezsiniz.
Güvenilir ve analiz edilebilir küçük bir olay seti kullanın:
Olayları hesaplanan yüzdelerden ayrı tutun. Olaylar gerçekleri temsil eder; kurallar değişirse yüzdeler yeniden hesaplanabilir.
Dersleri yeniden ziyaret etme: bir öğrenci içeriği tekrar açtığında tamamlamayı sıfırlamayın—sadece last_viewed güncellensin. Kısmi izleme: video için eşikler (ör. %90) ve kaldıkları konumu saklama düşünün. Çevrimdışı notlar sunuyorsanız, notları bağımsız (sonra senkronize) tutun; bunları tamamlama sinyali olarak kullanmayın.
İyi bir öğrenci panosu şunu gösterir: güncel kurs, sonraki ders, son görüntüleme ve basit bir tamamlama yüzdesi. Bir “Devam Et” düğmesi ekleyin ve bir sonraki tamamlanmamış öğeye (ör. /courses/{id}/lessons/{id}) derin bağlantı verin. Bu, şık grafiklerden daha fazla ayrılmayı azaltır.
Sertifikalar basit görünür (“PDF indir”), ama kurallar, güvenlik ve destekle bağlantılıdır. Onları erken tasarlarsanız, “Her şeyi bitirdim — neden sertifikam yok?” gibi sinirli e-postalardan kaçınırsınız.
Sistemin tutarlı olarak değerlendirebileceği sertifika kriterlerini seçin:
Son kararı bir anlık görüntü olarak saklayın (uygun mu/e, sebep, zaman damgası, onaylayan) böylece sonuç dersler düzenlense bile değişmez.
Her sertifika kaydına en az şu alanları koyun ve PDF’de gösterin:
Bu benzersiz ID destek, denetim ve doğrulama için temel olur.
Pratik bir yaklaşım PDF indirme artı paylaşılabilir bir doğrulama sayfasıdır (ör. /certificates/verify/<certificateId>).
PDF’yi tutarlı olsun diye sunucu tarafında bir şablondan üretin. Kullanıcılar “İndir”e tıkladığında ya dosyayı döndürün ya da geçici bir bağlantı sağlayın.
İstemci tarafından üretilen PDF’lerden ve düzenlenebilir HTML indirmelerinden kaçının. Bunun yerine:
Son olarak, dolandırıcılık veya iadeler önemliyse iptal etme yolunuz olmalı ve doğrulama sayfası mevcut durumu açıkça göstermeli.
Temiz bir veri modeli, kurs uygulamanızı yeni ders türleri, sertifikalar, kohortlar eklerken bile genişletilebilir kılar ve her değişikliği bir veritabanı geçişine dönüştürmez. Küçük bir tablo/collection setiyle başlayın ve hangi veriyi durum olarak saklayacağınızı, hangisini türetebileceğinizi kasıtlı olarak ayırın.
En azından şunlara ihtiyacınız olacak:
Kurs yapısını (dersler, sıra, gereksinimler) kullanıcı aktivitesinden (ilerleme) ayrı tutun. Bu ayrım raporlama ve güncellemeleri çok daha basit yapar.
“Kursta tamamlama” ve “kohort bazlı ilerleme” gibi raporlara ihtiyacınız olacağını varsayın. Kohortları ilk günde başlatmasanız bile, daha sonra gruplayabilmek için enrollments.cohort_id (null olabilir) gibi opsiyonel alanlar ekleyin.
Panolar için her sayfa yüklemede tüm progress satırlarını tarayarak sayımlardan kaçının. Bir ders tamamlandığında güncellenen hafif bir enrollments.progress_percent alanı veya analiz için gece oluşturulan bir özet tablosu düşünün.
Büyük dosyaları (videolar, PDF’ler, indirmeler) nesne depolamada (ör. S3 uyumlu) saklayın ve CDN üzerinden dağıtın. Veritabanında yalnızca meta veriyi saklayın: dosya URL/yolu, boyut, içerik türü ve erişim kuralları. Bu veritabanını hızlı ve yedeklemeleri yönetilebilir tutar.
Sürekli çalıştıracağınız sorgular için indeks ekleyin:
Sürdürülebilir bir mimari, en yeni çerçeveyi kovalamaktan çok, ekibinizin yıllarca güvenle dağıtabileceği bir yığını seçmekle ilgilidir. Bir kurs platformu için “sıkıcı” seçimler genellikle kazanır: tahmin edilebilir dağıtım, net sorumluluk ayrımı ve ürüne uyan bir veritabanı modeli.
Pratik bir temel şu şekildedir:
Ekip küçükse, temiz sınırları olan bir “monolit” genellikle mikroservislerden daha kolaydır. Modülleri (Courses, Progress, Certificates) ayrı tutarak yine de gelecekte evriltebilirsiniz.
Eğer erken iterasyonları hızlandırmak ve kod kilitlenmesine takılmamak istiyorsanız, Koder.ai gibi bir hızlandırıcı platform ilk sürümü prototip ve dağıtmak için yardımcı olabilir: sohbette iş akışlarını tanımlarsınız, planlama adımında rafine edersiniz ve deploy edilebilen veya kaynak kodu olarak dışa aktarılabilen bir React + Go + PostgreSQL uygulaması üretilir.
Her ikisi de iyi çalışır. Ürününüz ve ekibinizin alışkanlıklarına göre seçin:
GET /courses, GET /courses/:idGET /lessons/:idPOST /progress/events (tamamlama, sınav gönderimi, video izlenme)POST /certificates/:courseId/generateGET /certificates/:id/verifyİyi bir uzlaşma: temel iş akışları için REST, panolar zorlaşıyorsa ileride GraphQL eklemek.
Kurs platformları web isteğini engellememesi gereken işleri barındırır. Başlangıçtan kuyruğa/işçi kurulumunu kullanın:
Yaygın desenler: Redis + BullMQ (Node), Celery + Redis/RabbitMQ (Python) veya yönetilen bir kuyruk servisi. İş yüklerinde sadece ID’leri taşıyın (tam nesne değil) ve işleri idempotent yapın ki tekrar denemeler güvenli olsun.
Dağıtımdan önce hafif gözlemlenebilirlik kurun:
Hatta küçük panolar bile “sertifika iş hataları” veya “ilerleme olaylarında ani artış” gibi uyarılarla lansman haftasında saatler kazandırır.
Para almaya başladığınız anda iki soruya temiz cevap verebilmeniz gerekir: kim kayıtlı ve neye erişmeye hakkı var. Bu yüzden monetizasyona geçtiğinizde bunun için net bir modeliniz olsun.
Çoğu kurs uygulaması bir veya iki modelle başlar ve sonra genişler:
Kayıt kaydınızı her modeli temsil edecek şekilde tasarlayın (ödenen tutar, para birimi, satın alma türü, başlangıç/bitiş tarihleri).
Bir ödeme sağlayıcısı kullanın (Stripe, Paddle vb.) ve yalnızca gerekli ödeme meta verisini saklayın:
Ham kart verisi saklamaktan kaçının—sağlayıcı PCI uyumluluğunu yönetsin.
Erişim, uygulamada çeşitli yerlere serpiştirilmiş “ödeme başarılı” bayraklarına dayanmak yerine kayıtlara bağlı haklarla verilmeli.
Pratik bir desen:
Fiyat katmanları sunuyorsanız, bunun ürün sayfanızla tutarlı olduğundan emin olun. Uygulama ayrıntıları ve webhook tuzakları için okuyucuları ilgili dokümantasyona yönlendirmeyin — kendi entegrasyon notlarınızı tutun.
Güvenlik, bir çevrimiçi kurs platformunda sonra eklenen bir özellik değildir. Ödemeleri, sertifikaları, özel öğrenci verilerini ve eğitmenlerin fikri mülkiyetini etkiler. Neyse ki, tutarlı bir küçük kural seti çoğu gerçek dünya riskini kapsar.
Bir login yöntemle başlayın ve onu güvenilir kılın.
Oturum yönetimini anlaşılır yapın: kısa ömürlü oturumlar, gerekirse yenileme mantığı ve “tüm cihazlardan çıkış yap” seçeneği.
Yetkilendirmeyi her yerde uygulanan bir kural olarak ele alın—UI, API ve veri erişim desenleri dahil.
Tipik roller:
Her hassas uç nokta şu soruları yanıtlamalı: Bu kim? Ne yapmaya izinli? Hangi kaynak üzerinde? Örneğin, “Eğitmen bir dersi yalnızca kursun sahibi ise düzenleyebilir.”
Videolar/dosyalar barındırıyorsanız, bunları herkese açık URL olarak göndermeyin.
Saklanan kişisel veriyi minimumda tutun: isim, e-posta ve ilerleme genellikle yeterlidir.
Saklama kurallarını tanımlayın (ör. yasal olarak izinliyse X aydan sonra pasif hesapları sil) ve kullanıcıların veri dışa aktarımı/silme istemlerine izin verin. Yönetici eylemleri için denetim günlükleri tutun, ancak tam ders içeriği, tokenlar veya şifreleri kaydetmeyin.
Ödemelerle uğraşıyorsanız, o verileri izole edin ve ham kart bilgilerini hiç saklamayın.
Bir kurs uygulaması, öğrenenlerin hızlı başlayabildiği, yerlerini koruyabildiği ve istikrarlı bir momentum hissettiği zaman başarılı olur. UX, sürtünleri azaltmalı (sonraki dersi bulmak, neyin “tamam” sayıldığını anlamak) ve farklı cihazlar ve yetenekler için kapsayıcı kalmalı.
Dersleri önce küçük ekranlar için tasarlayın: okunabilir tipografi, yeterli satır aralığı ve yatay kaydırma gerektirmeyen düzen.
Derslerin hızlı hissettirmesini sağlayın. Medyayı optimize edin; ilk içerik hızlı yüklensin ve ağır eklentileri (indirmeler, transkriptler) çekirdek ders yüklendikten sonra yükleyin.
Kaldığı yerden devam etmek zorunludur: kurs sayfasında ve ders oynatıcıda “Kaldığın yerden devam et” gösterin. Video/ses için son konumu ve metin dersleri için son okunan yeri saklayın ki birkaç saniyede geri dönülebilsin.
Öğrenenler ilerlemeyi belirgin gördüğünde motive olur:
Karmaşık durumları önleyin. Eğer tamamlama birden fazla eyleme bağlıysa (izleme süresi + sınav + ödev), derste küçük bir kontrol listesi gösterin ki öğrenciler eksik olanı tam olarak bilsin.
Hafif kutlama unsurları kullanın: kısa bir onay mesajı, bir modülün kilidinin açılması veya “Bitirmeye X ders kaldı” hatırlatıcısı—yararlı ama rahatsız etmeyen.
Erişilebilirliği bir süs değil temel UX olarak ele alın:
Öğrenciler takılacak. Öngörülebilir bir yol sağlayın:
/help)Bir çevrimiçi kurs platformunu test ve geri bildirim döngüsü olmadan göndermek, “dersim tamamlandı ama kurs tamamlanmadı” gibi destek talepleriyle sonuçlanır. İlerleme, sertifikalar ve kayıt iş mantığı gerçek test kapsamı hak eder.
İlerleme kuralları etrafında birim testleriyle başlayın; bunlar yeni ders türleri eklerken veya tamamlama kriterlerini değiştirirken kolayca bozulur. Kenar durumlarını kapsayın:
Ardından kayıt akışları için entegrasyon testleri ekleyin: kayıt ol → kaydol → derslere eriş → kursu bitir → sertifika oluştur. Ödemeyi destekliyorsanız en az bir başarılı akış ve bir hata/yeniden deneme senaryosu test edin.
Panoları ve raporlamayı doğrulamak için gerçekçi seed verisi oluşturun. Bir küçük kurs ve modüller, sınavlar, isteğe bağlı dersler ve birden fazla eğitmen içeren “gerçekçi” bir kurs UI boşluklarını hızlıca ortaya çıkarır.
Analitik olaylarını dikkatle izleyin ve isimlendirin. Başlangıç için kullanılabilir set:
lesson_startedlesson_completedcourse_completedcertificate_issuedcertificate_verifiedAyrıca bağlam yakalayın (course_id, lesson_id, user_role, device) ki ayrılma nedenlerini teşhis edebilin ve değişikliklerin etkisini ölçün.
Tam lansmandan önce bir avuç kurs oluşturucusu ve öğrenenden oluşan küçük bir beta çalıştırın. Oluşturuculara bir kontrol listesi verin (kurs oluştur, yayımla, düzenle, öğrenci ilerlemesini gör) ve karışık gelen yerleri anlatmalarını isteyin. Kurulum süresini ve içerik hatalarını azaltan düzeltmeleri önceliklendirin—bunlar benimsenmeyi engelleyen noktalar olacaktır.
İsterseniz beta sırasında destek yükünü azaltmak için /status gibi hafif bir “Bilinen sorunlar” sayfası yayımlayın.
Hızlı yinelemeler yapıyorsanız güvenli geri alma süreçlerini dahil edin. Örneğin, Koder.ai anlık görüntüler ve geri alma destekler; tamamlama kurallarını veya sertifika üretimini değiştirirken hızlı bir kaçış yolu sağlar.
MVP’yi göndermek gerçek ürün işinin başladığı andır: hangi kursların trafik alacağı, öğrenenlerin nerede ayrıldığı ve yöneticilerin neyle vakit geçirdiğini öğreneceksiniz. Yeniden inşa etmeden önce kademeli ölçekleme planı yapın.
Büyük altyapı değişikliklerinden önce basit kazanımlarla başlayın:
Video ve büyük dosyalar genellikle ilk ölçekleme darboğazıdır.
Statik varlıklar için CDN kullanın ve indirmeler/indirilebilir kaynaklar için aynı. Video için uyarlanabilir akış hedefleyin ki mobil veya düşük bağlantı hızındaki kullanıcılar da akıcı oynatma alsın. Başlangıçta temel dosya barındırma ile başlasanız bile, medya dağıtımını yükseltmeyi mümkün kılan bir yol seçin.
Kullanım arttıkça operasyonel araçlar da önem kazanır.
Öncelik verin:
Stabil dersler ve ilerleme takibi kurulduktan sonra iyi sonraki adımlar:
Her birini kendi mini-MVP’si gibi ele alın ve açık başarı metrikleri koyun ki büyüme kontrollü ve sürdürülebilir olsun.
Öncelikle minimum öğrenme çıktıları tanımlayın:
Eğer bir özellik doğrudan bu çıktılara hizmet etmiyorsa (ör. tartışmalar, karmaşık sınavlar, derin entegrasyonlar), öğretim modeliniz için merkezi değilse lansmandan sonraya erteleyin.
Pratik bir başlangıç seti:
Eğer bir rolü kaldırmak ürünü bozmuyorsa, o rolün özellikleri muhtemelen lansmandan sonra eklenmelidir.
Kodlamadan önce basit bir izin matrisi yazın ve bunu API'de zorunlu kılın (sadece UI'da değil). Yaygın kurallar:
Yetkilendirmeyi her hassas uç noktada zorunlu bir kontrol olarak ele alın.
Kullanıcıların hızlıca tarayabileceği bir hiyerarşi kullanın:
Yayınlama ve yazarlık işlemlerini basit tutun:
İndirilebilir dosyaları bir kursa veya belirli derse ekleyin; sınav/ödevleri yalnızca öğrenmeyi anlamlı şekilde pekiştiriyorsa ekleyin.
“Kaldığın yerden devam et”i birincil iş akışı olarak uygulayın:
Ardından tek bir “Devam Et” düğmesi sağlayın ve kullanıcının sonraki tamamlanmamış öğeye doğrudan gitmesini sağlayın (ör. )—bu, ayrılmaları azaltır.
Ders türüne göre tamamlanma kurallarını tanımlayın ve bunları açıkça belirtin:
Daha sonra kurs tamamlanmasını tanımlayın (tüm gerekli dersler vs. isteğe bağlı dersler hariç) ki ilerleme çubukları ve sertifikalar keyfi görünmesin.
Gerçeklere dayanan küçük bir olay seti izleyin:
startedlast_viewedcompletedquiz_passed (deneme sayısı ve geçme/kalma bilgisi ile)Olayları hesaplanan yüzdelerden ayrı tutun. Tamamlama kurallarını daha sonra değiştirirseniz, ilerlemeyi yeniden hesaplayabilirsiniz ancak olaylar tarihsel gerçeği temsil etsin.
Yaygın kenar durumları baştan tasarlayın:
last_viewed güncellensin.Sır dışı tamamlama, yeniden denemeler/sıfırlamalar ve sertifika tetikleme akışları için testler ekleyin; böylece “Her şeyi bitirdim ama sertifika yok” destek taleplerinin önüne geçersiniz.
Sistemin tutarlı şekilde değerlendirebileceği açık uygunluk kuralları kullanın:
Son kararı bir anlık görüntü olarak saklayın (uygun mu/e, sebep, zaman damgası, onaylayan) böylece dersler sonradan düzenlense bile sonuç değişmez.
İkisini de yapın:
/certificates/verify/<certificateId>).Sahteciliği azaltmak için:
/courses/{id}/lessons/{id}Her zaman iptal desteği sağlayın, böylece doğrulama güncel durumu gösterir.