Đôi khi một lập trình viên không có sự rõ ràng 100% so với mã của họ? [đóng cửa]


19

Tôi không phải là một lập trình viên chuyên gia nên đây có thể là lý do, nhưng tôi nhận thấy rằng bất cứ khi nào tôi tạo mã phức tạp (như trò chơi Cờ vua tôi mới thực hiện), tôi có thể viết mã chính xác để chương trình hoạt động, mặc dù tôi thấy rằng sau này - hoặc thậm chí vài giây sau! - Tôi thường phải tạm dừng và nghĩ, làm thế nào để nó hoạt động?

Không chỉ vậy, nhưng tôi cũng có xu hướng không nghĩ về mã, và thay vào đó tôi chỉ gõ đi. Ví dụ, trong trò chơi Cờ vua của tôi, tôi đã quyết định sử dụng một mảng năm chiều để xử lý các động tác và tôi thấy tôi có thể làm điều này mà không cần suy nghĩ quá nhiều. Tuy nhiên, khi tôi dừng lại và đọc nó, tôi thấy thật khó khăn khi phải xoay quanh toàn bộ khái niệm năm chiều, và tôi phải mất vài phút để hiểu đầy đủ những gì tôi đã làm và cách thức hoạt động của mã.

Có phải bình thường cho các lập trình viên khi viết mã phức tạp để không hiểu những gì họ đang làm một nửa thời gian?


13
Đó là một dấu hiệu cho thấy bạn đang cố gắng quá mức để trở nên thông minh. Bạn cần viết mã đơn giản hơn, mô-đun nhiều hơn nếu bạn gặp khó khăn khi tự đọc nó.
SHODAN

3
Để thêm vào các câu trả lời (sâu sắc) khác theo nghĩa là nó có mùi của mã được thiết kế quá phức tạp hoặc kém (đừng lo lắng, hầu hết chúng ta phải vượt qua giai đoạn đó): Tài liệu . Cả hai bằng cách đặt tên thích hợp cho các biến / phương thức / lớp / mô-đun, bằng cách thêm một mô tả thích hợp cho từng chức năng và bằng cách (khi bạn không còn cách nào khác) viết một nhận xét nội tuyến đơn giản giải thích lý do và cách bạn sử dụng một số đoạn phức tạp của mã.
SJuan76

4
Tôi không bao giờ có sự rõ ràng 100% về mã của riêng tôi.
CodeInChaos

2
Mảng 5D đó thực sự nghe có vẻ như có thể sử dụng một số trừu tượng.

3
Có nhà phát triển nào có sự rõ ràng 100% về mã của mình mọi lúc không?
Johan

Câu trả lời:


30

Không, nó không bình thường 1 . Ít nhất, nó không bình thường đối với các lập trình viên giỏi. Nó có lẽ bình thường đối với một người học lập trình.

Viết phần mềm không chỉ là vỗ các dòng mã với nhau cho đến khi nó hoạt động. Bạn cần có ý thức làm việc để làm cho mã dễ hiểu. Một lập trình viên mà tôi rất tôn trọng đã từng nói với tôi "mã được đọc nhiều lần hơn so với nó được viết" . Trong khi điều đó là hoàn toàn rõ ràng, đó là một thực tế mà tôi đã không nhận thức được cho đến khi anh ấy nói với tôi. Phần lớn mã của bạn chỉ được viết một lần, có thể viết lại một hoặc hai lần nữa, nhưng cuối cùng bạn sẽ đọc mã thường xuyên trong suốt vòng đời của phần mềm.

Nếu bạn đang tìm mã khó hiểu vài phút sau khi viết mã, đó là tín hiệu cho thấy mã của bạn quá phức tạp. Dừng thêm mã, và tìm ra một cách tốt hơn. Ví dụ, một mảng năm chiều gần như không bao giờ là một ý tưởng tốt. Ngay cả những lập trình viên thực sự thông minh thực sự cũng khó hiểu được cấu trúc dữ liệu phức tạp như vậy.

