Là mã khoa học một lĩnh vực đủ khác nhau để bỏ qua các tiêu chuẩn mã hóa phổ biến?


21

Gần đây tôi đã cố gắng để suy nghĩ về thực tế sau đây.

Một mặt, có một loạt các hướng dẫn và tiêu chuẩn mã hóa cho những gì được coi là "lành mạnh", "sạch sẽ", "được viết tốt" và v.v. Xem "Mã sạch" dường như cũng được thảo luận rộng rãi ở đây. Quy tắc ví dụ: 7 phương thức dài dòng và 1 hoặc 2 cấp độ thụt. Mã không tuân theo bằng cách nào đó được dự kiến ​​sẽ chết vì khả năng bảo trì kém.

Mặt khác, tôi có thể làm việc với OpenCV, OpenCascade, VTK, v.v. Đó là mã khoa học. Họ có 2 phương thức dài (bản thân tôi), OpenCascade có một phương thức hoặc một lớp được chia thành 10 tệp (không có trò đùa ở đây), đôi khi VTK cũng là một mớ hỗn độn. Tuy nhiên, các dự án thịnh vượng, được duy trì và sử dụng rộng rãi!

Bắt ở đâu? Chúng ta có được phép viết mã khoa học, nặng về toán học theo cách nó chỉ hoạt động và chúng ta có thể duy trì nó không? Là một bộ tiêu chuẩn riêng cho các dự án như vậy, nếu có?

Có thể là một câu hỏi ngây thơ, nhưng tôi dường như là một khoảng trống lập trình đang cố gắng xây dựng một bộ quy tắc làm thế nào và không làm gì, đó là cách tôi được dạy để làm việc ở trường trung học. Kể từ khi tôi tốt nghiệp, tôi hầu như không có sự hỗ trợ hướng dẫn nào với những việc tôi phải làm, chủ yếu là lập trình - không ai bận tâm để dạy điều đó.


25
Không, không phải vậy, nhưng hầu hết các nhà khoa học không được đào tạo kỹ thuật để biết rõ hơn.
Gort Robot

4
Trong bất kỳ dự án nào đã được thực hiện trong một thời gian, bạn sẽ tìm thấy một tấn mã được viết kém nhưng dường như nó hoạt động đủ tốt để không ai bận tâm quay lại và dọn sạch nó. Đôi khi, đó là vì các tiêu chuẩn và mô hình phát triển theo thời gian, đôi khi đó là do các tiêu chuẩn không được thi hành thống nhất, đôi khi đó là vì việc thêm chức năng mới thú vị hơn là quay lại và cấu trúc lại một đoạn mã hoạt động nhưng kém tài liệu.
Hang động Justin

2
@JustinCaveL Hoặc: "Nếu nó không bị hỏng, đừng sửa nó." Đặc biệt áp dụng cho mã chỉ viết . Xem thêm plaza.ufl.edu/johnaris/PDFs/Pro HiệuSolveFlowChart.pdf
Robert Harvey

Bạn chắc chắn sẽ tìm thấy câu hỏi trước đó của tôi có liên quan: lập trình
viên.stackexchange.com/q/266388/620

8
Đối với người trả lời đồng nghiệp: Câu hỏi này đề cập đến cơ sở mã của các thư viện nguồn mở cho các nhiệm vụ chuyên sâu tính toán trong một hoặc nhiều lĩnh vực khoa học . Câu hỏi này không phải là về mã vứt đi. Vui lòng tạm dừng một lát để đảm bảo bạn nắm được mọi khía cạnh được tô sáng trước khi viết câu trả lời. Cảm ơn.
rwong 17/03/2016

Câu trả lời:


28

Là mã khoa học một lĩnh vực đủ khác nhau để bỏ qua các tiêu chuẩn mã hóa phổ biến?

Không, không phải vậy.

