it-swarm-vi.com

Bạn có thực sự viết 'mã sạch' không?

Tôi đã thấy một số lập trình viên tinh chỉnh mã của họ nhiều lần không chỉ để làm cho nó 'hoạt động tốt', mà còn để làm cho nó 'trông ổn'.

IMO, "mã sạch" thực sự là một lời khen cho thấy mã của bạn thanh lịch, hoàn toàn dễ hiểu và có thể duy trì được. Và sự khác biệt xuất hiện khi bạn phải lựa chọn giữa một mã hấp dẫn về mặt thẩm mỹ so với mã gây căng thẳng khi xem xét.

Vì vậy, có bao nhiêu bạn thực sự viết 'mã sạch'? Đó có phải là một thực hành tốt? Những lợi ích hoặc nhược điểm khác của việc này là gì?

57
ykombinator

Tôi sẽ lập luận rằng nhiều người trong chúng ta không viết mã sạch . Và nói chung, đó không phải là công việc của chúng tôi. Công việc của chúng tôi là nhà phát triển phần mềm là cung cấp một sản phẩm hoạt động đúng thời gian.

Tôi nhớ về bài đăng trên blog của Joel Spolsky: Lập trình viên băng keo .

Anh ta trích dẫn từ Coders at Work :

Vào cuối ngày, vận chuyển thứ f ***** g! Thật tuyệt vời khi viết lại mã của bạn và làm cho nó sạch hơn và đến lần thứ ba, nó sẽ thực sự đẹp. Nhưng đó không phải là điểm mà bạn không thể viết mã; bạn ở đây để vận chuyển sản phẩm. - Jamie Zawinsky

Tôi cũng được nhắc nhở phản hồi trên blog của Robert Martin :

Vì thế. Hãy thông minh. Làm sạch. Hãy đơn giản. Tàu! Và giữ một cuộn băng keo nhỏ ở trạng thái sẵn sàng, và don không ngại sử dụng nó. - Chú Bob

Nếu mã, một nhà phát triển viết tình cờ sạch sẽ và làm việc (có thể phân phối được), vì vậy, nó là tốt cho tất cả mọi người. Nhưng nếu một nhà phát triển đang mày mò tìm cách tạo ra mã sạch và dễ đọc với chi phí để có thể cung cấp mã kịp thời, thì điều đó thật tệ. Làm cho nó hoạt động, sử dụng băng keo, và vận chuyển nó. Bạn có thể tái cấu trúc nó sau và làm cho nó siêu tuyệt đẹp và hiệu quả.

Vâng, đó là cách tốt để viết mã sạch, nhưng không bao giờ phải trả giá. Lợi ích của việc cung cấp một sản phẩm được dán vào ống đúng thời gian vượt xa lợi ích của mã sạch chưa bao giờ được hoàn thành và giao.

Một đoạn mã tốt mà tôi đi qua không sạch. Một số là hết sức xấu xí. Nhưng tất cả chúng đều được phát hành và sử dụng trong sản xuất. Một số người có thể nói rằng việc viết mã lộn xộn là không chuyên nghiệp. Tôi không đồng ý. Điều chuyên nghiệp là cung cấp mã hoạt động, cho dù đó là sạch sẽ hay lộn xộn. Nhà phát triển phải làm tốt nhất có thể, trong bất kỳ thời gian nào được phân bổ trước khi giao hàng. Sau đó, quay trở lại để dọn dẹp-- đó là chuyên nghiệp. Hy vọng rằng, mã được phân phối không phải là băng keo thuần túy và 'đủ sạch'.

54
spong

Bạn phải đảm bảo rằng mã của bạn rất dễ đọc, sạch sẽ và có thể bảo trì. Đó là điều mà tất cả các lập trình viên phải làm.

Nhưng bạn đang nói về over styling (như thuật ngữ đó tốt hơn là mã cô gái ) không phục vụ gì ngoài cái tôi của tác giả.

Tôi đã thấy nhiều nhà phát triển trong quá khứ rất tự hào về sự sáng tạo của họ (bạn biết đấy, như trong phòng vệ sinh;)), họ đã dành hàng giờ để làm sạch và đánh bóng mã của họ. Một số người trong số họ tỉ mỉ đến mức họ đảm bảo rằng khoảng trắng chính xác giữa các thành viên được tôn trọng.

