Đây là chủ đề khó nuốt với tôi, nói thật. Tôi không thích thất bại, dù không ai nhìn thấy, và càng không thích khi có người chứng kiến. Nó thắt ruột tôi lại và rồi tôi tự nói với bản thân đủ thứ tệ mà tôi chẳng bao giờ nói với người khác.
Và tôi vẫn làm vậy dù biết đó là trò thua cuộc và hoàn toàn mâu thuẫn với lời khuyên tôi sắp đưa ra trong phần này.
Thay vào đó tôi nên làm gì?
Nhà tâm lý học Carol Dweck10 đã phổ biến thuật ngữ tư duy phát triển (growth mindset).
Ý chính của nó là:
Đại loại như vậy.
Đó là ngược lại với những gì tôi thường làm khi thua ván cờ Go12 thứ mấy tỷ. Sao mình lại có thể mắc nhiều sai lầm ngu ngốc đến vậy? Mình sẽ mãi không giỏi thứ này!
Nhưng đó là điều Dweck sẽ gọi là tư duy cố định (fixed mindset). Đó là niềm tin sai lầm của tôi rằng dù tôi chơi bao nhiêu, tôi vẫn bị giới hạn bởi những hạn chế cố hữu của bản thân và sẽ không bao giờ vượt qua được dù học 500.000 giờ!
Và khi nói ra như vậy, nó có vẻ khá ngớ ngẩn. Không ai có thể dành 500.000 giờ làm bất cứ điều gì mà không trở nên tốt hơn.
Hãy thua 50 ván đầu tiên càng nhanh càng tốt.
—Tục ngữ cờ Go
Vậy còn 50.000 giờ thì sao? 500 giờ? 50 giờ? 5 giờ?
Nghĩ lại, có vẻ như bất kỳ lượng luyện tập nào cũng sẽ là sự cải thiện.
Ngay cả khi bạn bị bế tắc hoàn toàn, bạn vẫn đang khám phá các hướng đi. Dù chúng hóa ra là ngõ cụt, bạn ít nhất đã biết chúng là vậy!
“Đó chẳng phải là cùng một thứ sao, như ‘flammable’ và ‘inflammable’? Trời ơi, tôi học được điều đó theo cách khó nhất.”
—Woody, Cheers
“Tuyệt vời. Thêm một cái gọi là trải nghiệm học hỏi nữa.”
—Mẹ tôi, người luôn mỉa mai
Mỗi thành công là một trải nghiệm học hỏi. Mỗi thất bại cũng là một trải nghiệm học hỏi. Mỗi trải nghiệm học hỏi cải thiện kỹ năng của bạn. Đừng sợ thất bại — hãy dùng nó để lên cấp.
“Bậc thầy đã thất bại nhiều lần hơn số lần người mới bắt đầu thậm chí đã thử.”
—Stephen McCranie
Tôi nghĩ đây là một trong những phẩm chất chính của bất kỳ ai vươn lên xuất sắc ở bất kỳ lĩnh vực nào. (Khái quát quá chứ?)
Ai sẽ đi xa hơn, người bỏ cuộc sau thất bại, hay người thất bại và thất bại và thất bại và thất bại nhưng vẫn đứng dậy, phủi bụi, và thử lại?
Đây là điều phân biệt các lập trình viên xuất sắc với những lập trình viên tầm thường. Các lập trình viên xuất sắc đã bị quật ngã hết lần này đến lần khác, và họ vẫn tiếp tục tấn công và tấn công và tấn công cho đến khi giải quyết được vấn đề. Và họ học được điều gì đó từ mỗi lần thất bại.
“Tôi chưa bao giờ thất bại. Tôi chỉ tìm ra 10.000 cách không hiệu quả.”
—Thomas Edison
Và có điều liên quan mà sinh viên có thể không nhận ra: các giảng viên của bạn cũng đã thất bại và thất bại và thất bại và thất bại! Đúng, họ có thể live-code việc xóa linked list trong lớp và làm đúng ngay từ lần đầu… nhưng thực ra đó không phải lần đầu tiên, phải không? Đó là, như khoảng, lần thứ 100 họ làm điều đó. Bạn tự code phần xóa linked list từ đầu 100 lần thì bạn cũng sẽ làm đúng ngay từ lần đầu!
Khi nhìn giảng viên làm mọi thứ trông dễ dàng như không, bạn có thể nản lòng vì tài liệu này có vẻ không thể với bạn. Và bạn bắt đầu nghĩ rằng giảng viên và một số bạn học có năng lực lập trình tự nhiên mà bạn đơn giản là không được sinh ra với nó. Kỹ năng thần kỳ nào họ đã được ban tặng từ trong bụng mẹ mà bạn sẽ không bao giờ có? (Bạn có nghe thấy tư duy cố định đang nói không?)
Nhưng đây là bí mật: không có sự khác biệt nào giữa bạn và giảng viên của bạn ngoài số lần thất bại bạn đã trải qua. Bạn cần phải thất bại nhiều hơn nữa để đạt được trình độ như họ!
Rất, rất ít người là lập trình viên “thiên bẩm”. 99,999% trong chúng ta phải làm việc thực sự chăm chỉ để học những thứ này.
Sự kiên trì không ngừng nghỉ là một trong những phẩm chất hàng đầu của các lập trình viên giỏi nhất thế giới.
Khi tôi đang suy nghĩ về việc lấy bằng Tiến sĩ (cuối cùng tôi không làm), cố vấn của tôi khuyên, “Bạn phải thực sự muốn nó.” Hàm ý là việc lấy bằng Tiến sĩ đòi hỏi quá nhiều công sức nên tôi phải có đủ động lực để bỏ thời gian ra.
Và tôi nghĩ đây là lời khuyên hay nói chung về việc học Khoa học Máy tính.
Có quá nhiều thứ thực sự khó phải mày mò, bạn phải có đủ động lực để làm. Nó không dễ dàng. Chút nào.
Tôi thích dùng ví dụ về việc tôi làm kế toán. Tôi biết mình đủ thông minh để làm (học phụ ngành toán!), nhưng tôi cũng biết tôi ghét nó. Người bạn cùng phòng cũ của tôi trở thành kế toán và tôi đã xui xẻo mở một cuốn sách hướng dẫn học của cô ấy. Tôi sẽ không bao giờ mắc sai lầm đó nữa.
Não tôi tắt ngay lập tức khi người ta bắt đầu nói về nó. Hãy tưởng tượng một thứ gì đó chán ngắt đến phát khóc mà bạn ghét. Rồi tưởng tượng dành bốn năm nghiên cứu nó tỉ mỉ đến tận xương tủy.
Nói cho bản thân mình và phóng chiếu rộng ra, tôi nghĩ sẽ khó hơn nhiều khi tìm động lực để bỏ công sức làm điều bạn ghét.
Tôi đã bị chỉ trích khá nhiều trên Hacker News vì khẳng định này một thời gian trước. Nhiều người bình luận rằng họ ghét lập trình nhưng vẫn có sự nghiệp với nó.
Thứ nhất, đó là… điều đáng tiếc. Nhưng thứ hai, tôi vẫn lập luận rằng những người yêu thích khoa học máy tính dễ lấy bằng hơn những người ghét nó.
Và những người có vẻ là “thiên bẩm” chính là những người thực sự yêu thích nó. Họ nghĩ về khoa học máy tính suốt (vì sao lại không nhỉ?), và do đó họ luyện tập rất nhiều. Nhiều hơn hẳn so với những người ghét nó.
Vậy nên, dù rõ ràng bạn có thể có sự nghiệp trong lĩnh vực béo bở mà bạn không thích, (a) nó sẽ khó hơn cho bạn so với những người thích nó và (b) có lẽ bạn nên cân nhắc một lĩnh vực mà bạn thực sự thích?
Bạn phải thực sự muốn nó. Bạn có đủ muốn để vượt qua lượng nỗ lực khổng lồ cần thiết để học nó không? Có thể bạn ghét lập trình, nhưng bạn đủ muốn tiền. Có thể bạn không quan tâm đến tiền, nhưng bạn muốn lập trình mỗi giây trong ngày.
Chỉ cần đảm bảo bạn có đủ động lực để thực hiện điều đó.
Khi bạn đọc cuộn giấy này
Bạn sẽ dần dần trở nên
Bối rối bởi những từ in trên đó—“Scroll of Learning Disability”, Tạp chí Dragon
Khoa học Máy tính khó. Thực sự khó. Nếu bạn quen với việc mọi thứ tương đối dễ vì bạn là người thông minh nhất lớp, thì có thể bạn sẽ sốc khi đến một số chủ đề này và bị thua tan tành.
Nhưng nó khó như vậy với tất cả mọi người. Bạn không được ban phát một khả năng đặc biệt thiếu khả năng học khoa học máy tính. Bạn chỉ phải tiếp tục đập đầu vào vấn đề giống như tất cả mọi người.
Bạn không nghi ngờ gì rằng tung 11 quả bóng cùng một lúc là khó với tất cả mọi người, đúng không? Thế nhưng, người ta vẫn làm được13.
“Bạn biết cách đến Carnegie Hall không?”
“Luyện tập!”—Câu đùa không rõ nguồn gốc
Lặp, lặp, lặp, lặp.
Khi bạn ở trường, thực ra bạn còn khó khăn hơn khi đi làm. Ở trường, bạn liên tục học những thứ mới và, ngay khi bạn vừa mới nắm được một chủ đề, bạn đã chuyển sang học thứ khác cũng vô cùng thách thức. Bằng đại học là bốn năm liên tục chỉ vừa đủ bám víu vào lượng tài liệu mới không ngừng được trình bày cho bạn.
Và khi bạn cuối cùng lấy được bằng và có việc làm, ba tháng đầu tiên của công việc đó cũng là một trải nghiệm học hỏi tốc độ cao, vừa học vừa lo.
Nhưng sau ba tháng, bạn bắt đầu nắm được code. Và nó trở nên dễ hơn. Cảm giác bám víu bằng đầu móng tay bắt đầu giảm bớt. Và — tôi biết điều này có thể khó tin bây giờ — rốt cuộc công việc có thể trở nên dễ đến mức nhàm chán. Và rồi bạn sẽ tìm việc khác với những thách thức mới thú vị hơn.
Đối chiếu tư duy phát triển với tư duy cố định.
Bạn đã từng bị giới hạn bởi tư duy cố định chưa? Một số kỹ thuật nào bạn có thể dùng để chuyển sang tư duy phát triển?
Tại sao sự kiên trì là phẩm chất quan trọng mà các lập trình viên cần có?
Sự khác biệt chính giữa giảng viên làm mọi thứ trông dễ dàng và sinh viên đang vật lộn với cùng tài liệu là gì? Sinh viên cần làm gì để cũng làm mọi thứ trông dễ dàng?