Làm thế nào để đối phó với không có đánh giá mã ở nơi mới của tôi khi tôi đến từ thực tiễn đó?


33

Nhóm trong công ty mới của tôi không có quy trình xem xét mã.

Tôi đến từ các công ty có đánh giá mã là một văn hóa bắt buộc và do đó tôi không cảm thấy thoải mái khi cam kết mã của mình mà không bị ai đó xem xét.

Tôi là một người tin tưởng vững chắc rằng đánh giá mã là một cách để cải thiện chất lượng và tiết kiệm thời gian vì nó nắm bắt được các vấn đề tiềm ẩn trước đó (lưu ý rằng tôi không nói về lập trình cặp).

  • Làm thế nào tôi có thể chỉ ra rằng đánh giá mã không phải là trình tiết kiệm thời gian mà là trình tiết kiệm thời gian?
  • Đánh giá mã có thể được bỏ qua nếu bạn có bài kiểm tra đơn vị?

đề xuất tài nguyên ngoài trang web rõ ràng ngoài chủ đề cho mỗi trung tâm trợ giúp . Xem meta.programmers.stackexchange.com/questions/6483/ từ
gnat

1
Hãy xem xét việc hỏi nó ở đây: meta.codereview.stackexchange.com Và trong tâm trí của tôi, câu hỏi này có thể được hỏi ở đây vì anh ấy / cô ấy chỉ muốn biết một khái niệm nào đó liên quan đến Lập trình.
xqMogvKW

1
Mặc dù tôi cũng là một người tin tưởng vững chắc vào đánh giá mã, tôi cũng đã có một số trải nghiệm tồi tệ khi đánh giá mã biến thành một cuộc chiến vĩnh viễn, công cụ đánh giá mã (gerrit) đã biến thành một hình đại diện xấu của một số diễn đàn thảo luận với những cuộc tranh luận quá nhiệt tình bởi bản ngã quá khổ. Tôi không chắc chắn nếu điều này chắc chắn xảy ra trong bất kỳ công ty nào, hoặc nếu đây chỉ là vấn đề trưởng thành của mọi người.
Joel

Đổi tên thành những gì bạn đang hỏi vì "Phải xem lại mã?" là một câu hỏi quá rộng, không thể trả lời vì nó sẽ phụ thuộc vào một số lượng lớn các yếu tố - quy mô công ty, # nhà phát triển, doanh thu, v.v. Tôi sẽ nghiên cứu về cách bạn có thể kết hợp và tiếp thị mong muốn và nhiệt tình của mình cho các hoạt động lập trình tốt và chế tạo phần mềm trên các trang web công cộng của bạn (sơ yếu lý lịch, linkIn, github, twitter, v.v.). xuất bản những gì bạn quan tâm và những gì bạn tìm kiếm để những người bạn muốn ở cùng sẽ thấy nó. Tất nhiên đây là lời khuyên 'tương lai', do đó là một nhận xét :)
Michael Durrant

3
Tôi không thể thấy đây là "đề xuất tài nguyên ngoài trang web" như thế nào. Điều đó không giống như lý do gần đúng với tôi.
nyuszika7h

Câu trả lời:


30

Đánh giá mã có thể được bỏ qua nếu bạn có bài kiểm tra đơn vị?

Nhưng tại sao?

Vai trò chính của đánh giá ngang hàng là không bắt lỗi.

Có, bạn có thể xác định một số lỗi tiềm ẩn và mã dễ bị nghi ngờ, lỗi này thường xảy ra, nhưng đôi khi phát hiện ra một số lỗi không có nghĩa là đánh giá ngang hàng là một cách đáng tin cậy để loại trừ sự hiện diện của lỗi. Xa đó. Đây không phải là công cụ phù hợp để xác minh tính đúng đắn của chức năng thực hiện.

Xem xét thực thi mã duy trì , mặc dù. Tôi sẽ yêu cầu mã đó sạch và dễ hiểu (không chỉ cho tác giả của nó) trước khi nó đi vào sản xuất.

Sự hiện diện của các bài kiểm tra đơn vị là hoàn toàn trực giao với điều đó. Bạn có thể có phạm vi bảo hiểm 100% mã và tất cả các bài kiểm tra chuyển cho mã hoàn toàn không thể hiểu được.

