- Hashcards là ứng dụng lặp lại ngắt quãng (spaced repetition) theo kiểu local-first, tương tự Anki hay Mochi, nhưng dùng tệp Markdown thay vì cơ sở dữ liệu
- Mỗi flashcard được viết bằng văn bản thuần túy, hỗ trợ các định dạng câu hỏi (Q), trả lời (A) và cloze deletion (C), đồng thời quản lý lịch ôn tập bằng thuật toán FSRS
- Dữ liệu thẻ được định danh bằng giá trị băm của văn bản, còn lịch sử ôn tập được lưu trong SQLite; có thể quản lý phiên bản và chia sẻ qua kho Git
- Được thiết kế với mục tiêu giảm tối đa ma sát khi nhập liệu và đảm bảo quyền sở hữu hoàn toàn, nhằm giải quyết các vấn đề của giao diện phức tạp trong Anki và thuật toán kém hiệu quả của Mochi
- Sự kết hợp giữa Markdown, tích hợp Git và bộ lập lịch FSRS mang đến một cách tiếp cận mới giúp nhà phát triển và người học quản lý việc học minh bạch và tự động hóa
Tổng quan về Hashcards
- Hashcards là một hệ thống lặp lại ngắt quãng mã nguồn mở chạy cục bộ, mang lại trải nghiệm học tập tương tự Anki hoặc Mochi
- Lịch ôn tập được quản lý bằng thuật toán FSRS (Free Spaced Repetition Scheduler)
- Giao diện web chạy tại
localhost:8000, và lịch sử ôn tập được lưu trong cơ sở dữ liệu SQLite
- Điểm khác biệt cốt lõi là cấu trúc không dùng cơ sở dữ liệu, mà quản lý từng flashcard bằng tệp Markdown
- Ví dụ: được tổ chức thành
Cards/Math.md, Cards/Chemistry.md v.v.
- Mỗi tệp chứa nhiều thẻ Q/A hoặc cloze deletion (C)
Cấu trúc thẻ dựa trên văn bản
- Flashcard được viết theo định dạng văn bản đơn giản
- Có thể tận dụng nguyên vẹn cú pháp Markdown, nên mang lại trải nghiệm gần giống như ghi chú thông thường
- Lệnh chạy ôn tập có dạng
$ hashcards drill <path>
Triết lý thiết kế và lợi ích
- Thiết kế của Hashcards đặt mục tiêu “viết thẻ không ma sát” lên hàng đầu
- Việc nhập và chỉnh sửa thẻ phải nhanh và trực quan thì khối lượng học mới tăng lên
- Dùng dấu ngoặc vuông (
[]) để rút gọn thao tác nhập cloze deletion (không cần phím Shift)
- Việc tích hợp với kho Git mang lại các lợi ích sau
- Có thể quản lý phiên bản, theo dõi thay đổi, cộng tác và chia sẻ công khai
- Có thể tìm kiếm và chỉnh sửa thẻ bằng các công cụ Unix tiêu chuẩn hoặc script
- Có thể tự động tạo thẻ từ dữ liệu có cấu trúc như CSV
- Thẻ được định danh bằng giá trị băm của văn bản, cho phép tham chiếu ổn định dựa trên nội dung
Đánh giá các hệ thống hiện có (Anki, Mochi)
- Anki
- Ưu điểm: mã nguồn mở, hỗ trợ FSRS, thống kê phong phú, có tính năng tự động tạo thẻ (note types)
- Nhược điểm: giao diện phức tạp, thiếu trực quan, nhập liệu WYSIWYG kém hiệu quả, phụ thuộc vào plugin
- Mochi
- Ưu điểm: UI gọn gàng, nhập liệu dựa trên Markdown, thao tác tập trung vào phím tắt
- Nhược điểm: cú pháp cloze deletion dài dòng, không có note types, thuật toán đơn giản
- Thuật toán cũ dùng cách tiếp cận dựa trên bội số đơn giản (multiplier), kém hiệu quả trong việc duy trì trí nhớ dài hạn
- Gần đây đã bổ sung hỗ trợ FSRS bản beta, nhưng các vấn đề lập lịch của thẻ hiện có vẫn còn
Triển khai và quy trình làm việc của Hashcards
- Người dùng có thể trực tiếp viết và chỉnh sửa thẻ bằng trình soạn thảo văn bản
- Ví dụ:
Q: What is the atomic number of carbon? / A: 6
- Thẻ nhiều dòng hoặc định dạng phức tạp cũng có thể được biểu đạt tự nhiên trong Markdown
- Việc chỉnh sửa thẻ theo sự thay đổi của kiến thức trở nên dễ dàng
- Có thể tổ chức thành các tệp Markdown theo từng chương để khớp với cấu trúc giáo trình
- Có thể đặt các khái niệm liên quan ở các thẻ liền kề để tăng hiệu quả dò tìm khi chỉnh sửa
- Quản lý dựa trên Git cho phép tận dụng các chức năng sau
- Quản lý phiên bản đầy đủ với commit, branch, merge, PR v.v.
- Có thể chia sẻ việc học và cộng tác thông qua kho công khai
Hiệu ứng cộng hưởng của cách tiếp cận dựa trên văn bản
- Có thể tự động tạo và điều hướng thẻ bằng macro của trình soạn thảo
- Có thể dùng lệnh Unix (
wc, awk v.v.) để thống kê thẻ và chỉnh sửa hàng loạt
- Có thể dùng script và Makefile để tự động tạo thẻ từ dữ liệu bên ngoài như CSV
- Có thể chia sẻ quá trình học cá nhân qua GitHub công khai, từ đó góp phần lan tỏa văn hóa học tập
Kết luận
- Hashcards là một dạng hệ thống lặp lại ngắt quãng mới kết hợp định dạng văn bản đơn giản, thuật toán lập lịch nâng cao (FSRS) và tích hợp Git
- Hệ thống này giảm tối đa ma sát khi viết thẻ, đảm bảo quyền sở hữu hoàn toàn đối với dữ liệu và đồng thời cung cấp tự động hóa cùng khả năng mở rộng
- Đây được giới thiệu là công cụ mang lại môi trường học tập minh bạch và có thể kiểm soát cho cả nhà phát triển lẫn người học
1 bình luận
Ý kiến trên Hacker News
Tôi nghĩ sức mạnh thực sự của spaced repetition không nằm ở ứng dụng flashcard mà ở việc điều chỉnh hành vi
Ví dụ, sau một lần vợ tôi bực bội vì vấn đề ở nha khoa, tôi đã đưa tình huống này vào SRS của mình để tập thành thói quen ‘đồng cảm về mặt cảm xúc và lắng nghe đủ lâu’
Mỗi lần ôn chỉ mất khoảng 30 giây, nên dù lặp lại suốt đời thì tổng cộng chắc cũng chưa đến 15 phút
Từ đó đến nay tôi chưa từng lặp lại sai lầm đó, và vợ tôi nói rằng tôi đã thay đổi hoàn toàn
Điểm cốt lõi là xem spaced repetition không phải là ‘công cụ học tập’ mà là một hệ thống củng cố có cấu trúc
Việc không giải quyết vấn đề mà chỉ đồng cảm thôi thực sự hoàn toàn khác với cách suy nghĩ của tôi
Nếu vợ bạn là người đưa ra đề xuất trước mà không hề đồng cảm, liệu bạn cũng sẽ nổi giận chứ? Và đến lúc đó thì có phải đã quá muộn không?
Tôi tò mò khi ghi vào SRS thì bạn đưa vào các giai thoại cụ thể hay các mẫu hành vi đã khái quát hóa. Tôi cũng muốn biết cấu trúc mặt trước/mặt sau của thẻ hay có dùng cloze hay không
Mọi người so sánh những dự án kiểu này với Anki là điều tự nhiên, nhưng tôi thấy phần lớn các lời chê Anki lại khá chủ quan hoặc cường điệu
Cấu trúc deck phân cấp của Anki thực ra là một điểm mạnh, và trình soạn thảo WYSIWYG cũng là lựa chọn hoàn toàn hợp lý với nhóm người dùng mục tiêu
Viết công thức LaTeX cũng rất đơn giản, còn plugin thì là một hệ sinh thái kiểu ‘hơi hacky nhưng hữu ích’
Tôi đã thử nhiều phương án thay thế nhưng cuối cùng vẫn quay lại Anki. Ngay cả với người thích công cụ dòng lệnh như tôi, nó vẫn quá đầy đủ tính năng
Nếu bạn thấy đồng cảm thì cứ xem thử dự án, còn không thì bỏ qua cũng được
Nếu thẻ được định danh bằng giá trị hash của văn bản, tôi tự hỏi liệu mỗi lần sửa lỗi chính tả thì lịch sử ôn tập của thẻ có bị mất hay không
Tôi tự hỏi liệu có thể có một mạng xã hội dựa trên spaced repetition hay không
Nếu có thể đánh dấu bài viết mình thích trong feed như kiểu ‘lên lịch ôn lại’, thì nó có thể trở thành một dạng retweet và giúp nội dung có giá trị lâu dài được lan truyền
Tôi đang làm một dự án knowledge base + spaced repetition
File Markdown thực sự rất tiện — xem được ở mọi nơi, quản lý phiên bản bằng Git, và cross-linking rất linh hoạt
Liên kết dự án: https://github.com/odosui/mt
Tôi muốn giữ ghi chú cục bộ nên tránh các giải pháp dựa trên đám mây, và rồi phát hiện ra có những công cụ parse Markdown sang Anki
Nếu là người dùng Emacs, tôi khuyên dùng org-drill, một công cụ spaced repetition dựa trên plain text
Tôi đã tạo một thư viện tên là Ankivalenz. Nó chuyển Markdown có cấu trúc thành deck Anki
Ví dụ, cấu trúc phân cấp như
Path: Solar System > Planets > Colorcó thể được đưa vào thẻ để cho phép ôn tập có ngữ cảnhGhi chú thông thường và thẻ có thể cùng tồn tại trong một file Markdown
https://github.com/vangberg/ankivalenz/
Tôi thấy tiếc vì các dự án SRS khác không triển khai tử tế tính năng nhập dữ liệu (import) từ Anki
Phần lớn người dùng đã có sẵn hàng nghìn thẻ trong Anki nên không dễ chuyển sang nơi khác
Định dạng dữ liệu của Anki khá phức tạp, nhưng vì dựa trên SQLite nên vẫn có thể chia sẻ được
Chỉ sau khi hiểu được cấu trúc note–model–template của Anki, tôi mới nhận ra nó tinh vi đến mức nào
Nếu có một định dạng deck có thể chia sẻ dựa trên văn bản, việc cộng tác trên GitHub chắc sẽ dễ hơn rất nhiều
Nếu mỗi note là một file riêng và có ID duy nhất thì việc quản lý cập nhật cũng sẽ thuận tiện hơn
Giờ đây logic cốt lõi đã được tách thành các Rust crate, nên có thể dễ dàng làm frontend thay thế mà vẫn dùng nguyên cơ sở dữ liệu đó
Tôi từng dùng Google Sheets để nhập dữ liệu
Nếu quản lý từng hàng bằng UUID thì cũng dễ theo dõi khi chỉnh sửa
Từ cùng một nguồn dữ liệu, có thể tạo ra nhiều deck khác nhau, ví dụ pinyin tiếng Trung → chữ Hán, hoặc chữ Hán → tiếng Anh
Nếu có một giao diện backend hóa những sheet kiểu này thành định dạng văn bản thì sẽ rất tuyệt
Là người đã dùng spaced repetition trong thời gian dài, tôi xin chia sẻ vài mẹo
1️⃣ Cần quyết định điều gì là quan trọng. Nếu biến cả thông tin vụn vặt thành thẻ, bạn sẽ phải ôn hàng trăm thẻ mỗi ngày
2️⃣ Với những khái niệm quan trọng, nên tạo nhiều thẻ đa dạng để kiểm tra sự hiểu biết từ nhiều góc độ
3️⃣ Sau một khoảng thời gian thì nên chuyển sang thẻ cấp hai hoặc áp dụng thực tế. Nếu một khái niệm suốt một năm chưa từng dùng đến, có thể nó không thực sự quan trọng
Tóm lại, spaced repetition là một công cụ học tập cực kỳ hiệu quả, nhưng thất bại trong việc đặt ưu tiên mới là cái bẫy lớn nhất