10 bước giúp các developer newbies giải quyết bất kì vấn đề lập trình nào

Một số phản hồi tôi nghe từ các nhà phát triển mới vào nghề về vấn đề lập trình xoay quanh việc không biết bắt đầu từ đâu.

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

Ở đây, tôi sẽ trình bày quy trình của tôi để giải quyết một vấn đề mẫu. Hy vọng rằng, một số bạn sẽ thấy bài này hữu ích hỗ trợ hành trình lập trình của bạn.

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

Bạn không thể giải quyết vấn đề mà bạn không hiểu. Có một sự khác biệt giữa vấn đề và vấn đề 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 đầu tiên của một vấn đề và đặt giả thiết cho phần còn lại của nó bởi vì nó giống như một thứ bạn đã nhìn thấy trong quá khứ. Ngay cả khi bạn đang tạo ra một trò chơi phổ biến như Hangman, hãy chắc chắn đọc qua các quy tắc ngay cả khi bạn đã chơi nó trước đây. Tôi đã được hỏi một lần để làm một trò chơi như Hangman và chỉ nhận ra rằng đó là “Evil Hangman” sau khi tôi đọc qua các hướng dẫn (đó là một thủ thuật!).

Đôi khi, tôi thậm chí sẽ cố gắng giải thích vấn đề cho bạn bè và xem liệu họ có hiểu lời giải thích của tôi và đánh giá nó có phù hợp với vấn đề tôi được giao nhiệm vụ hay không. Bạn không muốn phát hiện ra rằng bạn hiểu sai vấn đề khi đã đi được nữa chặng đường. Dành thêm thời gian ở khoảng thời gian đầu là điều đáng làm. Bạn càng hiểu rõ vấn đề, bạn sẽ dễ dàng giải quyết được.

Hãy tưởng tượng chúng ta đang tạo ra một function đơ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.

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

  • Làm thế nào máy tính có thể cho biết một số chẵn? Chia số đó cho 2 và xem phần còn bằng không.
  • Tôi chuyển vào function như thế nào? Một mảng ( array ).
  • Mảng đó chứa gì? Một hoặc nhiều số.
  • Các kiểu dữ liệu của các phần tử trong mảng là gì? Số.
  • Mục tiêu của chức năng này là gì? Tôi sẽ trả lại gì khi kết thúc function này? Mục đích là để lấy tất cả các số chẵn và trả lại chúng trong một mảng. Nếu không có số chẵn, hàm sẽ trả về một mảng trống.

    3. Xử lý các vấn đề thủ công với ít nhất ba bộ dữ liệu mẫu

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

  • Trường hợp Corner: Một vấn đề hoặc tình huống xảy ra bên ngoài các thông số bình thường, đặc biệt khi nhiều biến môi trường hoặc các điều kiện xảy ra đồng thời ở mức 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ố cực trị (tối đa hoặc tối thiểu) hoạt động.

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

Khi bạn lần đầu tiên bắt đầu, nó rất dễ dàng để vượt qua các bước. Bởi vì não của bạn có thể đã quen với các con số, bạn chỉ có thể nhìn vào một tập hợp các dữ liệu mẫu và kéo ra các con số như 2, 4, 6 và nhiều hơn nữa trong mảng mà không nhận thức đầy đủ về từng bước và mỗi bước bộ não của bạn đang giải quyết nó. Nếu điều này khó khăn, hãy thử sử dụng các bộ dữ liệu lớn vì nó sẽ ghi đè lên khả năng giải quyết vấn đề tự nhiên của bộ não của bạn chỉ bằng cách nhìn vào nó. Điều đó giúp bạn làm việc thông qua thuật toán thực tế.

Chúng ta hãy đi qua mảng đầu tiên [1]

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

Chúng ta hãy đi qua mảng 1, 2]

  1. Nhìn vào phần tử đầu tiên trong mảng [1, 2]
  2. Đó là 1.
  3. Quyết đị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. Quyết định xem nó có phải evenNumbers hay không. Nó đúng là evenNumbers .
  7. Thực hiện một mảng evenNumbers và thêm 2 vào mảng này.
  8. Lưu ý rằng không có nhiều phần tử trong mảng này.
  9. Trả lại mảng evenNumbers với số 2.