Đánh giá mã cũng phục vụ để làm quen với các nhà phát triển khác với công việc của bạn để họ biết những gì và có thể nhận từ đó hoặc xử lý các báo cáo lỗi trong khi bạn đang trong kỳ nghỉ, v.v. Biết ngay những gì bạn đã làm có thể giúp họ làm tốt công việc của họ - giữ cho codebase nhất quán (tuân theo các mẫu và quy ước tương tự trong toàn bộ ứng dụng) hoặc tránh sao chép mã.

Trong sơ đồ rộng hơn, mọi người cũng học hỏi và phát triển như một nhà phát triển từ việc đọc mã của người khác.

Các bài kiểm tra đơn vị khó có thể là một sự thay thế cho bất kỳ của nó. Vâng, nếu chúng được viết tốt, chúng đọc như tài liệu, và chúng ta nên cố gắng vì điều này. Nhưng một lần nữa, điều này không loại trừ lẫn nhau khi thực hiện đánh giá ngang hàng, hoàn toàn ngược lại - tất cả các lợi thế của đánh giá ngang hàng vẫn đúng, thực tế là các đồng nghiệp của bạn có một số bài kiểm tra đơn vị tốt để xem xét sẽ chỉ làm cho quá trình đánh giá dễ dàng hơn và thậm chí có lợi hơn thay vì dư thừa.


4
Tôi không tin rằng các bài kiểm tra đơn vị cũng là một sự thay thế cho các đánh giá mã. Nhưng vai trò chính của các bài kiểm tra đơn vị cũng không phải là bắt lỗi. Có, bạn có thể xác định một số lỗi tiềm ẩn khi viết bài kiểm tra đơn vị, nhưng kiểm tra đơn vị là để đảm bảo bạn sẽ không giới thiệu lỗi sau này khi bạn phải thay đổi điều gì đó. Vì vậy, mục tiêu của các bài kiểm tra đơn vị là để giữ cho mã của bạn được duy trì, quá.
Doc Brown

2
@DocBrown đúng mà. Tuy nhiên, lỗi bắt hồi quy cũng thuộc danh mục bắt lỗi. Rõ ràng đây là một trong những lợi thế mà các bài kiểm tra đơn vị có được qua đánh giá ngang hàng (ở khía cạnh này), vì chúng không phải là hoạt động một lần. Đánh giá ngang hàng thậm chí không cố gắng giải quyết khía cạnh quan trọng này, vì không thể xem xét lại toàn bộ cơ sở mã sau mỗi thay đổi.
Konrad Morawski

1
@DocBrown Peer review doesn't even attempt to tackle this important aspect- tốt, nó, loại. Đến một mức độ. Tôi thường thấy mình chỉ ra ví dụ. "đối tác, bạn đang lặp lại một cách hiệu quả logic tương tự ở đây, và đó là một quả bom nổ. Một ngày nào đó nó sẽ thay đổi ở nơi khác và chúng tôi sẽ quên cập nhật nó ở đây ..."
Konrad Morawski

24

Có nghiên cứu và thống kê nào cho thấy việc xem lại mã không phải là một công cụ tiết kiệm thời gian mà là tiết kiệm thời gian không?

Tôi không biết về bất kỳ. Thật khó để thực hiện các nghiên cứu như vậy, bởi vì bạn cần hai nhóm có nhiệm vụ phức tạp như nhauthực tế để thực hiện, trong đó một nhóm sử dụng các đánh giá mã và nhóm kia thì không. Có lẽ bạn cần phải nhờ họ giải quyết vấn đề tương tự , điều đó có nghĩa là ném rất nhiều tiền ra khỏi cửa sổ. Và bạn cần lặp lại thử nghiệm thường xuyên đủ để có được mức độ phù hợp về mặt thống kê, điều này sẽ làm tăng số tiền đó ném theo các đơn đặt hàng lớn.