Chính lập trình viên đã nói với tôi về khả năng đọc mã cũng nói "hãy cho tôi xem cấu trúc dữ liệu của bạn và tôi có thể cho bạn biết mã của bạn hoạt động như thế nào" . Có nghĩa là, mã tốt bắt đầu với các cấu trúc dữ liệu sạch, dễ hiểu. Nếu bạn thiết kế dữ liệu của mình đúng, mã gần như là mối quan tâm thứ yếu. Phải thừa nhận rằng, tuyên bố này là một chút cường điệu vì phần mềm rõ ràng không chỉ là dữ liệu, mà nó bắt đầu bằng dữ liệu. Vì vậy, làm việc về việc tạo các cấu trúc dữ liệu sạch, dễ nắm bắt và mã sẽ dễ hiểu hơn đáng kể.


1 Chắc chắn có mã ngoài đó rất phức tạp và khó hiểu ngay cả bởi những lập trình viên thông minh nhất. Một số vấn đề vốn đã phức tạp. Tuy nhiên, tôi sẽ mạo hiểm nói rằng phần lớn mã được viết bởi đại đa số các lập trình viên không phải là loại mã đó.


8
[1] Từ quan điểm bi quan hơn, điều đó là bình thường nhưng nó không tốt.
Dan

1
Nếu "mảng năm chiều" chỉ là một bản đồ từ 4 tuple hoặc 5 tuple cho một chiến lược, thì tác giả có thể đã sử dụng bảng băm hoặc chức năng tra cứu trợ giúp. Tuy nhiên, nếu tác giả dành phần lớn thời gian để mã hóa các cơ chế khởi tạo mảng (các vòng lặp lồng nhau), thì "cái nhìn sâu sắc thuật toán" thực sự sẽ bị nhấn chìm trong đống "mã cơ học". Các lập trình viên tìm cách giữ cho loại tiếng ồn sau tách biệt. Vì vậy, các lập trình viên giỏi phải biết cách viết thư viện chủ yếu để chứa các mã cơ học đó.
rwong

Mảng 1-D là một dòng, 2-d là một lưới, 3-d là một khối lập phương, 4-d là một dòng các hình khối, 5-d là một lưới các hình khối, vv nhưng tôi không thấy sử dụng cho một cấu trúc dữ liệu phức tạp như vậy khi nói đến cờ vua.
dùng2785724

15

Có hai loại này: 1.) nhầm lẫn 2.) vô minh phúc lạc

Cái đầu tiên là xấu và có thể biến mất theo thời gian và kinh nghiệm.

Thứ hai là một điều tốt nếu các dự án trở nên lớn hơn: Nếu bạn phải nhớ mọi chi tiết triển khai chỉ để có thể làm việc với mã của mình, có điều gì đó không ổn với nó (xem "ẩn thông tin").

Mọi nhà phát triển sẽ quên cách mã hoạt động, vì vậy anh ta viết nó theo cách mà một nhà phát triển mới khác sẽ hiểu và có thể duy trì nó mà không phá vỡ các phần khác của chương trình mà anh ta không biết.

Vì vậy, "không biết" thực sự là một hằng số trong phát triển phần mềm - đó là cách bạn quản lý nó.


1
Bạn đang chạm vào một cái gì đó quan trọng ở đây, đó là tầm quan trọng của việc lập trình bằng cách sử dụng các mẫu và quy ước thông thường, bởi vì các chi tiết thực hiện thực sự bị lãng quên. Nhưng nếu các mẫu và quy ước trong mã là hợp lý, thì có thể dễ dàng chọn các chi tiết sao lưu từ ngữ cảnh khi cần thiết. Mặt khác, nếu mã hoàn toàn nguyên khối, khó hiểu và quá thông minh, cuối cùng bạn sẽ không chỉ quên các chi tiết, mà các lập trình viên khác cố gắng duy trì mã sẽ có thời gian khó khăn hơn nhiều.
Craig

12

Tôi muốn nói rằng nó phổ biến hơn mọi người quan tâm thừa nhận. Ngay cả Brian Kernighan cũng ám chỉ:

Gỡ lỗi khó gấp đôi so với viết mã ở vị trí đầu tiên. Do đó, nếu bạn viết mã càng khéo léo càng tốt, theo định nghĩa, bạn không đủ thông minh để gỡ lỗi.

