10 lời khuyên hữu ích dành cho các lập trình viên mới vào nghề

10 bước giải quyết các vấn đề trong lập trình

Bạn có biết các lập trình viên mới vào nghề nên bắt đầu từ đâu hay không? Hãy cùng Quản Trị Mạng tham khảo 10 lời khuyên hữu ích dành cho các lập trình viên mới vào nghề trong bài viết này nhé!

Tôi - tác giả bài viết có nghe một số lập trình viên mới vào nghề đang xoay sở không biết nên bắt đầu từ đâu.

Bạn hiểu vấn đề, hiểu logic, hiểu những điều cơ bản về cú pháp… Lúc nhìn code của người khác bạn có thể hiểu và làm theo nhưng đến khi tự mình làm bạn lại cảm thấy không chắc chắn trong việc chuyển suy nghĩ của mình thành code, mặc dù hiểu về cú pháp hoặc logic.

Trong bài viết này, tôi sẽ trình bày về quy trình các bước giải quyết vấn đề. Hy vọng sẽ hữu ích trong quá trình lập trình của bạn.

10 lời khuyên hữu ích dành cho các lập trình viên mới vào nghề

1. Đọc vấn đề ít nhất ba lần

Bạn không thể giải quyết vấn đề nếu như bạn không thực sự hiểu. Có sự khác biệt giữa vấn đề thực sự và vấn đề mà bạn nghĩ rằng bạn đang giải quyết. Thật dễ dàng để bắt đầu đọc vài dòng code đầu của một vấn đề và đặt giả thiết cho phần còn lại bởi nó giống như một thứ gì đó bạn đã nhìn thấy trong quá khứ.

Nếu bạn đang tạo ra một trò chơi phổ biến như Hangman (Người treo cổ), hãy chắc chắn rằng mình đã đọc qua tất cả các quy tắc ngay cả khi bạn từng chơi nó trước đó. Một lần, tôi được yêu cầu tạo ra một game giống Hangman và nhận ra rằng mình là "Evil Hangman" vì chỉ đọc hướng dẫn mà không đọc tất cả các quy tắc.

  • Theo Wikipedia, người treo cổ là một trò chơi sử dụng bút và giấy theo kiểu đoán từ dựa vào số ký tự của từ đó. Trò này gồm có 2 người chơi với phương tiện đơn giản là bút và giấy trắng. Người chơi thứ nhất sẽ nghĩ một từ trong đầu và đưa ra số ký tự của từ đó dưới dạng một hàng ngang và người thứ hai sẽ lần lượt đoán hết chữ cái mà họ cho là có mặt trong từ. Mỗi lần đoán đúng các gạch ngang tương ứng được thay bằng chữ cái đoán được, còn mỗi lần đoán sai thì "giá treo cổ" sẽ được vẽ thêm một nét của người treo cổ. Trò chơi kết thúc khi một từ được đoán đúng hoặc hình người treo cổ gồm 6 nét, tương ứng với 6 lần đoán sai được hoàn tất.

Đôi khi, tôi thử giải thích vấn đề cho bạn bè và xem liệu rằng họ có hiểu những gì mà tôi đang nói và nhờ họ đánh giá xem nó có phù hợp với vấn đề tôi được giao hay không. Chắc hẳn bạn không muốn phát hiện mình đã hiểu sai vấn đề khi đi được nửa chặng đường rồi phải không? Do đó, việc dành thêm thời gian lúc bắt đầu để thực sự hiểu là điều cần thiết. Bạn càng hiểu rõ vấn đề bao nhiêu, vấn đề sẽ càng được giải quyết dễ dàng bấy nhiêu.

Hãy tưởng tượng chúng ta đang tạo ra một hàm đơn giản selectEvenNumbers đặt vào một mảng (array) các số và trả về một mảng số selectEvenNumbers chỉ có các số chẵn. Nếu không có số chẵn, nó sẽ trả lại kết quả là mảng rỗng evenNumbers.