Nếu bạn chỉ đo lường hiệu quả của các công ty sử dụng đánh giá mã đối với các công ty không, thì không chỉ không rõ cách đo lường hiệu quả mà còn cả nguyên nhân thực sự là gì. Mã đánh giá là một phần của một nền văn hóa lớn hơn. Phần nào của nó thực sự làm cho nhóm hiệu quả hơn rất khó để nói (và rất có thể phụ thuộc vào bản chất của nhóm hoặc dự án). Hoặc sự hiện diện của văn hóa này có thể đơn giản có nghĩa là công ty nhỏ hơn hoặc trẻ hơn, mỗi công ty có nhiều tác động. Hoặc cũng có thể là sự sẵn lòng gửi mã đánh giá ngăn chặn hoặc thúc đẩy một khoảng cách lành mạnh đến bản ngã của bạn;)

Nhưng đừng quên: bạn có kinh nghiệm của riêng mình để rút kinh nghiệm. Đó là một phần lý do tại sao họ thuê bạn. Vì vậy, nếu bạn thực sự tin rằng bạn có thể tăng hiệu quả (và nhóm của bạn thực sự bị thiếu), thì hãy truyền đạt điều đó một cách rõ ràng.

Đánh giá mã có thể được bỏ qua nếu bạn có bài kiểm tra đơn vị?

Không. Nếu bạn tin vào tầm quan trọng của các bài kiểm tra, thì thực sự bài kiểm tra của bạn nên là điều đầu tiên được xem xét. Nếu chúng vô nghĩa thì sao? Hoặc nếu bảo hiểm là tệ hại? Hoặc nếu họ kiểm tra thực hiện chứ không phải hành vi?


2
Tôi nghĩ rằng bạn đã thực hiện một điểm tốt thực sự về đánh giá mã cho các trường hợp thử nghiệm. cảm ơn bạn!
jparkcool

4
+1 cho "bạn có kinh nghiệm của riêng mình để rút kinh nghiệm" - thực ra, nếu một người đã thực sự làm việc với các đánh giá mã trong một thời gian, anh ta phải thấy có bao nhiêu vấn đề chất lượng thường được khắc phục trong quá trình đánh giá mã thông thường và chuyển giao kiến ​​thức bao nhiêu đã đạt được. Từ kinh nghiệm đó, thật khó để không có một số lý lẽ cho hoặc chống lại các đánh giá mã.
Doc Brown

2
Về đoạn đầu tiên của bạn: Nó sẽ yêu cầu không chỉ hai đội thực hiện cùng một nhiệm vụ, mà cả hai nhóm có khả năng như nhau, kinh nghiệm cá nhân sẽ gặp rắc rối với bất kỳ nỗ lực nào để nghiên cứu điều này.
David Wilkins

"Điều gì sẽ xảy ra nếu chúng vô nghĩa? Hoặc nếu phạm vi bảo hiểm là tệ hại?" Hoặc chỉ cần nói return true;.
Burhan Ali

1
Đọc chương 20 của Code Complete để xử lý triệt để các đánh giá mã, và các nghiên cứu và thống kê hỗ trợ việc sử dụng chúng. Dưới đây là một vài tóm tắt hay: blog của Jeff Atwoodmột anh chàng khác
Mike Partridge

5

Lấy từ một số slide ngẫu nhiên tôi tìm thấy , nhưng dữ liệu cứng xuất phát từ cuốn sách Code Complete của Steve McConnell:

Nhận xét mã có hữu ích không?

"Tôi tin rằng các đánh giá mã ngang hàng là điều lớn nhất bạn có thể làm để cải thiện mã của mình"

Jeff Atwood của Mã hóa kinh dị tại http: //www.codinghorror.com/blog/2006/01/code-reviews-just-do-it.html


"Kiểm tra cá nhân thường bắt được khoảng 60 phần trăm lỗi, cao hơn các kỹ thuật khác ngoại trừ tạo mẫu và thử nghiệm beta khối lượng lớn."

Steve McConnell, Code Complete 2nd Edition, trang 485

Con số 60% đó xuất phát từ bài báo của IEEE bởi Shull et al 2002 Những gì chúng ta đã học được về các khuyết tật chiến đấu có chứa phần có tiêu đề:

"Đánh giá ngang hàng nắm bắt 60% các khuyết điểm"


1
Tôi nghĩ rằng vấn đề với điều này là vào năm 2006, chúng tôi chưa hoàn toàn chấp nhận lập trình cặp, điều mà tôi cảm thấy như đã trở thành một loại thay thế cho việc đánh giá mã ngang hàng theo một cách nào đó. Tôi nhận ra rằng họ không thể so sánh theo một số cách.
JP Silvashy