Mã nghiên cứu thường bị "vứt bỏ" và được viết bởi những người không phải là nhà phát triển theo nền tảng, tuy nhiên thông tin học thuật của họ rất mạnh. Một số mã nghiên cứu tôi đã viết sẽ khiến tôi khóc . Nhưng nó đã làm việc!

Một điều cần xem xét là người gác cổng cho các dự án thúc đẩy những gì được bao gồm. Nếu một dự án lớn bắt đầu như một dự án mã học thuật / nghiên cứu, kết thúc hoạt động và bây giờ là một mớ hỗn độn, ai đó phải chủ động để cấu trúc lại nó.

Phải mất rất nhiều công việc để cấu trúc lại mã hiện tại mà không gây ra vấn đề. Đặc biệt là nếu nó ở tất cả các tên miền cụ thể hoặc không có bài kiểm tra. Bạn sẽ thấy OpenCV có một hướng dẫn phong cách rất toàn diện, ngay cả khi không hoàn hảo. Áp dụng hồi tố này cho tất cả các mã hiện có? Đó là .. không dành cho người yếu tim.

Điều này thậm chí còn khó khăn hơn nếu tất cả các mã đó hoạt động. Bởi vì nó không bị hỏng. Tại sao phải sửa nó?

Tuy nhiên, các dự án thịnh vượng, được duy trì và sử dụng rộng rãi!

Đây là câu trả lời, theo một nghĩa nào đó. Mã làm việc vẫn hữu ích và vì vậy nó có nhiều khả năng được duy trì.

Nó có thể là một mớ hỗn độn, đặc biệt là ban đầu. Một số trong những dự án này có thể bắt đầu như một dự án 1 lần mà "không cần phải sử dụng lại bao giờ và có thể bị vứt bỏ."

Cũng xem xét rằng nếu bạn đang thực hiện một thuật toán phức tạp, có thể có ý nghĩa hơn khi có các phương thức lớn hơn bởi vì bạn (và những người khác quen thuộc với khía cạnh khoa học) về mặt khái niệm có thể hiểu thuật toán tốt hơn. Công việc luận án của tôi liên quan đến tối ưu hóa. Có logic thuật toán chính là một phương thức dễ hiểu hơn đáng kể so với việc cố gắng tách nó ra. Nó chắc chắn đã vi phạm quy tắc "7 dòng trên mỗi phương thức" nhưng điều đó cũng có nghĩa là một nhà nghiên cứu khác có thể xem mã của tôi và hiểu nhanh hơn các sửa đổi của tôi đối với thuật toán.

Nếu việc triển khai này được trừu tượng hóa và được thiết kế tốt, tính minh bạch này sẽ bị mất đối với những người không lập trình .

Đối với người trả lời đồng nghiệp: Câu hỏi này đề cập đến cơ sở mã của các thư viện nguồn mở cho các nhiệm vụ chuyên sâu tính toán trong một hoặc nhiều lĩnh vực khoa học. Câu hỏi này không phải là về mã vứt đi. Vui lòng tạm dừng một lát để đảm bảo bạn nắm được mọi khía cạnh được tô sáng trước khi viết câu trả lời.

Tôi nghĩ mọi người thường có ý tưởng rằng tất cả các dự án nguồn mở đều bắt đầu, "hey tôi có một ý tưởng tuyệt vời cho một thư viện sẽ cực kỳ phổ biến và được sử dụng bởi hàng ngàn / triệu người khác" và sau đó mọi dự án đều xảy ra như thế.

Thực tế là nhiều dự án được bắt đầu và chết. Một tỷ lệ rất nhỏ các dự án "làm cho nó" đạt đến mức OpenCV hoặc VTK, v.v.

OpenCV bắt đầu như một dự án nghiên cứu từ Intel. Wikipedia mô tả nó là một phần của "một loạt các dự án." Bản phát hành không beta đầu tiên của nó là năm 2006, hoặc bảy năm sau khi nó được bắt đầu. Tôi nghi ngờ rằng mục tiêu ban đầu là các phiên bản beta có ý nghĩa, không phải là mã hoàn hảo.