Đi qua một vài lần nữa. Lưu ý cách mà tôi đã viết về [1] thay đổi một chút từ [1, 2] . Đó là lý do tại sao tôi cố gắng đi qua một vài bộ khác nhau. Tôi có một số bộ chỉ với một phần tử, một số có thả nổi thay vì số nguyên, một số có nhiều chữ số trong một phần tử, và một số âm để an toàn.

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

Tìm các mẫu và xem liệu có bất kỳ điều gì bạn có thể khái quát hay không. Xem bạn có thể giảm bất kỳ bước nào hoặc nếu bạn đang lặp lại điều gì.

  1. Tạo một function selectEvenNumbers .
  2. Tạo một mảng rỗng mới evenNumbers khi bạn có thể lưu trữ các số chẵn nếu có.
  3. Đi qua từng phần tử trong mảng y [1, 2] .
  4. Tìm phần tử đầu tiên.
  5. Quyết định xem nó có phải là số chẵn bằng cách xem nó có chia hết cho hai. 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ó thêm các phần tử trong mảng này.
  9. Trả lại array evenNumbers . bất kể nó có bất cứ điều gì trong nó.

Cách tiếp cận này có thể nhắc bạn về cảm ứng toán học bởi vì bạn:

  • Cho rằng nó đúng với n = 1 , n = 2 , ...
  • Giả sử nó đúng cho n = k
  • Chứng minh nó đúng với n = k + 1
  1. Viết pseudocode

Ngay cả sau khi bạn đã tạo ra các bước chung, viết pseudocode mà bạn có thể dịch thành code sẽ giúp xác định cấu trúc code của bạn và làm cho lập trình dễ dàng hơn nhiều. Viết dòng code giả lập theo dòng. Bạn có thể làm điều này trên giấy hoặc qua bình luận trong trình biên tập code của bạn. Nếu bạn mới bắt đầu và thấy các màn hình trống rùng rợn hoặc làm bạn bối rối, tôi khuyên bạn nên làm nó trên giấy.

Pseudocode thường không có các quy tắc cụ thể, đặc biệt là đôi khi tôi kết thúc bằng một số cú pháp từ một ngôn ngữ chỉ vì tôi đã quen với nó. Đừng theo đuổi cú pháp. Tập trung vào logic và các bước.

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

Dưới đây là ví dụ về giả mã có nhiều từ hơn:

Dưới đây là ví dụ của pseudocode có ít từ hơn:

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

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

  1. Dịch pseudocode thành code và debug

Khi bạn có sẵn pseudocode của bạn, dịch từng dòng thành mã thực bằng ngôn ngữ mà bạn đang làm việc. Chúng ta sẽ sử dụng Javascript cho ví dụ này.

Nếu bạn đã viết nó trên giấy, hãy viết như bình luận trong trình biên tập code của bạn. Sau đó, thay thế mỗi dòng trong pseudocode của bạn.

Sau đó tôi gọi function và cung cấp cho nó một số tập hợp dữ liệu mẫu mà chúng ta đã sử dụng trước đó. Tôi sử dụng chúng để xem nếu mã của tôi trả về kết quả tôi muốn hay không. Bạn cũng có thể viết bài kiểm tra để kiểm tra xem kết quả thực tế bằng với kết quả dự kiến hay không.

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 tôi tiếp tục. Bằng cách này, tôi phát hiện ra bất kỳ vấn đề nào trước khi tôi đi quá xa. 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 mã của tôi khi tôi gõ ra.

Sau khi làm việc thông qua mỗi dòng pseudocode của tôi, dưới đây là những gì chúng tôi kết thúc. / / là các dòng trong pseudocode và văn bản in đậm là mã thực tế trong Javascript.

Sau đó tôi thoát khỏi pseudocode để tránh nhầm lẫn.

Đôi khi, các nhà phát triển mới sẽ gặp khó khăn với cú pháp mà nó sẽ trở nên khó khăn để tiếp tục. Hãy nhớ rằng cú pháp sẽ tự nhiên hơn theo thời gian và không cần ngại trong việc tham khảo tài liệu sao cho các cú pháp chính xác sau này khi mã hóa.

  1. Đơn giản hóa và tối ưu hóa mã của bạn

