- Bài viết này đề xuất những môn khoa học máy tính mang tính thực tế và châm biếm mà các lập trình viên phần mềm nên học, dù chúng không thực sự tồn tại
- Mỗi môn học phê phán và phơi bày các vấn đề của văn hóa phát triển hiện đại hoặc những lối tư duy thiên lệch
- Ví dụ, bài viết đề cập đến sự sùng bái quá mức đối với mô hình hướng đối tượng, việc phớt lờ UX của công cụ dòng lệnh, hay những ngộ nhận về hiệu năng của ngôn ngữ chậm
- Ngoài ra còn có các môn học bàn về những ám ảnh tâm lý và thói quen kém hiệu quả của lập trình viên
- Nhìn chung, bài viết hài hước nêu ra giới hạn của giáo dục khoa học máy tính và nhu cầu tự phản tỉnh trong văn hóa phát triển
CSCI 2100: Quên lập trình hướng đối tượng đi
- Môn học này là quá trình tìm hiểu khái niệm biến và hàm không thuộc một hệ phân cấp đối tượng nào
- Thoát khỏi lối tư duy lấy hướng đối tượng làm trung tâm để khám phá sự linh hoạt và tính đơn giản của lập trình hàm
- Giới thiệu “hàm (function)” như một khái niệm tổng quát và có thể tái sử dụng hơn so với “phương thức (method)”
- Điều kiện tiên quyết là bất kỳ môn học nào từng dùng thuật ngữ “abstract base class”
- Mục tiêu là tháo gỡ sự phụ thuộc quá mức vào mô hình hướng đối tượng và tái lập cách tư duy cốt lõi về lập trình
CSCI 3300: Nghiên cứu phần mềm cổ điển
- Môn học phân tích và thảo luận các sản phẩm phần mềm có ý nghĩa quan trọng trong lịch sử
- Các ví dụ được đề cập gồm VisiCalc, AppleWorks, Robot Odyssey, Zork, MacPaint
- Trọng tâm đặt vào giao diện người dùng (UI) và ảnh hưởng của các ràng buộc phần cứng đối với tính sáng tạo
- Thông qua những đổi mới sinh ra trong các giới hạn của quá khứ, môn học soi lại những nguyên lý nền tảng của thiết kế phần mềm hiện đại
CSCI 4020: Viết mã nhanh bằng ngôn ngữ chậm
- Môn học bàn về cách viết mã hiệu năng cao ngay cả với ngôn ngữ thông dịch (như Python)
- Khám phá các chiến lược thực hiện phân tích hiệu năng (performance analysis) ở mức cao và đạt được mức hiệu quả tương đương C++
- Đồng thời theo đuổi việc giảm độ mong manh của mã và giữ được niềm vui khi phát triển
- Đây là môn học phá vỡ định kiến “ngôn ngữ chậm thì chậm” và cho thấy khả năng tối ưu hóa của thiết kế ngôn ngữ và môi trường thực thi
CSCI 2170: Trải nghiệm người dùng (UX) của công cụ dòng lệnh
- Môn nhập môn về các nguyên tắc thiết kế trải nghiệm người dùng cho chương trình chạy trên dòng lệnh
- Tính liên quan, khả năng đọc và sự tối giản của đầu ra là các chủ đề cốt lõi
- Dùng lệnh UNIX
ls làm ví dụ để phân tích vấn đề quá nhiều tùy chọn và giao diện phức tạp
- Nhấn mạnh rằng công cụ dòng lệnh cũng cần thiết kế lấy người dùng làm trung tâm như UI đồ họa
PSYC 4410: Tâm lý học về sự ám ảnh của lập trình viên
- Khám phá những ám ảnh kém hiệu quả và các kiểu tư duy cưỡng bức mà nhà phát triển phần mềm thường mắc phải
- Ví dụ: định dạng mã, hệ thống phân loại (taxonomy), hệ thống kiểu, chia tách tệp quá mức
- Phân tích dưới góc độ tâm lý học phản ứng chỉ trích tức thì theo bản năng (knee-jerk criticism) khi tiếp xúc với hệ thống xa lạ
- Môn học giúp hiểu thiên kiến nhận thức và xu hướng cầu toàn của lập trình viên, đồng thời tìm kiếm sự cân bằng giữa hợp tác và sáng tạo
Bối cảnh tổng thể
- Danh sách này không phải đề cương môn học có thật, mà là một lời phê bình châm biếm về giáo dục khoa học máy tính và văn hóa phát triển
- Mỗi môn học phơi bày những điểm mù của lối tư duy lấy công nghệ làm trung tâm, đồng thời thúc đẩy lập trình viên tư duy linh hoạt hơn và tự phản tỉnh
- Dù là bài đăng từ năm 2015, nội dung vẫn nêu ra những vấn đề còn nguyên giá trị cho đến hôm nay
1 bình luận
Ý kiến trên Hacker News
CSCI 3300: Classical Software Studies
Điều Alan Kay đã nhấn mạnh suốt nhiều thập kỷ là chúng ta vẫn đang liên tục tái phát minh những khái niệm vốn đã được định hình từ cuối thập niên 70
Tôi đồng cảm với sự thất vọng của ông rằng cũng như nghệ sĩ học lịch sử nghệ thuật, lập trình viên cũng nên học lịch sử khoa học máy tính
Tôi nghĩ việc so sánh điện toán, vốn phụ thuộc vào hiệu năng phần cứng vật lý, với nghệ thuật là hơi khiên cưỡng
Cho rằng cách giải quyết vấn đề năm 1970 vẫn áp dụng nguyên vẹn vào năm 2025 là bỏ qua thực tế
Thật thú vị khi mỗi thế hệ lại lặp lại chu kỳ tái khám phá và tưởng rằng mình là người đầu tiên tìm ra nó
Học về các vấn đề và lời giải trong quá khứ chưa bao giờ là lãng phí thời gian
Nhờ quá trình đó tôi hiểu sâu hơn về sự tiến hóa của Unix và phần mềm thương mại, và hoàn toàn đồng ý với Alan Kay
CSCI 3240: Ignoring Hype
Đây là môn học về cách phớt lờ các trào lưu xoay quanh nền tảng hay thư viện mới nhất
Tiếp theo là CSCI 3120: Novelty Driven Development, nơi dạy điều ngược lại: bám theo xu hướng để giữ hứng thú
Không thể đăng ký hai môn này cùng lúc
Các môn khác nữa có thể là kỹ năng họp hành (PSYC 4870), chấp nhận ma sát trong tổ chức (PSYC 5630),
xoay quanh giao tiếp và tạo động lực thực tế nơi công sở
CSCI 4810: The Refusal Lab
Đây là môn thực hành mô phỏng các yêu cầu sản phẩm phi đạo đức và áp lực deadline, nơi bạn chỉ qua môn nếu biết từ chối chúng theo chuẩn mực nghề nghiệp
Đề xuất môn học về debugging
Sẽ rất hay nếu có một môn dạy cách tìm nguyên nhân gốc của bug và sử dụng nhiều công cụ khác nhau
printCần có thời gian để nói về vị cứu tinh mang tên debug tương tác
CSCI 0001: Functional programming and type theory
Thuật ngữ khó nhằn và công thức trong học thuật từ lâu đã cản trở việc phổ biến lập trình hàm
Giờ là lúc tự mình học xem vì sao monad là monoid trong category của endofunctor
CSCI 4020: Writing Fast Code in Slow Languages
Đây là môn dùng các ngôn ngữ chậm (VB, Ruby, v.v.) để dạy độ phức tạp thuật toán, và cho thấy O(N) trong Ruby vẫn có thể thắng O(N²) trong C++
và tôi còn nhớ mình đã ngạc nhiên khi BASIC lại cho kết quả nhanh hơn dự kiến
Nhờ đó có thể cảm nhận rõ vì sao Python hữu ích trong AI
Code được vector hóa trên bộ nhớ tuyến tính nhanh hơn rất nhiều so với dữ liệu rải rác trên heap
Tổng hợp các phần trước
Loạt “Computer science courses that don't exist, but should” tiếp nối qua
bản năm 2015 (247 bình luận),
bản năm 2017,
bản năm 2018
Tôi nhớ tới môn Software Archaeology mà mình từng học ở đại học
Đó là lớp học yêu cầu triển khai lại các bài tập compiler từ thập niên 1970,
lúc đó tôi thấy vô dụng nhưng về sau nó giúp tôi rất nhiều trong việc hiểu thiết kế hệ thống
Khả năng lần theo bug cũ, wiki, lịch sử phiên bản và lịch sử đội ngũ là điều thiết yếu
Ngày nay nhiều chương trình khoa học máy tính thực chất đã biến thành trường dạy nghề lập trình
Sinh viên biết dùng framework nhưng không hiểu triết lý thiết kế ngôn ngữ hay sự tiến hóa của hệ thống
Không nên quên rằng điện toán không chỉ là triển khai mà còn là một ngành học về tư tưởng và ý tưởng
Do các tiêu chuẩn kiểm định, chương trình đào tạo khó mà lệch đi quá nhiều
CSCI 3210: Modern text encoding and processing
Môn này dạy về Unicode và UTF-8, và buộc người học từ bỏ quan niệm ‘1 ký tự = 1 byte’
Không chỉ nói về encoding mà còn bao quát cả tìm kiếm, sắp xếp, render font và xử lý emoji
Đây là kiến thức rất cơ bản nhưng hiếm ai thật sự hiểu đúng