3

Tuyên bố từ chối trách nhiệm: Câu trả lời này là kinh nghiệm cá nhân của tôi :)

Tôi đã có những trải nghiệm rất tệ với các đánh giá mã trong mã mà chúng tôi duy trì. Bởi vì chúng tôi thường chỉ có một lớp lót hoặc hơn và không có nhiều thứ để xem xét.

Nhưng trong các dự án thực tế tôi đã có kinh nghiệm tốt, trong thời gian kiểm tra, huấn luyện viên của tôi đã xem xét quy định mã của tôi và nó giúp tôi rất nhiều để tìm ra một số lỗi tôi thường xuyên mắc phải, rằng tôi không làm nữa.

Vì vậy, tôi muốn nói rằng nó phụ thuộc rất nhiều vào việc bạn đang làm gì, bạn có bao nhiêu người, v.v.

Ngoài ra, rủi ro mà lượt xem tiền mã hóa của bạn kết thúc trong một cuộc chiến là không được đánh giá thấp.


3

Bạn có thể yêu cầu trưởng nhóm và / hoặc đồng nghiệp của mình đánh giá lại mã của bạn, ngay cả khi các đánh giá mã không được thực hiện bình thường, có lẽ là một phần trong quá trình đào tạo của bạn.

Hãy chắc chắn rằng mã của bạn được viết tốt và được kiểm tra trước khi xem xét.

Khi tôi là trưởng nhóm, tôi thường tự đánh giá mã cho nhân viên mới, cho đến khi (sau một thời gian) tôi sẽ ngừng tìm lỗi hoặc bất cứ điều gì khác để chỉ trích trong mã của họ, và điểm nào tôi sẽ ngừng đánh giá mã với họ; điều đó sẽ xảy ra khi:

  • Họ đã học được các hệ thống mà họ giao tiếp và không cần tôi giải thích về nó
  • Họ đã học cách thiết kế và / hoặc kiểm tra mã của họ cho đến khi nó không có lỗi trước khi tôi thấy nó
  • Họ đã học đủ về các nguyên tắc phong cách mã hóa của tôi mà tôi cho rằng mã của họ có thể duy trì được

Đánh giá mã có một số mục đích:

  • Tìm lỗi trong mã
  • Chuyển giao kiến ​​thức giữa các thành viên trong nhóm

Tôi nghĩ sẽ tốt khi thực hiện đánh giá mã cho nhân viên mới, ngay cả khi nhóm chọn bỏ qua đánh giá mã giữa các thành viên trong nhóm có kinh nghiệm.


2

Không có quy tắc ngón tay cái nào cho việc đánh giá mã được thực hiện trên bất kỳ phần mềm nào được phát triển ... tất cả phụ thuộc vào phạm vi ứng dụng, quy mô khách hàng và quy mô công ty. Ví dụ: nếu bạn đang xây dựng một ứng dụng trong đó một ứng dụng đơn giản trong đó có thể không có bất kỳ phiên bản nào nữa đang được triển khai trong tương lai, thử nghiệm đơn vị là đủ ở đó. Nhưng một lần nữa, đánh giá mã được đưa ra khi bạn nói về hiệu năng của ứng dụng nơi bạn cần xem lại mã cho bất kỳ sự sụt giảm mã nào có thể được thực hiện theo cách tốt hơn để tạo điều kiện cho hiệu suất nhanh hơn.

Đánh giá mã thường được thực hiện khi có một nhóm gồm hơn 2 nhà phát triển và lãnh đạo công nghệ nơi lãnh đạo công nghệ muốn đảm bảo chất lượng của ứng dụng và đảm bảo các tiêu chuẩn mã được tuân theo để mở rộng ứng dụng cho các cải tiến trong tương lai và nâng cấp nó cho khác phiên bản sắp tới.

Ví dụ, hiện tại chúng tôi có nhiều nền tảng nguồn mở CMS và các nền tảng này thỉnh thoảng phát hành các bản nâng cấp để tăng cường các tính năng nền tảng, hãy tưởng tượng một nhà phát triển sử dụng một trong những nền tảng này và đã không tuân theo các tiêu chuẩn mã như mã hóa cứng trong các tệp lõi, ứng dụng viết mã trong các tệp mẫu và nếu mã này được sản xuất và sau này khi máy khách muốn nâng cấp nền tảng lên phiên bản mới, nó sẽ không bao giờ được nâng cấp trừ khi mã hóa được làm lại theo tiêu chuẩn mã cho nền tảng đó. Ở đây nó trở thành một vấn đề nghiêm trọng để phát hành mã cho sản xuất mà không cần xem lại mã.