Khi chúng tôi lái xe đến cửa hàng, chúng tôi thực hiện một chuỗi các điều chỉnh chi tiết cho các vị trí của bàn đạp và tay lái. Điều này là rất dễ dàng trong thời điểm này. Bây giờ, hãy tưởng tượng nếu bạn ghi lại những điều chỉnh đó vào giấy và đưa chúng cho một người bạn cần chỉ đường đến cửa hàng.

Tương tự, chúng tôi muốn viết mã ở một mức độ trừu tượng, nhưng chúng tôi thích đọc nó ở nhiều lớp trừu tượng cao hơn. Do đó, cách viết và đọc mã ưa thích của chúng tôi là xung đột. Điều đó có nghĩa là làm cho mã dễ đọc thường là một bước riêng biệt, có ý thức, với một bộ kỹ năng khác nhau.

Điều làm cho một lập trình viên giỏi là khi họ gặp khó khăn khi đọc những gì họ vừa viết, họ tạo ra một sự trừu tượng tại thời điểm đó. Một lập trình viên tốt hơn làm điều đó nhiều lần, mỗi lần trở nên kén chọn hơn. Cuối cùng, các lập trình viên có kinh nghiệm bắt đầu tiến xa hơn trong quá trình, nhưng họ thường vẫn có thể thấy chỗ để cải thiện sau khi đọc những gì họ vừa viết.


Tôi phải không đồng ý với Brian về điều đó, tôi thích gỡ lỗi, tôi là một trong số ít những người tôi biết trong ngành làm nhưng tôi không đánh giá mã mà tôi viết rất cao.
James Snell

@JamesSnell Anh ấy đã không nói rằng việc gỡ lỗi là xấu hay khó chịu, chỉ đơn giản là nó khó và việc gỡ lỗi mã phức tạp thậm chí còn khó hơn.
cbojar

5

Tôi nghĩ rằng đây là một cái gì đó sẽ biến mất với kinh nghiệm.

Nếu bạn đang viết các hệ thống phức tạp, bạn cần có khả năng viết mã sạch, có thể duy trì mà cả bạn trong tương lai và người khác trong tương lai đều có thể hiểu được. Vì vậy, về bản chất, việc bạn đang làm bây giờ không thể mở rộng được.

Bạn sẽ có nhiều khoảnh khắc khi bạn nhìn vào một số mã bạn đã viết 6 tháng trước và nghĩ rằng "cái quái gì đang diễn ra ở đây?", Nhưng nếu nó xảy ra một ngày sau khi bạn viết mã, bạn phải nghĩ 'sạch mã 'hơn.

Nguồn: không bao giờ sử dụng mảng 5 chiều :)


3
@ 83457 - vì mảng 5d là mô hình kém của vấn đề 2d. Nếu bạn thực sự nghĩ rằng đó là mã tốt thì hãy gửi nó đến codereview.stackexchange.com và xem câu trả lời bạn nhận được.
James Snell

2
@ 83457 - Nếu nó "khó hiểu như địa ngục", bạn đã tự trả lời. Có thể một mảng 5 chiều không gây nhầm lẫn nhưng có lẽ không dành cho hầu hết chúng ta, bất kể trình độ kỹ năng của chúng ta.
dbasnett

2
@ 83456 bị nhầm lẫn như địa ngục nên đã là một động lực rất tốt để không sử dụng điều đó.
Fabio Marcolini

3
Miễn là bạn có lý do chính đáng cho từng kích thước, tôi không thấy lý do để tránh mảng 5D. Có lẽ có một giải pháp tốt hơn, chẳng hạn như một từ điển với một khóa phức tạp hoặc một vài mảng chiều thấp hơn, nhưng tôi có thể hình dung rất rõ một mảng 5D phù hợp cho một vấn đề khó khăn như AI cờ vua.
CodeInChaos

2
@CodesInChaos Ngoại trừ những thứ đó không chỉ là mảng, chúng đại diện cho các chuỗi có ý nghĩa (ví dụ: cây decison lồng nhau). Bằng cách đặt tên cho chúng một cách thích hợp và cung cấp cho chúng các loại để chúng không bị lạm dụng (ngay cả khi các loại đó là các hàm bao trên các mảng), bạn làm cho mã rõ ràng hơn và ít có khả năng chứa lỗi hơn, với chi phí thấp.
deworde

5

"Bình thường" là rất chủ quan, vì vậy tôi nói: nó rất phổ biến, nhưng nên tránh.