Ngoài ra, "quyền sở hữu" của OpenCV đã thay đổi đáng kể. Điều này làm cho các tiêu chuẩn thay đổi, trừ khi tất cả các bên có trách nhiệm áp dụng các tiêu chuẩn chính xác giống nhau và giữ chúng trong suốt thời gian của dự án.

Tôi cũng nên chỉ ra rằng OpenCV đã xuất hiện trong vài năm trước khi Tuyên ngôn Agile rằng Clean Code lấy cảm hứng từ được xuất bản (và VTK gần 10). VTK đã được bắt đầu 17 năm trước khi xuất bản Mã sạch (OpenCV là "chỉ" 9 năm trước).


2
Tôi đã sử dụng OpenCV trở lại vào năm 2004 và điều đó thật tồi tệ. Willow Garage ( chủ sở hữu mới ) đã tạo ra một công việc tuyệt vời bằng cách chuyển đổi hầu hết mọi thứ thành C ++. Trên thực tế, đây là một trong số ít các thư viện khoa học bao gồm mã tốt.
nimcap

15

Các nhà khoa học không phải là nhà phát triển. Công việc của họ không phải là viết mã mỗi se. Công việc của họ là giải quyết vấn đề và lập trình chỉ là một trong những công cụ họ có thể sử dụng.

Hầu hết các mã doanh nghiệp được viết bởi bởi vì họ sẽ tự gọi mình là các nhà phát triển chuyên nghiệp là một mớ hỗn độn. Hầu hết các mã này không sử dụng các mẫu thiết kế hoặc sử dụng sai chúng. Hầu hết các ý kiến ​​là ứng cử viên cho TheD DailyWTF . Vì vậy, trong ngành công nghiệp của chúng ta, chúng ta thấy những kết quả như vậy từ những người có công việc viết mã, bạn mong đợi điều gì từ những người không có công việc viết chương trình?

Tất cả các thực hành mà một nhà phát triển chuyên nghiệp thực tế học được trong sự nghiệp của cô có lợi cho một nhà khoa học? Chắc chắn rồi. Liệu mỗi nhà khoa học có thể dành 5 đến 10 năm để phát triển phần mềm học tập của mình? Chắc là không. Do đó, chất lượng mã là như nó là.

Một yếu tố khác là văn hóa. Nếu các cặp của bạn không viết mã sạch, tại sao bạn lại như vậy? Vì không ai quan tâm, bạn không thực sự có xu hướng nỗ lực thêm.

Cuối cùng, hầu hết các mã khoa học có tuổi thọ tương đối ngắn. Bạn viết mã cho một nghiên cứu cụ thể và khi nghiên cứu được thực hiện, bạn không sử dụng lại mã. Khi bạn có thói quen này, thật khó để tạo ra sự khác biệt giữa các thư viện có thể sử dụng lại, chẳng hạn như những thư viện bạn trích dẫn và mã vứt đi.


"Công việc của họ không phải là viết mã mỗi lần. Công việc của họ là giải quyết vấn đề" - lưu ý rằng về mặt kỹ thuật, công việc của nhà phát triển cũng không phải là viết mã. Công việc của anh ấy / cô ấy, giống như nhà khoa học, là giải quyết vấn đề. Tôi đang loại trừ các nhà máy phần mềm và khỉ mã được trả tiền để giữ ấm cho ghế, nhưng theo định nghĩa, họ cũng không quan tâm nhiều đến mã sạch, vì vậy họ không liên quan đến câu hỏi này :)
Andres F.

8

Bỏ qua? Không. Xem xét lại và điều chỉnh? Chắc chắn rồi. Rất nhiều mã khoa học là toán học chuyên sâu và hiệu suất quan trọng. Những thứ như chi phí chung của các lệnh gọi thực sự có thể trở thành một vấn đề, do đó bạn có thể kết thúc với các cấu trúc lồng nhau sâu hơn sau đó bạn thấy trong một ứng dụng thương mại điển hình. Điều đó không có nghĩa là bạn nên lao đầu vào hàng ngàn tối ưu hóa vi mô. Bạn vẫn nên tập trung vào việc chọn đúng thuật toán và chỉ thực hiện tối ưu hóa mà hiệu quả của bạn có thể đo lường được.