Quá nhiều.

Tôi thấy kiểu hành vi đó phản tác dụng. Trong ngữ cảnh chuyên nghiệp , bạn phải là chuyên nghiệp . Bạn có thể có được sự hài lòng của mình bằng cách viết mã sạch, rất dễ đọc và có thể duy trì và nói chuyện với người dùng hoặc đồng nghiệp hạnh phúc.

39
user2567

Tôi sẽ không đồng ý với câu trả lời được chấp nhận cho câu hỏi này.

Trách nhiệm của bạn rõ ràng là vận chuyển, nhưng thông thường bạn cũng có trách nhiệm vận chuyển thứ gì đó có thể duy trì với chi phí hiệu quả nhất có thể bởi chính bạn và các nhà phát triển trong tương lai.

Tôi đã dành thời gian làm lập trình viên hoặc nhà tư vấn bảo trì kém trên trang web, người phải hiểu và gỡ lỗi một số hệ thống không có giấy tờ lớn và tôi có thể nói với bạn rằng các thiết kế kém và mã lộn xộn lộn xộn có thể dẫn đến hàng giờ hoặc thậm chí nhiều ngày lãng phí. Tôi có thể nghĩ ra rất nhiều tình huống trong đó thêm N giờ nỗ lực của nhà phát triển ban đầu có thể dẫn đến tiết kiệm chi phí 5N về thời gian của tôi.

Tôi biết có một thống kê nổi xung quanh vấn đề này, nhưng theo kinh nghiệm của tôi trên nhiều dự án, mỗi dòng mã được viết được đọc 5-20 lần trong quá trình gia hạn và bảo trì.

Vì vậy, tôi sẽ nói với dọn sạch mã trong vòng một inch của cuộc sống. Mất nhiều thời gian, nhưng có khả năng tiết kiệm chi phí ròng trong suốt vòng đời của dự án.

24
Benjamin Wootton

Bất cứ ai trong chúng ta sẽ mua một chiếc xe hơi nếu chúng ta biết rằng dưới mui xe, tất cả đều lộn xộn và khó khắc phục, bảo trì hoặc sửa chữa và cần nhiều tài nguyên để chạy hơn mức cần thiết?

Tại sao nó phải là bất kỳ khác nhau cho một phần mềm?

Chỉ vì người dùng cuối không thể nhìn dưới mui xe không có nghĩa là họ sẽ không bao giờ biết điều đó. Sớm muộn gì nó cũng sẽ xuất hiện.

Trả lời câu hỏi "Bạn có thực sự viết 'mã sạch' không?" - Ồ, vâng.!

21
Sifar

Nếu bằng 'mã sạch', bạn có nghĩa là tôi sẽ tránh đường để đảm bảo mã rõ ràng nhất có thể?

Heck có.

Mã càng sạch, mã càng rõ ràng thì càng dễ bảo trì và do đó giúp bạn tiết kiệm thời gian trong thời gian dài. Đừng xem mã sạch là hư không; hãy xem nó như một khoản đầu tư để tiết kiệm công sức và thời gian trong tương lai.

18
GrandmasterB

Thành thật mà nói nó phụ thuộc. Tôi thích cách mọi người nói về bữa tiệc về việc "bất cứ thứ gì dưới mã sạch tài liệu tốt đều là một trò hề tuyệt vời!", Nhưng tôi làm việc trong một doanh nghiệp với chu kỳ triển khai lố bịch và không giám sát: Tôi làm tốt nhất có thể, nhưng tôi viết như vậy nhiều mã rất khó để viết mã hoàn hảo sạch mà mọi người khác tuyên bố họ viết.

Tôi cố gắng viết mã có thể dễ dàng được duy trì bởi một người có khả năng của tôi. Tôi nhận xét các phần khó khăn, tôi đặt tên cho các chương trình, biến và các tên thân thiện với lớp, tôi triển khai và tôi tiếp tục. Tôi không có thời gian để làm bất cứ điều gì khác.