Mảng số selectEvenNumbers

Dưới đây là một số câu hỏi hiện lên trong đầu tôi:

  • Làm thế nào máy tính có thể cho biết đó là một số chẵn? Chia số đó cho 2 và kiểm tra xem số dư bằng 0 không.
  • Tôi sẽ gán cái gì vào hàm này? Một mảng.
  • Mảng đó sẽ chứa thứ gì? Một hoặc nhiều số.
  • Kiểu dữ liệu của các phần tử trong mảng là gì? Kiểu số.
  • Mục đích của hàm này là gì? Tôi sẽ trả về những gì khi kết thúc hàm này? Mục tiêu là lướt qua các phần tử, chọn ra các số chẵn và trả chúng về trong một mảng. Nếu không có số chẵn, hàm sẽ trả về một mảng trống.

Xem thêm: Với 5 mẹo này sẽ giúp bạn cải thiện được khả năng lập trình logic

2. Thử bằng tay ít nhất 3 bộ dữ liệu mẫu khi giải quyết vấn đề

Lấy ra một mảnh giấy và xử lý các vấn đề bằng cách thủ công. Hãy nghĩ ra ít nhất ba bộ dữ liệu mẫu bạn có thể sử dụng. Hãy xem các trường hợp CornerEdge:

  • Trường hợp Corner: Một vấn đề hoặc tình huống xảy ra bên ngoài các tham số hoạt động (operating parameter) bình thường, đặc biệt khi nhiều biến môi trường (environmental variable) hoặc các điều kiện xảy ra đồng thời ở cấp độ cực cao, mặc dù mỗi tham số nằm trong phạm vi được chỉ định cho tham số đó.
  • Trường hợp Edge: Một vấn đề hoặc tình huống xảy ra chỉ ở một tham số hoạt động cực trị (lớn nhất hoặc nhỏ nhất).

Dưới đây là một số bộ dữ liệu mẫu có thể sử dụng:

Dưới đây là một số bộ dữ liệu mẫu có thể sử dụng

Khi mới bắt đầu thực hiện, bạn sẽ dễ dàng bỏ qua các bước. Bởi bộ não của bạn có thể đã quen với những số chẵn, bạn có thể chỉ nhìn vào một tập hợp các dữ liệu mẫu, nhặt ra các con số 2, 4, 6 và từ đó không còn cẩn thận làm toàn bộ các bước để giải quyết vấn đề. Nếu đây là thử thách, hãy thử sử dụng các bộ dữ liệu thật lớn để tập cho não bạn thói quen xử lý chi tiết từng bước một. Điều đó giúp bạn làm việc thông qua thuật toán thực tế.

Hãy nhìn vào mảng đầu tiên [1]

  1. Nhìn vào phần tử duy nhất trong mảng [1].
  2. Xác định xem nó có là số chẵn hay không. Nó không phải.
  3. Nhận thấy không còn phần tử nào trong mảng này.
  4. Xác định rằng không có số chẵn nào trong mảng được cung cấp.
  5. Trả về một mảng trống.

Hãy nhìn vào mảng [1, 2]

  1. Nhìn vào phần tử đầu tiên trong mảng [1, 2].
  2. Đó là 1.
  3. Xác định xem nó có phải số chẵn hay không. Nó không phải.
  4. Nhìn vào phần tử tiếp theo của mảng.
  5. Đó là 2.
  6. Xác định xem nó có phải số chẵn hay không. Nó là số chẵn.
  7. Tạo một mảng evenNumbers và thêm 2 vào mảng này.
  8. Nhận thấy không còn phần tử nào trong mảng này.
  9. Trả về mảng evenNumbers với số 2.

Quan sát thêm vài lần nữa. Lưu ý cách mà tôi viết về [1] có thay đổi một chút so với [1, 2]. Đó là lý do tại sao tôi thử với nhiều bộ dữ liệu mẫu khác nhau. Tôi có một số bộ chỉ có một phần tử, một số bộ có số thập phân thay vì số nguyên, một số bộ có nhiều chữ số trong một phần tử và một số bộ là số âm.