Một số khác biệt là rõ ràng và tầm thường. Hướng dẫn mã hóa thường sẽ gọi để chọn tên biến có ý nghĩa và tên chữ cái đơn sẽ bị nghi ngờ ngay lập tức. Một ứng dụng khoa học sẽ vẫn muốn các tên biến có ý nghĩa, nhưng đôi khi tên có ý nghĩa nhất sẽ là một chữ cái duy nhất, đề cập đến một biến trong một phương trình nổi tiếng.


4
+1 cho nhận xét đặt tên biến. Khi còn đi học, tôi đã làm một số mã hóa tự do cho các bộ phận khác nhau, và trong các bộ phận thống kê và toán học, tôi được "khuyến khích" sử dụng các tên biến như AjT0bởi vì đó là cách các biến được đặt tên trong các hàm tôi dịch sang mã. Sử dụng một cái gì đó như correlationIndexhoặc startTimesẽ khiến bạn càu nhàu.
TMN

4

Tất cả các câu trả lời hiện có đã bao gồm câu hỏi này một cách toàn diện. Tuy nhiên, tôi muốn chỉ ra đâu là antipode thực sự giữa các lượt thích của OpenCV, v.v., so với nói, mã được phát triển theo thông lệ kinh doanh tốt (Code Complete, Clean Code, RẮN, v.v.)

Nói chung, có rất nhiều lợi ích kinh doanh cho mã nguồn là KISS - "giữ cho nó đơn giản, ngu ngốc." Ngoài ra còn có một YAGNI liên quan - "Bạn không cần nó".

Thật không may, đối với phần mềm chuyên sâu tính toán trong các lĩnh vực khoa học, mã nguồn hiếm khi đơn giản hoặc nạc .


Theo truyền thống, OpenCV đã bị thiếu các khái quát hóa (rất nhiều sự sao chép mã để hỗ trợ các tùy chọn khác nhau), trong khi VTK phải chịu sự khái quát hóa quá mức (các mẫu).

Trong những ngày đầu, một số phần nhất định của OpenCV ban đầu được phát triển ở C. Sau đó, OpenCV đã sử dụng API C ++ mà chúng ta quen thuộc ngày nay. Một số thuật toán được viết lại để tận dụng các giao diện C ++ (các lớp cơ sở trừu tượng) và các mẫu C ++. Các thuật toán khác chỉ đơn giản là các hàm bao cho mã C gốc. Phần còn lại của các mã này có thể được tìm thấy rải rác xung quanh trong mô-đun "imgproc".

OpenCV chứa rất nhiều chương trình SIMD (vector hóa). Cho đến ngày nay, lập trình SIMD trong C ++ vẫn yêu cầu sử dụng nội tại (intel.com) , (arm.com) .

Nội tại SIMD đọc giống như ngôn ngữ lắp ráp, ngoại trừ trình biên dịch đảm nhiệm việc gán các biến của thanh ghi và trình biên dịch được phép tự do trao đổi thứ tự các hướng dẫn để tăng hiệu suất. Các thuật toán được viết để sử dụng nội tại SIMD có chi phí bảo trì cao. Đây là lý do tôi đã đề cập đến một câu hỏi tôi đã hỏi trước đó - Chi phí bảo trì cơ sở mã lập trình SIMD .

Một người không thực hiện lập trình SIMD có thể dễ dàng dẫn đến việc tin rằng SIMD có thể được gói gọn một cách thanh lịch và việc lập trình SIMD cấp thấp không còn cần thiết nữa. Điều này thực sự là khá xa sự thật. Tôi sẽ thách thức bất cứ ai thử thực hiện một thuật toán hữu ích trong SIMD (không phải fractals) và xem độ khó sử dụng trong các gói được đề xuất này.