Vì vậy, tôi muốn nói rằng việc đánh giá mã được thực hiện trước khi phát hành là điều bắt buộc đối với bất kỳ công ty phần mềm chuyên nghiệp nào và ngoại lệ chỉ có thể dành cho các ứng dụng cá nhân / quy mô rất nhỏ, nơi nhà phát triển là lập trình viên dày dạn kinh nghiệm và mang theo kinh nghiệm với anh ta.


1

Đánh giá mã có những ưu điểm không xuất phát từ chính quá trình xem xét: Luôn có một vấn đề nan giải để có được mã có chất lượng cao, nhưng được tạo ra trong một thời gian ngắn. Nếu không có đánh giá mã, bạn sẽ tự mình thực hiện, vì vậy bạn có thể hy sinh chất lượng để thực hiện mã trong một thời gian ngắn. Với các đánh giá mã, có người đánh giá này không cho phép bạn thoát khỏi chất lượng mã thấp - đó chính xác là những gì bạn muốn, bị buộc phải dành thời gian để có được mã chất lượng, đó là điều bạn muốn ở nơi đầu tiên, và đó là bạn biết rằng cuối cùng sẽ tiết kiệm thời gian vì mỗi giờ dành cho việc viết mã tốt hơn là hai giờ được lưu khi gỡ lỗi (hoặc hơn).

Không có đánh giá mã, bạn chỉ có một mình, do đó, việc duy trì chất lượng mã cao là tùy thuộc vào bạn. Một giải pháp đơn giản là xem xét mọi thay đổi bạn tự thực hiện và khắc phục những điều không theo tiêu chuẩn chất lượng của bạn.

Điều này cũng tránh được các tình huống khủng khiếp khi đánh giá mã dẫn đến xung đột bản ngã - tình huống mà lập trình viên A sẽ sử dụng phương thức X, trong khi B sẽ sử dụng phương thức Y, vì vậy nếu A viết mã anh ta sử dụng phương thức X, người đánh giá B nhấn mạnh vào phương thức Y, vì vậy A viết lại mã bằng phương thức Y, trong khi nếu B đã viết mã và A xem lại thì điều ngược lại chính xác sẽ xảy ra.


0

Nếu bạn là người ủng hộ đánh giá mã, tôi e rằng không có người thay thế thực sự. Trường hợp không may và rập khuôn là nơi làm việc không thực hiện đánh giá mã vì (A) họ không quen với thực tiễn và / hoặc (B) họ không muốn dành thời gian và nỗ lực để nhận xét mã hệ thống tại chỗ.

Về cơ bản, để có được những gì bạn muốn ở đây, bạn cần một sự thay đổi văn hóa nơi làm việc - và điều đó không bao giờ đơn giản hay dễ dàng. Đừng quên rằng ngay cả khi nơi làm việc của bạn bị thuyết phục 100% rằng các đánh giá mã là tuyệt vời và họ muốn áp dụng chúng, thực sự chuyển sang cách làm việc mới vẫn sẽ cần một sự đầu tư đáng kể về thời gian, năng lượng và năng suất. Khoản đầu tư này sẽ tự hoàn vốn - nhưng bạn cần phải mua để đầu tư, không chỉ cho khoản hoàn trả. Xem video "Thử nghiệm đơn vị và TDD của Roy Osherove - Cách thực hiện" - những thách thức của việc áp dụng đánh giá mã rất giống với áp dụng thử nghiệm đơn vị.