Xem thêm: 16 ngôn ngữ lập trình sẽ thay đổi thời vận của bạn trong năm 2017

3. Đơn giản và tối ưu hóa các bước

Tìm các mẫu chung và xem có thể khái quát hóa được bất cứ thứ gì không. Từ đó bạn có thể giảm các bước thực hiện hoặc số lần lặp lại code:

  1. Tạo một hàm selectEvenNumbers.
  2. Tạo một mảng rỗng mới evenNumbers nơi bạn có thể lưu trữ các số chẵn nếu có.
  3. Duyệt qua từng phần tử trong mảng [1, 2].
  4. Tìm phần tử đầu tiên.
  5. Quyết định xem nó có phải số chẵn hay không nhờ phép chia hết cho 2. Nếu nó là số chẵn, thêm nó vào evenNumbers.
  6. Tìm phần tử tiếp theo.
  7. Lặp lại bước # 4.
  8. Lặp lại bước # 5 và # 4 cho đến khi không còn phần tử nào trong mảng này.
  9. Trả về mảng evenNumbers, dù mảng có phần tử nào hay không.

Cách tiếp cận này có thể nhắc bạn về phép quy nạp trong toán học, bởi bạn:

  • Cho điều cần chứng minh đúng với n = 1, n = 2, ...
  • Giả sử nó đúng với n = k
  • Chứng minh nó đúng với n = k + 1

4. Viết code giả (pseudocode)

Ngay cả sau khi hoàn thành các bước chung, hãy viết ra code giả để chuyển hóa ý tưởng giúp xác định được cấu trúc của code và làm cho việc viết code trở nên dễ dàng hơn nhiều. Viết code giả bằng tay từng dòng một. Bạn có thể làm trên giấy hoặc qua bình luận trong trình biên tập code. Bạn nên viết trên giấy để tập trung tốt hơn.

Code giả không thực sự có quy tắc cụ thể nhưng đôi lúc, tôi vẫn áp dụng các cú pháp từ ngôn ngữ lập trình vì tôi đã quen với ngôn ngữ đó. Tuy nhiên, đừng quá chú trọng cú pháp mà hãy tập trung vào logic và các bước chạy code phía trên.

Đối với ví dụ trên, có rất nhiều cách khác nhau. Ví dụ, bạn có thể dùng bộ lọc filter nhưng để đơn giản và dễ theo dõi, chúng tôi dùng vòng lặp for cơ bản (nhưng sẽ dùng filter sau khi cấu trúc lại code).

Đây là ví dụ về code giả viết một cách dài dòng:

Đây là ví dụ về code giả viết một cách dài dòng

Đây là ví dụ về code giả viết một cách ngắn gọn hơn:

Đây là ví dụ về code giả viết một cách ngắn gọn hơn:

Dù bằng cách nào cũng được miễn bạn viết ra từng dòng và hiểu được logic trong mỗi dòng.

Hãy xem lại vấn đề để chắc chắn rằng bạn đang đi đúng hướng.

Xem thêm: Người mới bắt đầu học lập trình máy tính cần tập trung vào những gì?

5. Chuyển code giả thành code và gỡ lỗi

Sau khi có sẵn code giả, chuyển đổi từng dòng sang code thực bằng ngôn ngữ mà bạn đang làm việc. Tôi dùng Javascript cho ví dụ này.

Nếu bạn đã viết nó ra giấy, hãy gõ lại trên trình biên tập code rồi thay thế từng dòng.

Sau đó tôi gọi hàm và truyền vào các dữ liệu mẫu mà chúng ta dùng lúc trước. Tôi sử dụng chúng để xem kết quả trả về có đúng ý mình muốn hay không. Bạn cũng có thể viết các test case để kiểm tra kết quả trả về có đúng mong đợi hay không.

