Hầu hết chúng ta đều nhận cùng một lời khuyên: để trở thành người giải quyết vấn đề tốt hơn, bạn cần giải quyết nhiều vấn đề hơn. Nhưng mọi chuyện không đơn giản như vậy, để giỏi bất cứ điều gì cần nhiều hơn là chỉ lặp lại. Cách mà bạn làm cũng vô cùng quan trọng.

Bên cạnh đó, khi các lập trình viên nghe lời khuyên “giải quyết nhiều vấn đề hơn”, họ thường nghĩ rằng “nhiều hơn” có nghĩa là nhanh hơn. Đó là một sai lầm phổ biến khi bắt đầu nghề này.

Lao đầu vào guồng quay giải quyết vấn đề sẽ gây bất lợi cho việc học hỏi và cải tiến. Sớm thôi, bạn sẽ vượt qua vài vấn đề và hướng đến các vấn đề tiếp theo. Nhưng những gì đến cũng sẽ đến, bằng cách tập trung vào số lượng, bạn sẽ dễ thỏa hiệp ở chất lượng và bỏ lỡ những bài học quan trọng trong suốt quá trình.

Sự lặp lại không có nghĩa là không quan trọng, tuy nhiên, chỉ riêng lặp lại sẽ không đủ để giúp bạn giải quyết vấn đề, mà phải là toàn bộ quy trình.

Vậy nên, bài viết này sẽ đưa ra một kế hoạch hành động, nó chắc chắn liên quan đến sự lặp lại và hàng loạt những thứ quan trọng khác.

1. Giải quyết nhiều loại vấn đề trên nhiều nền tảng khác nhau

“Tôi đã bị ám ảnh bởi HackerRank khi tôi bắt đầu học viết code,” một giảng viên của một khóa học Python cho biết. Mặc dù bạn có một nền tảng yêu thích, nhưng đừng giới hạn mình trong một nền tảng duy nhất. Đây là lý do tại sao bạn cần phải sẵn sàng cho mọi thứ.

Nếu mục tiêu là chuyển đổi suôn sẻ giữa các loại vấn đề khác nhau và trên các nền tảng khác nhau. Các vấn đề trên Interview Cake khác với các vấn đề trong cuốn sách của Reuven Lerner, Python Workout. Tương tự như vậy, mô tả vấn đề (problem statement) trong Bài tập Python hàng tuần của Lerner khác với các trên HackerRank.

Ai cũng có sở thích của riêng mình, tuy nhiên, cần phải có khả năng giải quyết đa dạng các vấn đề. Vì vậy, việc sử dụng nhiều nền tảng và tài nguyên khác nhau để luyện tập thực sự có ích.

Dưới đây là một số ví dụ:

  • LeetCode
  • Cracking the Coding Interview của Gayle Laakmann McDowell
  • Exercism
  • Interview Cake
  • Python Workout của Reuven Lerner
  • Weekly Python Exercise của Reuven Lerner

Vào ngày Chủ nhật, khi lập kế hoạch cho tuần tới, bạn có thể chọn một vài vấn đề từ các nguồn trên. Ví dụ: bạn sẽ chọn một vấn đề tập trung vào tìm kiếm nhị phân (binary search) từ LeetCode. Sau đó, tập trung vào cấu trúc dữ liệu từ một trong các nguồn của Reuven Lerner.

Việc luyện tập này sẽ khiến bạn không thể ngồi yên khi bạn không thể dựa vào cùng một cấu trúc dữ liệu hoặc một kỹ thuật, bạn cần chọn công cụ tốt nhất cho công việc, bạn phải có khả năng xoay sở.

Thực sự là một thử thách nếu bạn chọn những vấn đề khó để đẩy đến cực hạn của bản thân, đó là một đặc điểm mà nhà tâm lý học Anders Ericsson gọi là “luyện tập có chủ ý”.

Luyện tập có chủ ý dùng để phát triển kỹ năng. Đó là một nỗ lực dẫn đến sự tập trung hoàn toàn, có ý thức để đưa bạn ra khỏi “vùng an toàn” của mình, tập trung vào một mục tiêu cụ thể và “đòi hỏi nỗ lực gần như tối đa”, Ericsson giải thích trong cuốn sách tiêu biểu của mình, Peak.

Nói cách khác, bạn sẽ khó mà làm điều gì đó một cách dễ dàng hoặc tự nhiên. “Dấu hiệu của… thực hành có chủ ý” Ericsson viết, "là bạn cố gắng làm điều gì đó mà bạn không thể làm được."

2. Tập luyện chéo (cross-train) cho bộ não lập trình của bạn

Bạn thường nghe về những vận động viên kết hợp tập luyện chéo vào lịch tập. Ví dụ, một vận động viên điền kinh hoàn thành một hoặc hai bài tập đạp xe mỗi tuần. Nó mang lại rất nhiều ý nghĩa: bởi các vận động viên tập luyện chéo sẽ tăng cường sức khỏe hệ tim mạch của họ từ một góc độ khác.

Tập luyện chéo liên quan đến giải quyết các vấn đề toán học. Bạn sẽ áp dụng chiến thuật này để giải quyết một vấn đề lập trình nhưng trong toán học. Cùng một quy trình, bối cảnh khác nhau.

Đây là một cuốn sách có ích cho bạn trong việc này: The Art of Problem Solving. Nó cung cấp các lợi ích đào tạo chéo được đề cập ở trên, nhưng hơn thế nữa, nó giúp bạn xây dựng trực giác để giải quyết vấn đề.

Sẽ thực quan trọng nếu trực giác của bạn cho biết khi nào có thể sử dụng các phương trình, quy trình toán học, mà không cần phải ghi nhớ chúng. Điều này cũng đúng khi giải các bài toán lập trình.