Dưới đây là một danh sách dài các ý tưởng khi tôi cố gắng phân tích tại sao phần mềm tính toán không thể là KISS hoặc YAGNI. Tuy nhiên, tất cả những ý tưởng này là những khái quát quá mức và dường như chúng không hỗ trợ cho quan sát trên.

Các yếu tố đóng góp chính là:

  • Hiệu suất phần mềm
  • Sự cần thiết phải hỗ trợ nhiều tùy chọn thuật toán và sự đánh đổi
  • Sự cần thiết phải hỗ trợ nhiều nền tảng và trình biên dịch phần cứng khác nhau
    • Hợp chất này với vấn đề hiệu năng phần mềm - hiệu suất cần phải tốt cho nhiều nền tảng và trình biên dịch phần cứng.
  • Việc thiếu hiện đại hóa cơ sở mã đang diễn ra , do thiếu tài nguyên, thiếu người có kiến ​​thức có thể cải thiện chất lượng mã mà không ảnh hưởng đến các yếu tố khác, v.v.
    • Các dự án nguồn mở phải chịu đựng bi kịch của chung .
    • Các dự án nguồn mở nhận được tài trợ phải đáp ứng các sản phẩm cụ thể - chất lượng mã thường không phải là một phần của nó.
    • Đặc biệt, thậm chí còn thiếu những người có kiến ​​thức có thể thực hiện hoặc đề xuất cải tiến chất lượng mã gia tăng . Đây là vấn đề "thiếu nhãn cầu" - nhiều người được hưởng lợi từ mã, nhưng ít người mất thời gian để đọc mã.
  • Lịch sử thiếu các cổng chất lượng mã như xem xét mã, kiểm tra đơn vị, phân tích tĩnh, v.v.
    • Đối với một dự án quy mô lớn, các cổng chất lượng mã này không chỉ là các bước thủ công - mỗi cổng sẽ yêu cầu cơ sở hạ tầng (hệ thống dựa trên web, hệ thống kiểm tra đơn vị, hệ thống tự động hóa xây dựng, v.v.)

Một số yếu tố đóng góp ở trên là các phản ứng phát triển phần mềm kinh doanh:

  • Thông thường, phần mềm kinh doanh không cần phải xử lý cùng thông lượng dữ liệu cao được thấy trong phần mềm tính toán.
  • Phần mềm kinh doanh có thể được gắn với một hệ điều hành và kiến ​​trúc máy tính.
  • Phần mềm kinh doanh có thể tiết kiệm trong việc quyết định các chức năng bao gồm. Trên thực tế, phát triển phần mềm kinh doanh khuyến khích các nhà quản lý nói không với các tính năng mới trừ khi có trường hợp kinh doanh tốt.
    • Người dùng phần mềm kinh doanh nội bộ có thể được đào tạo để làm những việc khác nhau, tránh việc phải thay đổi mã.
    • Nếu một phần mềm kinh doanh thương mại mất một khách hàng do thiếu một tính năng, nhưng đã có được hai khách hàng mới do tính đơn giản và dễ sử dụng được cải thiện (xem "Nghịch lý của sự lựa chọn" ), nói chung đó là một lợi ích ròng - đó là một lợi ích tốt điều mà một tính năng này bị thiếu.
  • Phần mềm kinh doanh được hỗ trợ bởi một nguồn doanh thu liên tục, do đó nó có thể đủ khả năng để dành một phần của nó cho việc hiện đại hóa cơ sở mã liên tục.

1
Bạn đang mang lại rất nhiều điểm cho bảng mà tất cả dường như không liên quan đến câu hỏi.
Martin Maat

@MartinMaat Nếu bạn có những điều tích cực để thêm vào câu hỏi này, xin vui lòng viết vào câu trả lời của riêng bạn.
rwong

3

Là mã khoa học một lĩnh vực đủ khác nhau để bỏ qua các tiêu chuẩn mã hóa phổ biến?