Đôi khi tôi cảm thấy một chút tội lỗi về nó, nhưng không phải là rất. Bạn sẽ thấy một số điều kinh khủng mà tôi phải đối phó hàng ngày. Hàng thập kỷ mã tùy chỉnh trong các ngôn ngữ tối nghĩa với tài liệu không. Một trong những đồng nghiệp của tôi phát triển độc quyền trong Visual Basic 6.0 và triển khai các mã nhị phân có tên mã hóa ở khắp mọi nơi. Người phụ nữ mà tôi đã thay thế được lập trình độc quyền trong RPG .

Thật khó cho tôi để tin, nhiều chuyện kinh khủng như tôi từng thấy trong những năm làm lập trình viên, rằng mọi người chỉ tạo mã sạch.

15
Satanicpuppy

Tôi không nghĩ rằng tôi thích thuật ngữ "mã cô gái" nhưng mã sạch = mã có thể duy trì. Bất cứ điều gì ít hơn là không chuyên nghiệp.

Theo nguyên tắc chung, tôi xem xét nhà phát triển tiếp theo phải xem xét mớ hỗn độn của mình.

Rất nhiều thời gian là tôi ... vài tháng sau ... khi tôi không nhớ nó hoạt động như thế nào ... và tôi thậm chí còn có ít thời gian hơn để thay đổi.

7
Heath Lilley

Tôi cố gắng viết "mã sạch" theo nghĩa Bob Martin (ví dụ: OO). Có tuyệt vời giá trị khi viết mã sạch. Nó dễ bảo trì hơn nhiều.

Sau đó, tôi để ReSharper biến nó thành "mã đẹp" cho tôi (ví dụ: căn chỉnh, ngắt dòng, v.v.). Có tốt giá trị khi viết mã đẹp. Nhưng có lợi nhuận giảm dần. Một số tính năng làm cho nó dễ bảo trì hơn một chút do dễ đọc.

Nếu bạn cảm thấy rằng việc sắp xếp gọn gàng các khối mã lớn là cần thiết để làm cho nó dễ đọc hơn, thì vấn đề là khối mã khổng lồ quái dị của bạn! Nó quá to. Tôi thấy nhiều ví dụ về những người đang chịu khó để làm đẹp một số mã được thiết kế rất kém.

Nếu tôi không có ReSharper, tôi vẫn sẽ có mã sạch, nhưng nó sẽ không đẹp bằng.

Tôi không nghĩ rằng tôi nên dành hơn ~ 5% thời gian mã hóa của mình để hoàn thiện. Điều đó có nghĩa là biên tập viên của tôi càng mạnh mẽ và tôi càng thành thạo với nó, tôi càng có thể làm đẹp hơn.

5
dss539

Dường như không ai nêu lên quan điểm điều gì làm bạn quan tâm nhất?

Thông thường, nếu không phải luôn luôn, các lập trình viên chỉ là nhân viên và trong khi các quyết định quản lý có thể làm chúng tôi thất vọng, chúng tôi thường không có tất cả dữ liệu họ làm.

Ví dụ: giả sử công ty được ký hợp đồng với một điều khoản rằng nếu phần mềm không sẵn sàng kịp thời, bạn sẽ không được trả tiền (điều đó chỉ xảy ra với chúng tôi, mặc dù tôi nghĩ rằng chúng tôi đã nhận được khoản thanh toán). Vâng, mã sạch rất quan trọng, nhưng quan trọng hơn là để mã hoạt động vào ngày thanh toán!

Một ví dụ khác - công ty đang ở trong tình trạng tài chính tồi tệ và cần phải tăng một số tiền. Đoán xem ai quan tâm đến chất lượng? Bạn có thể sửa nó sau, nếu bạn phải, chỉ cần gửi nó!

Một đối số có thể là "Tại sao tôi nên bán hết và viết mã crappy?". Chà, tại sao công ty của bạn phải trả cho bạn một tấm séc Nice mỗi tháng? Lựa chọn, bạn của tôi. Nếu bạn theo chủ nghĩa duy tâm, hãy thử Nền tảng phần mềm miễn phí ; Tôi nghe nói họ đang làm một số thứ khá tuyệt (ý tôi là cái này và tôi tôn trọng FSF và OSS).