Trong lúc này, hãy làm những gì bạn có thể để có được càng nhiều càng tốt:

  • Nếu có những nhà phát triển khác thấy giá trị của các đánh giá mã, hãy thử xem xét lẫn nhau, thậm chí không chính thức.
  • Nếu bạn có một người cố vấn hoặc một số nhà phát triển chịu trách nhiệm về việc đào tạo của bạn, hãy giải thích cho anh ta giá trị bạn thấy trong các đánh giá mã và hỏi xem họ có sẵn sàng xem lại mã của bạn không, ít nhất là trong một dịp nào đó.
  • Nói với người quản lý của bạn, bạn muốn xem lại mã của người khác, vì điều đó sẽ giúp bạn hiểu rõ hơn về hệ thống.
  • Nếu tại một thời điểm nào đó, bạn trở thành trưởng nhóm, bạn có thể kích hoạt đánh giá mã tại địa phương, chỉ dành cho nhóm của bạn.

Một lợi ích chính của bất kỳ trong số này là, nếu bạn có thể duy trì chúng theo thời gian, thì các nhà phát triển xung quanh bạn sẽ bắt đầu nhận thấy các đánh giá mã. Bạn sẽ chứng minh một cách hiệu quả cách đánh giá mã có thể được tích hợp trong văn hóa hiện tại - và điều đó mở ra hướng văn hóa bắt đầu thay đổi. Đánh giá mã giúp , vì vậy nếu bạn có thể chứng minh rằng ở quy mô nhỏ, điều đó sẽ mở đường cho những người khác - và toàn bộ nền văn hóa - làm theo ví dụ của bạn.


-2

Đừng lo lắng về điều đó - chủ nhân mới của bạn không quan tâm đến đánh giá mã. Học cách tự tin vào khả năng của chính bạn mà không cần ai khác nói với bạn rằng bạn có thể kiểm tra mã bạn đã viết. Bạn sẽ sớm học được cách sống mà không có quá trình tẻ nhạt vô tâm đang xem xét mã của người khác.

Thực hiện theo các nguyên tắc phong cách (hoặc chỉ phong cách) mà mọi người khác sử dụng. Sử dụng kinh nghiệm của bạn để quyết định những gì cần bình luận, những quy ước đặt tên để sử dụng và như vậy.

Sau đó kiểm tra mọi thứ trước khi bạn kiểm tra nó. Điều quan trọng nhất là nó hoạt động chính xác.


2
-1: Việc nhóm mới của OP không thực hiện đánh giá mã không khiến cho việc đó trở thành một ý tưởng tồi. Đó là một dấu hiệu của một kỹ sư giỏi để giúp cải thiện chất lượng của quá trình phát triển.
Jørgen Fogh

1
@ JørgenFogh Tôi cũng hỗ trợ đánh giá mã, nhưng dường như bạn cho rằng đánh giá mã sẽ giúp quá trình phát triển cụ thể này. Ngoài câu trả lời này, tôi sẽ hỏi tại sao họ không thực hiện đánh giá mã - họ có thể có lý do chính đáng. Có lẽ, như câu trả lời này cho thấy - công ty này thuê những người không cần phải xem mã của họ, hoặc ít nhất là lợi ích từ việc đó không đáng để trả thêm chi phí. Nếu OP cố gắng nhưng không có bất kỳ may mắn nào thay đổi bất cứ điều gì, đây sẽ là câu trả lời để quay trở lại.
DoubleDouble

1
Có thể là những lợi ích không đáng giá. Tuy nhiên, việc nhóm không thực hiện đánh giá mã cho chúng tôi không có gì về việc họ có nên hay không.
Jørgen Fogh

4
-1: "Điều quan trọng nhất là nó hoạt động chính xác." Đây là một cái nhìn khá thiển cận về những gì quan trọng khi nói đến mã sản xuất. Mã được đọc thường xuyên hơn nó được viết. Giá trị của đánh giá mã (được thực hiện tốt) vượt xa việc kiểm tra tính chính xác. Trong số nhiều ưu điểm, đánh giá mã đảm bảo rằng mã có ý nghĩa với người không viết nó.
Dancrumb

-2

Nếu chủ nhân mới của bạn không thích ý tưởng đánh giá mã, thì có thể là do họ có mối liên hệ tiêu cực với các phương pháp loại lệnh và kiểm soát lỗi thời và họ đang nhắm đến một tập hợp loại thực hành nhanh nhẹn, hiện đại hơn. Trong trường hợp này, họ có thể cởi mở hơn với ý tưởng lập trình cặp, cung cấp nhiều lợi ích giống nhau và được coi là một cách thực hành hiện đại, năng động hơ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.