22 Jun, 2021
Cách cải tiến các kĩ năng lập trình
Vài năm trước, một sinh viên nói với tôi: “Em ghét viết mã.” Điều này có vẻ rất tiêu cực với bất kì giáo sư nào dạy lập trình nhưng thực tế nó chỉ là một cách diễn đạt của một sinh viên thất vọng, người chưa có đủ kĩ năng lập trình. Chỉ khi họ thu được đủ kinh nghiệm và hiểu cái gì là sai và cái gì là đúng với công việc riêng của họ, họ mới có khả năng viết mã tốt hơn. Điều quan trọng cần làm là xoá bỏ nỗi sợ lập trình và cải tiến tin tưởng của sinh viên vào năng lực của họ để viết mã. Đây là một kĩ thuật đơn giản tôi đã dùng trong lớp của tôi.
Vào đầu môn học, tôi bảo sinh viên rằng ba chương trình đầu tiên sẽ không cho điểm. Điều đó có nghĩa là họ có thể phạm sai lầm và không thành vấn đề liệu chương trình của họ có chạy hay không. Điều đó làm giảm bớt cảm giác căng thẳng của sinh viên về việc học lớp lập trình máy tính. Điều tôi muốn từ họ chỉ là bản thân họ viết mã và thực nghiệm quá trình viết mã. Mặc dầu những chương trình này không được cho điểm nhưng họ phải chuyển qua chủ định nhận diện các sai lầm mà họ phạm phải để cho tôi có thể sửa cho họ trong lớp và giải thích tại sao chương trình của họ không làm việc.
Trong ba chương trình tiếp, thay vì sửa sai lầm của họ, tôi chỉ cho lớp các chương trình mẫu trên bảng và yêu cầu sinh viên sửa sai lầm riêng của họ. Họ kiểm lại chương trình riêng của mình, từng dòng một để nhận diện các sai lầm riêng của họ. Sau đó tôi kiểm chương trình của họ rồi thảo luận về các vấn đề chung tìm ra trong chương trình của họ. Trong chương trình thứ nhất, phần lớn sinh viên đều có khả năng sửa được lỗi cú pháp riêng của họ, một số có khả năng tìm ra sai lầm trong logic riêng của họ nhưng ở chương trình thứ hai và thứ ba, phần lớn có thể nhận diện ra mọi vấn đề mà họ đã phạm phải và bắt đầu hiểu tại sao chương trình của họ không làm việc. Nói cách khác, họ học từ sai lầm riêng của họ. Đến lần này, tôi cũng để cho lớp biết rằng những chương trình đó sẽ không được cho điểm để xả bớt sức ép của họ nhưng tôi bảo họ từ giờ trở đi, nếu họ vẫn phạm cùng sai lầm lần nữa trong chương trình của họ, nó sẽ bị cho điểm và cộng vào điểm chung kết.
Khi lớp tiếp tục, phần lớn sinh viên học cách nhận ra sai lầm riêng của mình và có khả năng sửa chúng. Qua thời gian, ít người phạm sai lầm và họ trở nên ít thất vọng hơn khi kĩ năng lập trình của họ cải tiến lên. Vào lúc này, phần lớn sinh viên thu được tin tưởng vào năng lực viết mã của họ nên tôi để cho sinh viên kiểm chương trình lẫn cho nhau để sửa cho họ khi họ học thêm về cấu trúc và logic từ cách nhìn của người khác. Phần lớn sinh viên hiểu rằng bằng việc kiểm chương trình của bạn cùng lớp, họ có thể cải tiến kĩ năng viết mã riêng của họ.
Khi sinh viên cảm thấy thoải mái về lập trình, tôi tiếp tục xây dựng niềm tin của họ bằng việc cho các bài tập “Mini-hackathon” hàng tuần (bài tập lập trình tập trung cho một chủ đề) nơi họ được yêu cầu viết một chương trình nhỏ (xấp xỉ 100 tới 250 dòng mã) trong vòng nửa giờ. Bất kì ai kết thúc đầu tiên với kết quả đúng sẽ nhận được điểm thưởng. Kiểu thi đua này khuyến khích họ phát triển kĩ năng lập trình tốt hơn vì họ phải viết mã nhanh trong một thời gian cố định. Tôi có thể quan sát cách sinh viên làm việc khi họ làm việc để hoàn thành thách thức này. Một số người dường như không thoải mái là họ có thể không có khả năng hoàn thành đúng thời gian đã phân, nhưng hoài nghi của họ nhanh chóng thay đổi khi họ ít tập trung vào thời gian và nhiều hơn vào kết quả. Sinh viên hài lòng nhất là những người đã từng nghĩ họ không bao giờ có thể làm được nó, nhưng tìm ra cách để hoàn thành thách thức này. Sau quãng năm hay sáu tuần, phần lớn sinh viên nói với tôi rằng viết mã đã trở thành tự nhiên như họ viết trong tiếng Anh vì họ thậm chí không nghĩ nhiều về cú pháp hay qui tắc thêm nữa. Một sinh viên hài lòng giải thích: “Bây giờ em biết học qua hành nghĩa là gì. Đầu tiên em học làm nó rồi em học cái gì làm việc và cái gì không làm việc rồi em học làm nó ngay bằng việc áp dụng qui tắc rồi cách qui tắc có thể được thay đổi và tổng quát hoá. Đột nhiên nó trở thành một phần của suy nghĩ của chúng em và khả năng viết mã của chúng em.”
Tôi có thành công rất tốt với kĩ thuật này trong mọi lớp lập trình của mình, bất kể liệu đó là Java hay C++ hay Python. Khi sinh viên không cảm thấy bị căng thẳng bởi điểm hay thất bại, họ sẽ tập trung nhiều hơn vào học tập. Khi sinh viên được cho cơ hội học từ sai lầm riêng của họ, họ sẽ học tốt. Khi sinh viên được cho nhiều cơ hội hơn để thực hành, họ sẽ phát triển các kĩ năng của họ. Khi họ có kĩ năng, họ sẽ cảm thấy ổn hơn về bản thân họ, và thu được tin tưởng vào năng lực của họ. Học qua hành là về việc cho họ cơ hội để bản thân họ học nhưng tất nhiên, họ cần hỗ trợ và hướng dẫn từ thầy giáo.
—English verson—
How to improve programming skills
Few years ago, a student told me: “I hate coding.” This may sound very negative to any professor who teaches programming but actually it is just an expression of a frustrated student who does not have sufficient programming skills yet. Only when they gain enough experience and understand what is wrong and what is right with their own work, they will be able to write code better. The important thing to do is to eliminate the fear of programming and improve students’ confidence in their ability to write codes. Here is a simple technique that I have used in my classes.
At the beginning of the course, I tell students that the first three programs will not be graded. It means they can make mistakes and it does not matter whether their programs are running or not. It reduces the stress students feel about taking computer programming class. What I want from them is just write code and experiment the coding process by themselves. Although these programs are not graded but they must turn in for the purpose of identifying mistakes that they make so I can correct them in class and explain why their programs do not work.
In the next three programs, instead of correcting their mistakes, I show the class sample programs on the black board and ask students to correct their own mistakes. They review their own program, line by line to identify their own mistakes. After that I review their programs then discuss about common problems often found in their programs. In the first program, most students are able to correct their own syntax, some are able to find mistake in their own logic but at the second and third programs, most can identify all problems that they have made and begin to understand why their programs do not work. In other word, they learn from their own mistakes. By this time, I also let the class know that those programs will not be graded to release their stress but I tell them from now on, if they still make the same mistakes again in their program, it will be graded and added to the final grade.
As the class continues, most students learn how to recognize their own mistakes and be able to fix them. Over time, few are making mistakes and they become less frustrated as their programming skills improve. At this time, most students gain confidence in their ability to write code then I let students review each other’s program to correct them as they learn more about structure and logic from other’s views. Most students understand that by reviewing their classmates’ programs, they can improve their own coding skills.
When students feel comfortable about programming, I continue to build their confidence by giving a “Mini-hackathon” exercise each week where they are required to write a small program (approximately 100 to 250 line of code) within half an hour. Whoever finishes first with correct results will get extra bonus points. This type of competition encourages them to develop better programming skills as they must code quickly within a fix time. I can watch how students go through as they work to accomplish this challenge. Some seem uncomfortable that they may not be able to finish in the time allotted, but their doubts quickly change as they focus less on the time and more on the result. The happiest students are the ones who thought they could never do it, but find a way to complete the challenge. After about five or six weeks, most students tell me that writing code has become as natural as they write in English as they do not even think much about syntax or rules anymore. One happy student explains: “Now I know what learning by doing means. First I learn to do it then I learn what works and what does not works then I learn to do it right by apply the rule then how the rule can be modified and generalized. Suddenly it become part of our thinking and our coding ability.”
I have very good success with this technique in all my programming classes, regardless whether it is Java or C++ or Python. When students do not feel stress by grade or failure, they will focus more on learning. When students are given the chance to learn from their own mistakes, they will learn well. When students are given more chance to practice, they will develop their skills. When they have the skills, they will feel better about themselves, and gaining confidence about their ability. Learning by doing is about giving them the opportunity to learn by themselves but of course, they do need support and guidance from teachers.