3. Học hỏi từ các giải pháp của bạn

Tất cả chúng ta đều gặp khó khăn và tất cả chúng ta đều mắc lỗi trong khi giải quyết vấn đề. Dựa vào những thất bại này, bạn sẽ tìm ra cách làm khác.

Thông thường, đó là nơi việc học dừng lại. Khi giải quyết xong vấn đề, ta rất nóng lòng muốn gạt nó đi một bên. Nhưng đừng làm vậy.

Nhà toán học Richard Hamming khuyên rằng đó là thời điểm bắt đầu việc học.

“Tôi coi việc học dựa trên thành công về cơ bản là quan trọng hơn học dựa trên thất bại… có rất nhiều cách sai và rất ít cách đúng, học hỏi dựa trên thành công sẽ hiệu quả hơn,” Hamming viết trong cuốn sách của mình, The Art of Doing Science and Engineering.

Bạn luôn nghe về cách chúng ta cần “học hỏi từ những thất bại của mình”. Nhưng Hamming đã đúng: có rất nhiều điều đáng học hỏi từ những thành công của chúng ta.

Vì vậy, một trong những thay đổi lớn nhất mà bạn có thể thực hiện đối với quá trình giải quyết vấn đề của mình là áp dụng những lời của Hamming vào thực tiễn. Ví dụ: việc giải quyết vấn đề đầu tiên của bạn liên quan đến danh sách được liên kết (linked list), một cấu trúc dữ liệu. Sau khi giải quyết vấn đề, bạn phải chú tâm học hỏi, nghiên cứu nó. Bạn có thể sao chép giải pháp của mình vào tệp Google Doc và sử dụng nhận xét để giải thích code cho chính mình.

Bạn phải đảm bảo hiểu rõ ràng những gì bạn đã làm và tại sao nó lại vậy, tất cả vì lý do quan trọng này: để bạn có thể làm lại chúng lần sau.

4. Nhận phản hồi

Nhận thức là một giáo viên tuyệt vời.

Đừng cho rằng các giải pháp của bạn là nhất. Để hiểu chính mình, bạn phải nhận phản hồi. Phản hồi là một yếu tố quan trọng nếu bạn muốn trở nên tốt hơn. Nó cũng là một thành phần của luyện tập có chủ ý.

Có hai cách nhận phản hồi.

Đầu tiên, sau khi hoàn thành một vấn đề, bạn hãy nghiên cứu giải pháp của những người khác. Đôi khi các tài nguyên như LeetCode và Cracking the Coding Interview, cung cấp các giải pháp. Hoặc, bạn có thể tìm thấy giải pháp của một lập trình viên đã giải quyết vấn đề tương tự. Đôi khi sử dụng cả hai.

Dù bằng cách nào, bước tiếp theo vẫn giống nhau: bạn sẽ bắt đầu từ đầu giải pháp và giải thích từng dòng bằng lời của riêng bạn. Bạn suy đoán tại sao lập trình viên chọn cấu trúc dữ liệu cụ thể này, chẳng hạn. Sau đó, bạn viết một bản tóm tắt ngắn về chương trình để củng cố các khái niệm cốt lõi hoặc cách tiếp cận mới mà bạn vừa học được.

Thêm một vài sự phức tạp, chẳng hạn vào một dòng code, vào từ ngữ của riêng bạn. Đây thực sự là một bài kiểm tra tuyệt vời để xem bạn có thực sự hiểu nó hay không. Ngoài ra, bạn còn được thực hành một kỹ năng cốt lõi khác: đọc code.

Nếu có điều gì đó mới đối với bạn, hãy nghiên cứu nó. Hãy so sánh code của mọi người với code của riêng bạn. Hãy học, rồi đánh giá, rồi lại học. Đó là một quá trình gian khổ, nhưng bạn chắc chắn nhận được rất nhiều từ nó.

Cách thứ hai để nhận được phản hồi là hỏi một lập trình viên khác. Cuộc gọi video rất hữu ích trong việc xem xét từng dòng code trong thời gian thực (real-time), dù các pull request cũng là một lựa chọn.

Đừng quên rằng: hãy áp dụng nó! Đưa những điều bạn học được vào thực tế.

5. Hãy nhất quán

Bây giờ, hãy nói về sự lặp lại. Giải quyết vấn đề là một kỹ năng, giống bất kỳ kỹ năng nào, nó cần có thời gian, chứ không đơn giản chỉ cần ngày một ngày hai mà thành thạo. Đó là lý do tại sao bạn nên dành thời gian mỗi ngày để giải quyết vấn đề.

Chúng ta thường nghe những phản ứng như: “Có quá nhiều thứ để học. Tôi không thể dành thời gian mỗi ngày cho việc giải quyết vấn đề. "

Trả lời cho vấn đề này, có hai phần, đầu tiên, luôn luôn có nhiều thứ hơn để học. Thứ hai, phần lớn lập trình là giải quyết vấn đề, đó là nền tảng cho nghề của chúng ta. Nó xứng đáng với thời gian và công sức của bạn bỏ ra mỗi ngày. Đây là lưu ý: hãy thực hiện việc luyện tập hàng ngày của bạn một cách có chủ đích.

Một loại nghệ thuật

Giải quyết vấn đề là một nghệ thuật. Những ý tưởng được nêu trong bài viết này là một trong vô số những cách tiếp cận để giải quyết vấn đề tốt hơn, cách tiếp cận của bạn có thể trông rất khác. Chung quy là: hãy luyện tập có chủ đích. Chất lượng rất quan trọng, hãy làm cho mỗi vấn đề có giá trị.

 

Tổng hợp việc làm IT - Software trên VietnamWorks
VietnamWorks InTECH
Xem bài viết gốc