Một trong những tính năng của "mã tốt" (tôi nghe thấy điều đó tồn tại) là sự rõ ràng: nó phải rõ ràng như các vấn đề tiềm ẩn cho phép nó xảy ra. Nếu vấn đề phức tạp, mã cũng sẽ phức tạp, nhưng đó là sự phức tạp vốn có , trái ngược với sự phức tạp ngẫu nhiên (lần đầu tiên tôi nghe về sự khác biệt này trong bài nói chuyện của Rich Hickey ) được giới thiệu bởi hoặc không sử dụng đúng công cụ, mô hình, kỹ thuật và thực hành.

Có những trường hợp khi sự thiếu rõ ràng có thể chấp nhận được ngay cả khi vấn đề không quá phức tạp, ví dụ nếu bạn viết một trang web quảng cáo mà bạn biết sẽ tồn tại chừng nào chiến dịch tiếp thị diễn ra. Đó là một mã vứt đi không thể duy trì được. Đối với các trường hợp khác (và hầu hết), không thể chấp nhận được, vì việc duy trì mã như vậy sẽ tốn rất nhiều chi phí. Tuy nhiên, nó là phổ biến.

Liên quan:

  • Khi Hiểu nghĩa là Viết lại - bài viết về vấn đề hiểu mã.
  • ML hiệu quả - một cuộc nói chuyện dài, giữa ML / OCaml, cách viết mã cho "người đọc" (tức là người duy trì): "Người đọc ủng hộ nhà văn hơn." Tôi khuyên bạn nên xem rằng bất kể bạn sử dụng ngôn ngữ nào.

2

Tôi không nghĩ đó là bình thường, nhưng đối với các chương trình rất phức tạp, như chương trình cờ vua mà bạn đề cập, tôi nghĩ chắc chắn là có thể.

Nhiều năm trước, khi tôi vừa mới ra trường (vì vậy tôi vẫn còn khá thiếu kinh nghiệm khi viết các chương trình lớn), tôi đã viết trình biên dịch thực sự đầu tiên của mình. Việc phân tích cú pháp rất đơn giản, nhưng sau đó tôi cần nhắm mục tiêu nó cho bốn bộ hướng dẫn vi xử lý khác nhau. Tôi dự định viết trình biên dịch bằng ngôn ngữ riêng của mình, vì vậy trước tiên tôi chỉ sử dụng các tính năng của ngôn ngữ mà tôi thực sự cần, đã viết trình tạo mã đầu tiên bằng ngôn ngữ hợp ngữ và kiểm tra rằng nó đã tạo mã chính xác cho tập hợp con của ngôn ngữ. Sau đó tôi đã có thể sử dụng trình biên dịch để tự biên dịch, và thêm các tính năng còn lại và cũng sử dụng chúng trong trình biên dịch

Sau đó tôi đã viết các trình tạo mã phụ trợ cho mỗi bộ vi xử lý và kiểm tra rằng tất cả chúng đều tạo mã chính xác, nhưng trong khi chính xác thì nó không tối ưu lắm. Vì vậy, sau đó tôi đã tiến hành viết trình tối ưu hóa cho mỗi trình tạo mã.

Khi tôi đang kiểm tra đầu ra của các trình tạo mã sau khi thêm tất cả tối ưu hóa, tôi thường ngạc nhiên về mã mà trình biên dịch tạo ra. Nó thường không phải là cách tôi sẽ viết mã bằng tay, nhưng nó chính xác và khá súc tích.

Khi tôi không rõ ràng về cách mà trình tạo mã tạo ra một số mã mà nó đã làm, tôi đã cố gắng làm theo logic bằng tay nhưng có những lúc tôi đã từ bỏ. Nếu tôi đã thêm rất nhiều đầu ra theo dõi, tôi sẽ có thể theo dõi nó, nhưng tôi không bận tâm vì mã được tạo là thỏa đáng và tôi cần phải tiếp tục với các dự án khác.


Dường như với tôi bạn có một nền giáo dục cực kỳ tốt với nền tảng vững chắc, và bạn đã tiếp thu kiến ​​thức ở mức rất cao. Tôi đoán điều này là hơi hiếm trong số các lập trình viên điển hình. Hầu hết các lập trình viên điển hình (bao gồm cả tôi) phải đấu tranh để theo kịp kiến ​​thức cần thiết cho nhiệm vụ ngày nay, bởi vì công nghệ thay đổi quá nhanh.
rwong