Mặt khác, nếu bạn làm việc trong một dự án nơi dự kiến ​​sẽ có sự tăng trưởng bùng nổ trong sử dụng (mặc dù các dự đoán như vậy hầu như không bao giờ chính xác), tốt hơn hết bạn nên đặt nền tảng vững chắc với chất lượng mã tốt nhất, vì gần như chắc chắn sẽ bảo trì là chi phí lớn hơn cho dự án.

Các lập trình viên thích mã 'sạch', bất kể điều đó có nghĩa là gì. Chúng tôi thậm chí không thể đồng ý về những gì sạch sẽ, nhưng chúng tôi yêu nó. Tuy nhiên, đôi khi điều đó không quan trọng bằng khả năng sử dụng và tính chính xác. Chúng có vẻ đồng nghĩa, nhưng chúng không - nếu bạn đã thấy mã được viết bởi một hacker Perl thực sự trong 4 giờ với ý định được sử dụng hai lần và vứt đi, bạn sẽ thừa nhận nó không sạch, nhưng nó hoạt động.

Vì vậy, đôi khi, cái tôi sang một bên, chúng ta nên làm cho nó hoạt động. Lưu ý rằng tôi không khuyên bạn nên viết mã xấu như một thói quen; Tôi chỉ chỉ ra rằng nó có thể là cần thiết. Sự hoàn hảo cần có thời gian mà công ty của bạn có thể không có. Vì vậy, nếu chủ nhân của bạn không bận tâm, hãy tạo ra phần mềm, nhưng nếu bạn cần, chỉ cần viết mã làm việc, đừng bận tâm đến "sự sạch sẽ". Đây không phải là câu trả lời 'Một kích thước phù hợp với tất cả' - bạn nên ưu tiên.

4
K.Steff

Quá nhiều bất cứ điều gì không bao giờ là tốt.

Tuy nhiên, một điều quan trọng cần lưu ý với mã "ô uế" là nó có thể dễ dàng dẫn đến " cửa sổ bị hỏng ". Nếu mã được định dạng rất kém, tôi nghĩ rằng nhiều người mới sử dụng cơ sở mã có thể cảm thấy ít có xu hướng làm tốt công việc bảo trì và tiến hóa gây ra một vòng xoáy đi xuống cuối cùng có thể ảnh hưởng đến tình trạng hoạt động của phần mềm.

Do đó, việc duy trì một mức độ sạch nhất định trong mã có lợi cho nhiều hơn là chỉ các nhà phát triển đồng nghiệp của bạn. Đừng dành quá nhiều thời gian cho nó (~ 5% đã được đề cập). Tìm hiểu cách sử dụng các công cụ của thủ công của bạn để tự động hóa các tác vụ thủ công (định dạng mã trong trường hợp này). Chịu trách nhiệm về những gì bạn làm và luôn làm những gì bạn cảm thấy có lợi nhất cho công ty/khách hàng/người dùng của bạn.

3
Per Noalt

Đây là một trích dẫn từ Clean Code, của Bob Martin:

Để lái xe về điểm này, điều gì sẽ xảy ra nếu bạn là bác sĩ và có một bệnh nhân yêu cầu bạn dừng tất cả việc rửa tay ngớ ngẩn để chuẩn bị cho phẫu thuật vì mất quá nhiều thời gian? Rõ ràng bệnh nhân là ông chủ; nhưng bác sĩ tuyệt đối nên từ chối tuân thủ Tại sao? Bởi vì bác sĩ biết nhiều hơn bệnh nhân về nguy cơ mắc bệnh và nhiễm trùng. Sẽ là không chuyên nghiệp (không bao giờ để tâm đến tội phạm) để bác sĩ tuân thủ bệnh nhân.

Vì vậy, thật không chuyên nghiệp khi các lập trình viên uốn éo theo ý muốn của những người quản lý, những người không hiểu về những rủi ro của việc tạo ra các mớ hỗn độn.

3
Tulains Córdova