Chuyển code giả thành code và debug

Tôi thường sử dụng console.log () sau mỗi biến hoặc dòng. Điều này giúp tôi kiểm tra xem các giá trị và code có hoạt động như mong đợi trước khi tiếp tục bước tiếp theo. Bằng cách này, tôi sẽ phát hiện ra các vấn đề trước khi sai quá nghiêm trọng. Dưới đây là một ví dụ về những gì tôi sẽ kiểm tra trước khi bắt đầu. Tôi làm điều này thông qua code tôi gõ ra.

Kiểm tra trước khi bắt đầu

Sau khi bước qua từng dòng code giả, tôi thêm // vào trước . Còn phần văn bản in đậm là code thực trong JavaScript.

Code thực trong JavaScript.

Sau đó bỏ code giả để tránh nhầm lẫn.

Sau đó bỏ code giả để tránh nhầm lẫn.

Đôi khi, các developer mới vào nghề sẽ bị mắc kẹt với cú pháp làm cản trở họ tiến lên phía trước. Hãy nhớ rằng cú pháp chỉ trở nên tự nhiên và thân quen sau khi làm việc lâu năm và không có gì xấu hổ khi tra lại các tài liệu để hoàn chỉnh cú pháp khi code thực sự.

Xem thêm: Bạn đã biết 15 ngôn ngữ lập trình hot nhất trên GitHub này chưa?

6. Đơn giản và tối ưu code của bạn

Bạn có thể nhận thấy đơn giản hóa và tối ưu hóa là các chủ đề lặp lại.

Trong ví dụ này, một cách tối ưu hóa hàm là lọc ra các mục từ một mảng bằng cách trả về một mảng mới sử dụng filter. Bằng cách này, chúng ta không cần phải định nghĩa một biến mới evenNumbers bởi filter sẽ trả về một mảng mới với các bản sao của các phần tử phù hợp với filter. Điều này sẽ không làm thay đổi mảng gốc. Chúng ta cũng không cần sử dụng vòng lặp for với cách tiếp cận này. filter sẽ duyệt qua từng mục và trả về true (bao gồm phần tử đó trong mảng) hoặc false (bỏ qua phần tử trong mảng đó).

Đơn giản và tối ưu code của bạn

Đơn giản và tối ưu hoá code có thể yêu cầu bạn phải lặp lại một vài lần, xác định cách để đơn giản hóa và tối ưu hóa code hơn nữa.

Dưới đây là một số câu hỏi cần ghi nhớ:

  • Mục tiêu đơn giản hóa và tối ưu hóa của bạn là gì? Mục tiêu sẽ phụ thuộc vào phong cách của nhóm hoặc sở thích cá nhân của bạn. Bạn đang cố gắng rút gọn code càng nhiều càng tốt phải không? Nếu mục tiêu của bạn là làm cho code dễ đọc hơn thì bạn có thể muốn dùng thêm dòng để định nghĩa biến hoặc tính toán một cái gì đó hơn là cố gắng định nghĩa và tính toán tất cả trong một dòng.
  • Làm thế nào bạn có thể làm cho code dễ đọc hơn?
  • Bạn có thể lược bớt bước nào không?
  • Có bất kỳ biến hoặc hàm nào mà bạn đã kết thúc, thậm chí không cần hoặc sử dụng?
  • Bạn có lặp lại một số bước nhiều lần? Xem xem bạn có thể định nghĩa nó trong một hàm khác không?
  • Có cách nào tốt hơn để xử lý các trường hợp edge?

Xem thêm: Top 20 website học lập trình miễn phí cần bookmark ngay lập tức!

7. Gỡ lỗi