@rwong Cảm ơn bạn. Hầu hết đó là kinh nghiệm - Tôi đã viết chương trình trong 46 năm và không có ý định bỏ việc sớm.
tcrosley

2

Có rất nhiều câu trả lời đàng hoàng ở đây.

Tôi có một vài mất về điều này.

Một là nếu bạn không hiểu tại sao mã của bạn có vẻ hoạt động, thì a) nó có thể không (có lẽ nó chỉ có vẻ như nó hoạt động) và b) bạn không hiểu rõ về miền vấn đề khi bạn bắt đầu mã hóa hoặc không chia miền vấn đề thành các đơn vị nhỏ hơn, đơn giản hóa trước khi bạn bắt đầu.

Điều khác của tôi về điều này là chìa khóa thực sự là sử dụng các mẫu và quy ước thông thường trong mã của bạn. Đó là một chủ đề lớn hơn nhiều so với một bài viết nhỏ có thể giải quyết. Nhưng hãy tìm những tài liệu hay về chủ đề này, bao gồm một số standbys cũ như các cuốn sách "Code Complete" và "Writing Solid Code".

Chi tiết thực hiện thay đổi. Hằng số thực duy nhất là mục tiêu chức năng của mã. Nếu bạn từng viết nhiều hơn một chức năng, bạn sẽ quên chi tiết triển khai chi tiết, cụ thể theo thời gian. Nhưng bạn chắc chắn nên hiểu làm thế nào các mảnh hoạt động khi bạn xây dựng chúng, và bạn sẽ có thể vẽ một sơ đồ của tổng thể và hiểu làm thế nào các mảnh làm việc với nhau.

Nếu bạn sử dụng các mẫu và tuân theo các quy ước thông thường, sẽ dễ dàng hơn nhiều để chọn các chi tiết triển khai cụ thể sao lưu khi bạn nhìn lại mã. Hoặc khi ai đó chưa bao giờ nhìn thấy mã trước khi nhìn vào nó lần đầu tiên. Ngoài ra, tuân theo các quy ước và các mẫu đó theo thời gian sẽ có nghĩa là các chi tiết triển khai sẽ nổi bật so với các quy ước và các mẫu, đó là một yếu tố khác giúp mã dễ hiểu hơn.

Hầu hết các vấn đề mà chúng tôi giải quyết với phần mềm rất phức tạp. Thiết kế phần mềm là một bài tập trong việc quản lý sự phức tạp.


1

Tôi sẽ không gọi nó là bình thường , nhưng nó chắc chắn có thể xảy ra. Nếu điều đó xảy ra với bạn ngay sau khi bạn viết đoạn mã được đề cập, tôi đoán rằng mã của bạn rất phức tạp và cần được đơn giản hóa, hoặc bạn chỉ dễ bị phân tâm. :)

Nhưng nếu bạn đặt mã của mình đi, tập trung vào các dự án khác và quay lại mã đó sau nhiều tuần, vài tháng hoặc thậm chí nhiều năm, sẽ không có gì đáng ngạc nhiên khi bạn sẽ phải tìm lại tất cả.

Nhưng có điều gì đó bạn có thể làm về điều này. Từ những gì bạn nói, có vẻ như bạn không nghĩ đủ về mã của mình khi bạn đang viết nó, và do đó bạn đang gây khó khăn cho bản thân trong tương lai để hiểu những gì đang diễn ra. Sử dụng kiến ​​thức đó để lợi thế của bạn: Đây là động lực tốt nhất để sản xuất mã có cấu trúc tốt, tài liệu tốt, dễ hiểu. Bạn biết từ trải nghiệm đầu tiên những gì xảy ra khi bạn không quan tâm đến chất lượng mã của mình. Biết rằng sẽ làm cho bạn một lập trình viên tốt hơn trong thời gian dài. Khi bạn hợp tác trong các dự án phần mềm, đồng nghiệp của bạn sẽ cảm ơn bạn vì đã tạo ra mã dễ hiểu. Và tỷ lệ lỗi của mã của bạn cũng sẽ được cải thiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.