Tôi không chắc chắn "nhìn tốt" và "thanh lịch, hoàn toàn dễ hiểu và có thể duy trì" là tương đương.

Tôi cố gắng viết mã, đó là "thanh lịch, hoàn toàn dễ hiểu và có thể duy trì". Tôi thực hiện cấu trúc lại mã của riêng mình để phù hợp hơn với các tiêu chí đó.

Tôi không thấy bất kỳ nhược điểm nào, ngoại trừ chi phí kết quả trong thời gian.

Để mã "trông ổn", có rất nhiều công cụ tự động, sẽ thụt lề đúng cách và không gian mọi thứ bạn muốn.

3
back2dos

Tôi thích mã để có thể đọc được, nhưng điều quan trọng nhất là tính nhất quán. Đối với tôi điều đó có nghĩa là tính nhất quán với các quy ước đặt tên khoảng cách giữa các hàm, dấu ngoặc đơn trên cùng một dòng hoặc dòng tiếp theo của câu lệnh if, v.v.

Tất nhiên, có những lúc ai đó lập trình một cái gì đó với một kiểu mã nhất quán và nó vẫn khiến tôi phát điên. Đặc biệt là mã không "thở". Ví dụ:

void function1(){
    //whatever code
}
int fooBar(){
    //whatever else
}
Foo* someOtherFooBar(int value){
    if(value){
        //do something
    }
    return ...;
}

Chà ... Có vẻ tệ hơn với các phương thức Objective-C, và với rất nhiều và rất nhiều câu lệnh if lồng nhau và các dòng dài hơn 80 ký tự. Nhưng nó vẫn làm tôi khó chịu :)

2
vedosity

Tôi nghĩ rằng "mã sạch" nên sạch sẽ hoặc sạch hơn so với cách bạn đã từng viết trong các bài kiểm tra vật lý/kỹ thuật/toán học. Nếu nó quá lộn xộn, học sinh sẽ không hiểu công việc của bạn và có thể sẽ đánh dấu nó sai ngay cả khi nó đúng.

2
chiurox

Tôi đi rất lâu để làm sạch mã. Tôi nghĩ rằng nó rất nhiều giúp các con bọ nổi bật.

Tôi không đồng ý với khái niệm "vận chuyển thứ chết tiệt ngay bây giờ", bởi vì mã sạch là một khoản đầu tư cho tương lai. Cũng có quá nhiều phần mềm được vận chuyển với quá nhiều lỗi. Theo tôi, giải quyết một lỗi tốt hơn là thực hiện một tính năng mới.

Ngoài ra nếu bạn nhìn vào ước tính năng suất lập trình viên , tôi không nghĩ mình bị điểm rất tệ. Viết mã sạch là một thói quen, và càng có nhiều kinh nghiệm làm lập trình viên, người ta càng làm việc hiệu quả hơn. Nếu một người không bao giờ thử nó, rõ ràng, người ta sẽ không bao giờ có kinh nghiệm với nó.

Một điểm khác cần tính đến, đó là phần lớn thời gian của nhà phát triển dành cho việc đọc mã, vì vậy mã có thể đọc được giúp giảm đáng kể thời gian đọc. Hiểu các thuật toán không có giấy tờ chẳng hạn có thể tốn kém và mời các lỗi mới.

Một điều tôi chắc chắn bỏ lỡ và muốn có một ngày là một trình định dạng mã tự động mà tôi có thể thích nghi với phong cách của mình, điều đó thực sự sẽ giúp tôi tiết kiệm thời gian, đặc biệt là khi đọc mã của người khác.

Mã hóa sạch có liên kết đến chủ nghĩa hoàn hảo, có nguy cơ không bao giờ thành hiện thực, nhưng tôi nghĩ đó chủ yếu là vấn đề khi bạn bắt đầu, bởi vì bạn đầu tư vào sau và khi sử dụng lại các đoạn mã thanh lịch của riêng bạn, kết hợp với kinh nghiệm của bạn , già đi, bạn sẽ rất năng suất và ít bị ám ảnh bởi các lỗi hơn so với các lập trình viên lộn xộn.

Đây là một phần mã thể hiện phong cách mã hóa của tôi.