Bây giờ bạn có thể nhận thấy rằng đơ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 chức năng đó là lọc các khoản mục khỏi 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 evenNumbers nữa bởi vì bộ lọc 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 bộ lọc. Điều này sẽ không thay đổi mảng gốc. Chúng tôi cũng không cần phải sử dụng một vòng lặp với cách tiếp cận này. Bộ lọc sẽ đi qua từng khoản 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 hóa và tối ưu hoá code của bạn có thể yêu cầu bạn phải lặp lại một vài lần, xác định các cách để đơn giản hóa và tối ưu hóa code.

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

  • Mục tiêu của bạn để đơn giản hóa và tối ưu hóa 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 làm gọn code càng nhiều càng tốt? Là mục tiêu để làm cho code dễ đọc hơn? Nếu đó là trường hợp, bạn có thể thích dùng thêm dòng để xác định biến hoặc tính toán một cái gì đó hơn là cố gắng xác định và tính toán tất cả trong một dòng.
  • Làm thế nào khác bạn có thể làm cho code dễ đọc hơn?
  • Có thêm bất kỳ bước nào bạn có thể thực hiện được không?
  • Có bất kỳ biến hoặc function 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 rất nhiều? Xem nếu bạn có thể xác định trong một function khác.
  • Có những cách tốt hơn để xử lý các trường hợp edge?
  1. Debug

Bước này thực sự cần được áp dụng trong suốt quá trình. Debug toàn bộ sẽ giúp bạn phát hiện bất kỳ cú pháp lỗi hoặc khoảng trống trong logic sớm hơn hơn là sau này. Tận dụng lợi thế của môi trường phát triển tích hợp (IDE) và trình debug. Khi tôi gặp lỗi, tôi theo dõi các dòng mã theo dòng để xem nếu có bất cứ điều gì mà không đi 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 những gì thông báo lỗi nói. Đôi khi, nó sẽ chỉ ra một số dòng. Điều này cho tôi ý tưởng sơ bộ về nơi để bắt đầu – mặc dù vấn đề đôi khi không thể ở trong dòng này.
  • Nhận xét các khối hoặc các dòng mã và đầu ra mà tôi có cho đến nay để nhanh chóng xem code có hoạt động như tôi mong đợi hay không. Tôi luôn luôn có thể 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 vẫn hoạt động hay không.
  • Lưu các phiên bản khác nhau của tệp nếu tôi đang thử một cách tiếp cận hoàn toàn khác. Tôi không muốn mất bất kỳ công việc của tôi nếu tôi chưa muốn kết thúc nó!
  1. Viết những lời bình luận hữu ích

Bạn có thể không nhớ mỗi dòng có ý nghĩa là gì một tháng sau đó. Và một người khác làm trên dòng code của bạn cũng không biết. Đó là lý do tại sao việc viết những 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ư:

// This is an array. Iterate through it.

// This is a variable

Tôi cố gắng viết những bình luận ngắn giúp tôi hiểu điều gì đang xảy ra nếu nó không hiển nhiên. Điều này có ích khi tôi đang làm việc với các vấn đề phức tạp hơn. Nó giúp tôi hiểu những gì một chức năng cụ thể đang làm 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à nhận xét rõ ràng, bạn (và những người khác) sẽ có thể hiểu được:

  • Code này dành cho cái gì
  • Nó đang làm gì
  1. Nhận phản hồi thông qua đánh giá code

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

  1. 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 tập. Nếu bạn nhận được phản hồi hữu ích, hãy thực hiện nó. Làm lại vấn đề hoặc làm những vấn đề tương tự. Tiếp tục thúc đẩy bản thân. Với mỗi vấn đề bạn giải quyết, bạn sẽ trở nên giỏi hơn. Đánh dấu mỗi thành công và nhớ kĩ bạn đã đi bao xa. Hãy nhớ rằng lập trình, giống bất cứ điều gì, đang ngày càng trở nên dễ dàng hơn và tự nhiên hơn.

Cảm ơn, Gavin Stark.

Techtalk Via Techinasia

SHARE

Milan Tomic

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

0 nhận xét:

Đăng nhận xét