Bước này thực sự cần được áp dụng trong suốt quá trình thực hiện. Gỡ lỗi toàn bộ sẽ giúp bạn phát hiện bất kỳ lỗi cú pháp hoặc lỗ hổng trong logic sớm hơn. Tận dụng lợi thế của môi trường phát triển tích hợp (Integrated Development Environment - IDE) và bộ gỡ lỗi. Khi gặp lỗi, tôi tra từng dòng code để xem có bất cứ điều gì không diễn ra như mong đợi. Dưới đây là một số kỹ thuật tôi sử dụng:

  • Kiểm tra bảng điều khiển để xem thông báo lỗi. Đôi khi, nó sẽ chỉ ra một số dòng khác. Điều này cho tôi ý tưởng sơ bộ về nơi bắt đầu – mặc dù lỗi đôi khi không nằm ở dòng này mà nằm ở dòng khác.
  • Ghi chú bên cạnh các khối hoặc các dòng code và output để nhanh chóng xem code có hoạt động như mong đợi hay không. Từ đó giúp dễ dàng sửa lại code khi cần thiết.
  • Sử dụng dữ liệu mẫu khác nếu có những tình huống mà tôi không nghĩ đến và xem liệu code có hoạt động đúng không.
  • Lưu thành các phiên bản khác nhau và thử từng cách tiếp cận riêng biệt, nếu bạn không muốn mất nhiều công sức mỗi khi phải quay lại kiểm tra code.

Debug

8. Viết những lời bình luận hữu ích

Bạn có thể không nhớ chức năng tuyệt vời của từng dòng code trong một tháng tới. Và người khác lại càng không biết. Đó là lý do tại sao việc viết nhận xét hữu ích rất quan trọng để tránh những vấn đề và tiết kiệm thời gian sau này nếu bạn cần quay lại làm.

Tránh xa những bình luận như sau:

// This is an array. Iterate through it.

(tạm dịch: // Đây là mảng nhá. Duyệt qua nó.)

// This is a variable

(tạm dịch: // Đây là biến)

Tôi cố gắng viết tóm tắt những bình luận để người đọc có thể hiểu điều gì đang xảy ra nếu nó không thực sự rõ ràng. Điều này đặc biệt hữu ích khi đang ở những đoạn code phức tạp. Nó giải thích rõ ràng từng hàm để làm gì và tại sao. Thông qua việc sử dụng các tên biến, tên chức năng và các nhận xét rõ ràng, bạn (và người khác) sẽ có thể hiểu được:

  • Code này để làm gì?
  • Code này đang làm gì?

Viết những lời bình luận hữu ích

Xem thêm: Hình thành cách tư duy như một lập trình viên

9. Nhận phản hồi thông qua các đánh giá code

Nhận phản hồi từ các đồng nghiệp, các chuyên gia hoặc các nhà phát triển khác. Kiểm tra lại trong Stack Overflow. Xem cách mà những người khác hỏi về vấn đề đó và học hỏi từ họ. Đôi khi, một vấn đề có nhiều cách tiếp cận. Tìm hiểu xem chúng là gì, bạn sẽ giỏi hơn và nhanh hơn trong việc tự tìm ra giải pháp.

10. Thực hành, thực hành, thực hành

Ngay cả các nhà phát triển giàu kinh nghiệm, họ vẫn luôn thực hành và học hỏi mỗi ngày. Nếu bạn nhận được phản hồi hữu ích, hãy tích hợp nó lại. Tái hiện lại vấn đề hoặc giải quyết những vấn đề tương tự, thúc đẩy bản thân tiến lên. Với mỗi vấn đề bạn giải quyết là một bước tiến xa hơn cho bạn trên con đường làm lập trình. Hãy ăn mừng mỗi thành công có được và nhớ rằng bạn đã tiến xa như thế nào. Hãy nhớ rằng lập trình, cũng giống bất cứ điều gì, đang ngày càng trở nên dễ dàng hơn và phát triển hơn.

Cảm ơn, tác giả Gavin Stark.

Tham khảo thêm một số bài viết:

Chúc các bạn vui vẻ!

Chủ Nhật, 20/05/2018 07:54
4,49 👨 4.599
0 Bình luận
Sắp xếp theo