2
user20416

Chỉ cần tránh "mã vanity". Có rất nhiều nhà phát triển ngoài kia làm những việc hoàn toàn không phù hợp (hoặc do OCD) và không có gì khác. Quần lót của tôi thực sự bị xoắn với những người đó.

1
ElGringoGrande

Tôi viết mã cố gắng giải quyết vấn đề đã cho theo cách 'thanh lịch' hiệu quả và lý thuyết nhất. Theo nghĩa đó chỉ có nó là sạch sẽ. Nếu nó xảy ra là 'đẹp' khi tôi hoàn thành, thì cũng vậy.

Những gì tôi đã tìm thấy trong những trải nghiệm hạn chế của mình là khi mọi người phàn nàn về 'mã sạch', sự xấu xí thường là kết quả của một giải pháp khủng khiếp thay vì quy ước mã hóa.

1
Kurtis

Tôi sẽ nói rằng tôi đã nỗ lực để viết mã sạch hơn, nhưng điều đó có thể thay đổi do hạn chế về thời gian hoặc nếu tôi đang làm việc gì đó khó khăn. Nó có xu hướng trở nên lộn xộn khi tập trung vào làm cho nó hoạt động. Sau đó tôi sẽ quay lại và dọn dẹp khi tôi xem lại nó. Nếu bạn quay lại mã và phải dành quá nhiều thời gian để làm mới bộ nhớ của mình, bạn đã không nhận xét đủ.

Mã sạch là tốt nhưng giống như mọi thứ khác, nó chỉ cần đủ sạch. Việc thụt 5 dòng mã 4 khoảng trắng và một dòng 5 khoảng trắng không làm tăng khó đọc.

1
JeffO

Tôi nghĩ rằng nó phụ thuộc vào những gì bạn đang làm. Nếu tôi đang viết một ứng dụng bằng chứng về khái niệm thì về cơ bản tôi là cao bồi mã hóa mông của tôi và không nhìn lại. Nếu tôi đang làm việc trên một ứng dụng mà tôi thực sự sẽ làm việc trong một thời gian, thì tôi chắc chắn rằng tôi đã viết mã đủ tốt cũng như làm cho nó dễ hiểu một tháng kể từ bây giờ.

Tôi nghĩ rằng phong cách mã của bạn là một chút iffy. Như một số người đã nói ở trên, công việc của bạn là tạo ra một sản phẩm, không phải là mã được định dạng nhưng tôi sẽ nói ít nhất một người nên gắn bó với một phong cách xác định về nhận xét và mã hóa mọi thứ. Tôi ghét nhìn thấy một nửa các biến lạc đà vỏ và nửa còn lại Hungary.

Nhưng ngoài ra, nó phụ thuộc vào ý của bạn về 'mã sạch'.

1
user7007

Tái cấu trúc mã của bạn để làm cho nó thanh lịch giúp dễ đọc hơn và dễ bảo trì hơn. Ngay cả những điều nhỏ như sắp xếp các bài tập biến của bạn:

int foo    = 1;
int bar    = 2;
int foobar = 3;

dễ đọc hơn

int foo = 1;
int bar = 2;
int foobar = 3;

điều đó có nghĩa là việc lướt qua dễ dàng hơn khi bạn gỡ lỗi sau này.

Ngoài ra, trong PHP bạn cho phép bất kỳ số khối mã ngẫu nhiên nào. Tôi sử dụng chúng để nhóm các tác vụ logic:

// do x
{
    // ...
}

// do y
{
    // ...
}

Điều này thêm định nghĩa rõ ràng cho mã có liên quan.

Chỉnh sửa: Là một phần thưởng được thêm vào, thật dễ dàng để bắt đầu một trong những khối mã logic đó bằng if (false) nếu bạn muốn bỏ qua nó tạm thời.

0
Craige

Tôi thừa nhận làm điều đó; và lợi ích không bị làm phiền mỗi khi tôi nhìn thấy nó. Tôi đoán nó cũng dễ đọc hơn và do đó lỗi trở nên rõ ràng hơn; nhưng lý do thực sự là tôi không thể chịu được mã xấu.

0
user281377