Nó phụ thuộc vào những gì bạn gọi là "tiêu chuẩn mã hóa phổ biến". Tôi sẽ không gọi các thái cực của Agile là "chung". Cụ thể, coi một hàm dài tám dòng là quá dài hoặc có nhiều hơn hai mức độ thụt quá phức tạp là các tiêu chuẩn lố bịch trong lĩnh vực lập trình số / khoa học.

Hàm ma trận lần rất đơn giản có nhiều hơn bảy dòng và có ba mức thụt. Hàm sẽ phát triển phức tạp hơn đáng kể so với mức cần phải quan tâm về hiệu quả. Đây là một hoạt động phổ biến mà hiệu quả là quan trọng. Chia nó thành từng mảnh chính xác là những gì bạn không muốn làm. Một phân tách ma trận sẽ còn phức tạp hơn nữa.


2
"Agile" không liên quan gì đến các tiêu chuẩn mã hóa.
Gort Robot

@StevenBurnap - Chắc chắn là có. Nhìn vào "Mã sạch". Nó có vô số các tiêu chuẩn mã hóa trong đó.
David Hammen 17/03/2016

1
Mã sạch có rất nhiều tiêu chuẩn mã hóa là một lập luận xấu. Bản tuyên ngôn Agile có thể không liên quan gì đến các tiêu chuẩn mã hóa, nhưng Agile không thúc đẩy tính linh hoạt và phản ứng với sự thay đổi và tuân thủ các tiêu chuẩn mã hóa hoặc các thực tiễn tốt nhất hỗ trợ điều đó. Vì vậy - theo cách rất nhanh và gián tiếp, nhanh nhẹn có thể không liên quan gì đến các tiêu chuẩn mã hóa, nhưng tiêu chuẩn mã hóa có liên quan nhiều đến nhanh nhẹn.
Marjan Venema 17/03/2016

1

Tôi quyết định đăng bài này như một câu trả lời mới vì đó là một quan điểm hoàn toàn khác.

Chúng ta hãy xem một mẫu mã mà tôi cho là "mã sạch" về mặt thị giác máy tính và hiểu hình ảnh:

https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c042c6/modules/photo/src/siền_clelling_impl.cpp

Đối với những người quen thuộc với MATLAB và tính toán khoa học, mã trong C ++ gần như ngắn gọn như mã MATLAB sạch nhất có thể.


Bây giờ chúng ta phải hỏi, tại sao toàn bộ cơ sở mã thư viện (OpenCV trong ví dụ này) không được viết theo cùng tiêu chuẩn với mẫu mã này?


Chúng ta phải phân tầng cơ sở mã của thư viện khoa học lớn thành các mức trừu tượng .

cấp độ thấp , bạn thực sự đang thực hiện lại các phép cộng và phép trừ. Hoặc, theo nghĩa đen là ánh xạ lại từng hoạt động để triển khai nhanh nhất trên mỗi nền tảng.

https://github.com/opencv/opencv/blob/master/modules/core/src/hal_Vplocation.hpp

Mức trung bình là nơi chúng tôi tìm thấy mã "bẩn nhất", trong đó có thể dành 80% - 90% thời gian thực hiện CPU. (Tương tự, có thể 80% - 90% nỗ lực phát triển đã được sử dụng ở cấp độ trung bình, nếu chúng ta tính riêng các nỗ lực phát triển phần mềm từ nghiên cứu khoa học.)

cấp độ cao , chúng tôi có mã sạch nhất, được viết bởi các nhà nghiên cứu.


Một sự xuất sắc mạnh mẽ trong tổ chức mã nguồn là cần thiết để đảm bảo các mức này không trộn lẫn. Điều này vượt quá các tiêu chuẩn mã hóa , nhiều hơn nữa phải làm với quản lý nguồn mở .

Ví dụ, đôi khi quyết định được đưa ra để tách một dự án nguồn mở thành hai. Bạn không thể làm những điều này xảy ra bằng các cam kết mã.

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.