Làm thế nào để đối phó với những quan niệm sai lầm về tối ưu hóa sớm là một căn nguyên của tất cả những kẻ ác?


26

Tôi đã gặp nhiều người chống lại bất cứ điều gì có thể được coi là "tối ưu hóa" theo nghĩa tiếng Anh của từ này, và họ thường trích dẫn nguyên văn câu nói (một phần) "tối ưu hóa sớm là gốc rễ của mọi tội lỗi" như một lời biện minh cho lập trường của họ, ngụ ý rằng họ diễn giải bất cứ điều gì tôi đang nói là "tối ưu hóa sớm". Tuy nhiên, những quan điểm này đôi khi rất cố chấp đến mức họ loại bỏ khá nhiều bất kỳ loại sai lệch thuật toán hoặc cấu trúc dữ liệu nào khỏi việc triển khai "ngây thơ" thuần túy nhất ... hoặc ít nhất là bất kỳ sai lệch nào so với cách họ đã làm trước đây.Làm thế nào người ta có thể tiếp cận những người như thế này theo cách khiến họ "mở tai" lại sau khi họ tắt máy khi nghe về "hiệu suất" hoặc "tối ưu hóa"? Làm thế nào để tôi thảo luận về một chủ đề thiết kế / triển khai có ảnh hưởng đến hiệu suất mà không cần mọi người nghĩ ngay: "Anh chàng này muốn dành hai tuần cho mười dòng mã?"

Bây giờ, lập trường về việc "tất cả tối ưu hóa có sớm và do đó xấu" hay không đã được đề cập ở đây cũng như ở các góc khác của Web , và nó đã được thảo luận về cách nhận biết khi tối ưu hóa là sớm và do đó là xấu , nhưng Thật không may, vẫn có những người trong thế giới thực không hoàn toàn cởi mở với những thách thức đối với niềm tin của họ vào Chống tối ưu hóa.

Những nỗ lực trước đây

Một vài lần, tôi đã thử cung cấp trích dẫn đầy đủ từ Donald Knuth để giải thích rằng "tối ưu hóa sớm là xấu" ↛ "tất cả tối ưu hóa đều xấu":

Chúng ta nên quên đi những hiệu quả nhỏ, nói về 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi tội lỗi. Tuy nhiên, chúng ta không nên bỏ qua cơ hội của mình trong 3% quan trọng đó.

Tuy nhiên, khi cung cấp toàn bộ trích dẫn, đôi khi những người này thực sự trở nên tin tưởng hơn rằng những gì tôi đang làm là Premature Optimization ™ và đào sâu và từ chối lắng nghe. Nó gần như là từ "tối ưu hóa" làm họ sợ: Đôi khi, tôi có thể đề xuất thay đổi mã cải thiện hiệu suất thực tế mà không bị phủ quyết bằng cách đơn giản tránh sử dụng từ "Optimiz (e | ation)" ( và "hiệu suất" cũng vậy - từ đó cũng đáng sợ) và thay vào đó sử dụng một số biểu thức như "kiến trúc thay thế" hoặc "triển khai được cải thiện". Vì lý do này, nó thực sự có vẻ như đây thực sự là chủ nghĩa giáo điều và thực tế không phải họ đánh giá những gì tôi nói một cách nghiêm túc và sau đó bác bỏ nó là không cần thiết và / hoặc quá tốn kém.


10
Chà, lần trước bạn có một cuộc thảo luận như vậy, bạn có thực sự đo lường được rằng màn trình diễn sẽ tệ bởi cách thực hiện ngây thơ, thuần khiết nhất? Hoặc, ít nhất, đã ước tính sơ bộ về thời gian chạy dự kiến? Nếu không, những người khác có thể đã hoàn toàn chính xác với ý kiến ​​của họ, bạn không có cách nào để biết.
Doc Brown

12
@errantlinguist: Nếu chương trình thực sự "chậm như mật đường", thì rõ ràng bạn phải dễ dàng phát hiện ra "mức 3% quan trọng" đó của Knuth và do đó thổi phồng mọi lập luận chống lại việc tối ưu hóa nó. Và nếu bạn không thể phát hiện ra rằng ... thì bạn vẫn chưa hoàn thành bài tập về nhà và bạn chưa sẵn sàng để tối ưu hóa. Vì vậy, không rõ vấn đề ở đâu.
Nicol Bolas

6
@errantlinguist: Nếu bạn đưa ra bằng chứng về phần mã đó là một vấn đề hiệu năng đáng kể cho ứng dụng và toàn bộ ứng dụng chậm hơn mức cần thiết và họ vẫn từ chối yêu cầu sửa đổi mã, thì nó không ' vấn đề Bạn đang làm việc với những người không kiên định với lý luận dựa trên bằng chứng, và do đó là không hợp lý.
Nicol Bolas

6
@errantlinguist: Câu hỏi chính: Có phải khách hàng phàn nàn rằng ứng dụng trong khu vực đó bị chậm?
Gort Robot

5
Tôi đang bỏ phiếu để đóng vì OP rõ ràng chỉ tìm kiếm ai đó để xác thực ý kiến, thay vì trả lời cho một câu hỏi thực tế. Tôi không nghĩ rằng điều này sẽ (hoặc nên) mở trên Workplace.SE.
BlueRaja - Daniel Pflughoeft

Câu trả lời:


35

Có vẻ như bạn đang tìm kiếm các phím tắt để không thử "triển khai ngây thơ thuần túy nhất" trước tiên và trực tiếp thực hiện một "giải pháp tinh vi hơn bởi vì bạn biết trước rằng việc triển khai ngây thơ sẽ không làm điều đó". Thật không may, điều này sẽ hiếm khi hoạt động - khi bạn không có sự thật khó khăn hoặc lập luận kỹ thuật để chứng minh rằng việc triển khai ngây thơ là hoặc sẽ quá chậm, rất có thể bạn đã sai và điều bạn đang làm tối ưu hóa sớm. Và cố gắng tranh luận với Knuth thì ngược lại với việc có một sự thật khó khăn.

Theo kinh nghiệm của tôi, bạn sẽ phải cắn viên đạn và thử "triển khai ngây thơ" trước (và có thể sẽ ngạc nhiên về mức độ thường xuyên này đủ nhanh), hoặc ít nhất bạn sẽ ước tính sơ bộ về thời gian chạy, như:

"Việc triển khai ngây thơ sẽ là O (n³) và n lớn hơn 100.000; sẽ diễn ra trong vài ngày, trong khi việc triển khai không ngây thơ sẽ diễn ra trong O (n), sẽ chỉ mất vài phút" .

Chỉ với những lý lẽ như vậy, bạn có thể chắc chắn rằng việc tối ưu hóa của bạn không còn sớm.

IMHO chỉ có một ngoại lệ từ điều này: khi giải pháp nhanh hơn cũng đơn giản và gọn gàng hơn, thì bạn nên sử dụng giải pháp nhanh hơn ngay từ đầu. Ví dụ tiêu chuẩn là một trong việc sử dụng từ điển thay vì danh sách để tránh mã vòng lặp không cần thiết cho tra cứu hoặc sử dụng truy vấn SQL tốt cung cấp cho bạn chính xác một bản ghi kết quả bạn cần, thay vì một kết quả lớn phải có sau đó được lọc trong mã. Nếu bạn có một trường hợp như vậy, đừng tranh cãi về hiệu suất- hiệu suất có thể là một lợi ích bổ sung, nhưng có lẽ không liên quan nhất và khi bạn đề cập đến nó, mọi người có thể bị cám dỗ sử dụng Knuth chống lại bạn. Tranh luận về khả năng đọc, mã ngắn hơn, mã sạch hơn, khả năng bảo trì - không cần "che dấu" bất cứ điều gì ở đây, nhưng bởi vì những điều đó (và chỉ những điều đó) là những đối số chính xác ở đây.

Theo kinh nghiệm của tôi, trường hợp sau rất hiếm - trường hợp điển hình hơn là lần đầu tiên người ta có thể thực hiện một giải pháp đơn giản, ngây thơ, dễ hiểu hơn và ít xảy ra lỗi hơn so với trường hợp phức tạp hơn, nhưng có lẽ nhanh hơn.

Và tất nhiên, bạn nên biết rõ các yêu cầu và trường hợp sử dụng đủ để biết hiệu suất nào được chấp nhận và khi mọi thứ trở nên "quá chậm" trong mắt người dùng của bạn. Trong một thế giới lý tưởng, bạn sẽ nhận được thông số hiệu suất chính thức của khách hàng, nhưng trong các dự án trong thế giới thực, hiệu suất bắt buộc thường là một vùng màu xám, điều mà người dùng của bạn sẽ chỉ cho bạn biết khi họ lưu ý chương trình "quá chậm" trong sản xuất. Và thông thường, đó là cách làm việc duy nhất để tìm ra khi có gì đó quá chậm - phản hồi của người dùng, và sau đó bạn không cần trích dẫn Knuth để thuyết phục đồng đội rằng "việc thực hiện ngây thơ" của họ là không đủ.


15
@errantlinguist: có lẽ tôi đã không làm cho mình rõ ràng, hoặc nó chỉ đơn giản là những gì không muốn nghe? Lời khuyên của tôi là: đừng thử sử dụng * các lập luận triết học "của Knuth về" 3% "hoặc" 97% ". Hãy giữ thực tế, nếu không thì các đồng nghiệp của bạn rất có thể đúng rằng các đối số hiệu suất của bạn không phù hợp.
Doc Brown

4
@errantlinguist: trong trường hợp bạn mô tả trong nhận xét của mình cho câu trả lời của Karl Bielefeld, bạn dường như có tất cả các đối số về phía bạn mà không cần sử dụng "hiệu suất". Tôi sẽ tiến thêm một bước và nói, nếu bạn tranh luận về hiệu suất trong trường hợp như vậy, bạn đã phạm một sai lầm rất lớn, bởi vì các đồng nghiệp của bạn đã đúng: hiệu suất thường không quan trọng ở đó. Tranh luận về tính đơn giản, dễ đọc, khả năng bảo trì, ít dòng mã hơn, nhưng không (!) Về hiệu suất, thậm chí không phải là một ghi chú bên lề. Đừng cho họ khả năng sử dụng Knuth chống lại bạn.
Doc Brown

2
@errantlinguist: không chôn vùi nó - đặt các khía cạnh đó vào trọng tâm, khi chính xác là các khía cạnh đó nên được tập trung và không sử dụng hiệu suất làm đối số khi bạn không thể chứng minh rằng nó tạo ra sự khác biệt quan trọng cho người dùng cuối.
Doc Brown

2
@errantlinguist: Tôi không chắc làm thế nào bạn đạt được kết luận đó. Câu trả lời của Doc Brown dường như hoàn toàn rõ ràng: bạn vượt qua những lý lẽ không có ích này mà bạn đang có với các đồng nghiệp của mình bằng cách bám sát các tuyên bố thực tế về những gì hiệu quả và không thể chấp nhận được.
jl6

1
Đây là lời khuyên tốt cho lập trình nhỏ, nhưng bỏ qua các câu hỏi về hiệu suất ở cấp độ thiết kế kiến ​​trúc có thể khiến một nhóm đi vào ngõ cụt, bởi vì nó có thể được thực hiện rất nhiều trước khi buộc phải đối mặt với vấn đề, và không có gì đảm bảo rằng phần lớn công việc đó có thể tái sử dụng khi vấn đề là do kiến ​​trúc (tôi đã thấy nó giết chết một sản phẩm.) Tôi biết bạn có một ngoại lệ trong câu trả lời của mình, nhưng để biết liệu nó có áp dụng hay không, bạn vẫn phải đặt câu hỏi và thậm chí đặt câu hỏi rõ ràng là sự vô cảm đối với đồng nghiệp của errantlinguist.
sdenham

18

Hãy tự hỏi mình điều này:

  • Là phần mềm KHÔNG đáp ứng đặc điểm kỹ thuật hiệu suất?
  • Phần mềm CÓ vấn đề về hiệu năng không?

Đây là những lý do để tối ưu hóa. Vì vậy, nếu mọi người phản đối, chỉ cần cho họ xem thông số kỹ thuật và quay lại với họ và giải thích chúng tôi cần tối ưu hóa vì chúng tôi không đáp ứng thông số kỹ thuật. Ngoài ra, người ta sẽ khó thuyết phục người khác rằng tối ưu hóa là cần thiết.

Tôi nghĩ rằng điểm chính của trích dẫn là, nếu bạn không gặp vấn đề gì, đừng thực hiện tối ưu hóa không cần thiết vì thời gian và năng lượng có thể được sử dụng ở nơi khác. Từ một doanh nghiệp triển vọng, điều này làm cho ý nghĩa hoàn hảo.

Thứ cấp, đối với những người sợ tối ưu hóa, luôn sao lưu kết quả hiệu suất với số liệu. Mã nhanh hơn bao nhiêu? Hiệu suất đã cải thiện bao nhiêu so với trước đây? Nếu một người dành hai tuần chỉ để cải thiện mã 2% so với phiên bản trước, nếu tôi là sếp của bạn, tôi sẽ không vui. Hai tuần đó có thể đã được dành để thực hiện một tính năng mới có thể thu hút nhiều khách hàng hơn và kiếm được nhiều tiền hơn.

Cuối cùng, hầu hết các phần mềm không phải được tối ưu hóa cao. Chỉ trong một vài ngành công nghiệp chuyên ngành là tốc độ thực sự quan trọng. Vì vậy, hầu hết thời gian người ta có thể sử dụng các thư viện và khung công tác có sẵn để có hiệu quả tốt.


4
Mặc dù thông tin tốt, nhưng điều này thực sự không trả lời câu hỏi của tôi về cách làm việc với những người ném đá một cuộc thảo luận vào phút mà nó phải làm với hiệu suất.
errantlinguist

7
Tôi đồng ý với tất cả những điều này ngoại trừ "Chỉ trong một vài ngành công nghiệp chuyên ngành là tốc độ thực sự quan trọng." Tôi nghĩ bạn đánh giá thấp số lượng phần mềm có vấn đề về hiệu suất theo quan điểm của khách hàng.
Gort Robot

@StevenBurnap: Yep-- có những ứng dụng web nào thực sự không chậm? - Tôi muốn thấy một ứng dụng khoa học giống nhau.
errantlinguist

1
google.com khá nhanh. :-P
Gort Robot

Hãy thử sử dụng google.com trên kết nối di động EDGE. Vâng, đó là một trường hợp cạnh vô lý, nhưng nó chắc chắn sẽ không nhanh chóng . ;) (Pun thực sự không có ý
định--

7

Làm thế nào để làm việc với những người ném đá một cuộc thảo luận vào phút mà nó phải làm với hiệu suất?

Bắt đầu với các nguyên tắc được chia sẻ dựa trên định hướng chiến lược của nhóm bạn.

Nguyên tắc của tôi:

Nguyên tắc cá nhân của tôi về viết mã là trước tiên nhắm đến tính chính xác trong chương trình của tôi, sau đó lập hồ sơ và xác định xem nó có cần tối ưu hóa không. Tôi tự cấu hình mã của mình vì các lập trình viên khác là khách hàng tiềm năng của mã của tôi - và họ sẽ không sử dụng mã đó nếu chậm - vì vậy đối với mã của tôi, tốc độ là một tính năng.

Nếu người tiêu dùng của bạn là khách hàng, khách hàng của bạn sẽ cho bạn biết nếu bạn cần mã nhanh hơn.

Tuy nhiên, có những lựa chọn tốt hơn trong mã mà người ta có thể thực hiện. Tôi thà nhận nó ngay trong bản thảo đầu tiên của tôi vì một số lý do:

  1. Nếu tôi hiểu đúng ngay từ lần đầu tiên, thì tôi có thể quên việc triển khai (lợi dụng việc che giấu thông tin) và tôi không làm lộn xộn mã của mình với TODOs.
  2. Những người khác (đặc biệt là những người chỉ học trong công việc) thấy nó được thực hiện đúng cách, và họ học từ và sử dụng cùng một kiểu mã sắp tới. Ngược lại, nếu họ thấy tôi làm sai cách, họ cũng sẽ làm sai.

Giả sử nhu cầu tối ưu hóa là chính xác

Giả sử đây là một phần thực sự quan trọng trong mã của bạn cần tối ưu hóa, bạn có thể nói câu chuyện ngụ ngôn của Schlemiel the Họa sĩ , hoặc nhấn mạnh phần còn lại của trích dẫn:

"Các lập trình viên lãng phí rất nhiều thời gian để suy nghĩ hoặc lo lắng về tốc độ của các phần không văn bản trong chương trình của họ và những nỗ lực này có hiệu quả thực sự có tác động tiêu cực mạnh khi gỡ lỗi và bảo trì. Chúng ta nên quên đi những hiệu quả nhỏ. 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi tội lỗi. Tuy nhiên, chúng ta không nên bỏ qua cơ hội của mình trong 3% quan trọng đó. " - Donald Knuth

Cân nhắc chi phí của sự phức tạp bổ sung

Đôi khi có một chi phí thực sự về khả năng duy trì của sự phức tạp thêm vào. Trong trường hợp này, bạn có thể giữ việc triển khai thứ cấp trong một chức năng hoặc lớp con khác và áp dụng cùng một mức độ không mong muốn cho nó để không có câu hỏi nào là đúng. Sau đó, nếu bạn lập hồ sơ mã của mình và thấy việc triển khai ngây thơ là một nút cổ chai, bạn có thể chuyển đổi mã được tối ưu hóa của mình và cải thiện mạnh mẽ chương trình của bạn.

Khả năng lãnh đạo

Đôi khi vấn đề là cái tôi - một số người thà sử dụng mã dưới mức tối ưu hoặc lỗi hơn là người khác có quyền hơn họ. Bạn có thể muốn tránh làm việc với những người này.

Lãnh đạo, đặc biệt là khi bạn không có thẩm quyền vị trí đối với mọi người, là về việc đưa ra các đề xuất hợp lý và hướng dẫn người khác đến một sự đồng thuận. Nếu bạn không thể hướng dẫn nhóm của mình đến một cuộc họp của những tâm trí, có lẽ vấn đề không đáng để nhấn. Có lẽ cá lớn hơn để chiên.


6

Con đường phía trước là quên đi những trích dẫn thực tế và những cách hiểu khác nhau - đó là chủ nghĩa giáo điều hoặc là cách tập trung quá nhiều vào một trích dẫn cụ thể của một đạo sư. Ai nói Knuth luôn luôn đúng?

Thay vào đó tập trung vào dự án trong tay, phần mềm bạn đang phát triển cùng với các đồng nghiệp mà bạn không đồng ý. Các yêu cầu cho hiệu suất chấp nhận được cho phần mềm này là gì? Có chậm hơn thế này không? Sau đó tối ưu hóa.

Bạn không phải gọi nó là "tối ưu hóa", bạn có thể gọi nó là "sửa lỗi", vì theo định nghĩa là lỗi nếu việc triển khai không tuân thủ các yêu cầu.

Tổng quát hơn, có hai khả năng liên quan đến tối ưu hóa:

  1. Mã được tối ưu hóa cũng ngắn hơn, đơn giản hơn để hiểu và dễ bảo trì hơn.

  2. Mã được tối ưu hóa phức tạp hơn để hiểu, mất nhiều thời gian hơn để viết và kiểm tra hoặc sẽ phức tạp hơn để thay đổi trong tương lai nếu các yêu cầu thay đổi theo những cách không mong muốn.

Nếu trường hợp là (1) bạn thậm chí không phải tranh luận về tối ưu hóa. Nhưng nếu (2) là trường hợp, sau đó bạn đang tham gia vào một thương mại-off quyết định. Đây thực sự là một quyết định cấp độ kinh doanh, không hoàn toàn là một quyết định kỹ thuật. Bạn phải cân nhắc chi phí tối ưu hóa so với lợi ích. Để có được lợi ích, sự kém hiệu quả phải là vấn đề ngay từ đầu, vì trải nghiệm người dùng xấu hoặc chi phí phần cứng hoặc các tài nguyên khác tăng lên đáng kể.


Vâng, tôi hoàn toàn đồng ý với câu ban đầu của bạn. Tuy nhiên, tôi khá chắc chắn rằng một phần mềm có thể "chậm một cách khó chịu cho trường hợp sử dụng dự định" mà không có các yêu cầu về hiệu suất được chỉ định rõ ràng theo cách chính thức.
Doc Brown

@DocBrown: Tất nhiên, nhưng trong mọi trường hợp, chính khách hàng sẽ quyết định xem nó có quá chậm hay không, không phải là nhà phát triển.
JacquesB

Tôi chưa bao giờ gặp các yêu cầu kinh doanh trong đó nêu rõ các yêu cầu về hiệu suất.
errantlinguist

@errantlinguist: Theo kinh nghiệm của tôi, nó khá phổ biến trong các doanh nghiệp tập trung vào khách hàng như các cửa hàng trực tuyến. Nhưng đối với các công cụ và ứng dụng để sử dụng nội bộ trong một công ty, trải nghiệm người dùng thường không phải là mối quan tâm của chủ dự án.
JacquesB

4

Tôi nghĩ rằng trích dẫn đầy đủ trong bối cảnh là hướng dẫn. Tôi sẽ sao chép từ một bài đăng tôi đã thực hiện trên Reddit về chủ đề:

Không có nghi ngờ rằng chén hiệu quả dẫn đến lạm dụng. Các lập trình viên lãng phí một lượng lớn thời gian để suy nghĩ hoặc lo lắng về tốc độ của các phần không văn bản trong chương trình của họ và những nỗ lực này có hiệu quả thực sự có tác động tiêu cực mạnh khi gỡ lỗi và bảo trì. Chúng ta nên quên đi những hiệu quả nhỏ, nói về 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi tội lỗi.

Tuy nhiên, chúng ta không nên bỏ qua cơ hội của mình trong 3% quan trọng đó. Một lập trình viên giỏi sẽ không bị ru ngủ bởi sự tự mãn bởi lý do như vậy, anh ta sẽ khôn ngoan khi xem xét kỹ các mã quan trọng; nhưng chỉ sau khi mã đó đã được xác định.

- Donald Knuth, Lập trình có cấu trúc để đi đến Tuyên bố , Khảo sát tính toán ACM, Tập 6, Số 4, Tháng 12 năm 1974, tr.268

Vấn đề và ngụ ý là có nhiều điều quan trọng hơn là lo lắng về việc tối ưu hóa quá sớm. Chắc chắn, bạn nên xem xét cẩn thận các cấu trúc dữ liệu và thuật toán của mình (tỷ lệ này là 3%) nhưng bạn không nên lo lắng về việc liệu phép trừ có nhanh hơn modulo hay không (điều này nằm trong 97%) cho đến khi rõ ràng rằng tối ưu hóa ở mức độ thấp cần thiết.

Cái trước không nhất thiết là tối ưu hóa theo nghĩa mà các đồng nghiệp của bạn đang nghĩ, nhưng nó là tối ưu hóa theo nghĩa các thuật toán và cấu trúc dữ liệu được lựa chọn kém là không tối ưu.


2
Người ta có thể nói thêm rằng Knuth rõ ràng không nghĩ rằng việc phân tích độ phức tạp thời gian của các thuật toán và đưa ra các lựa chọn thiết kế trên cơ sở đó, là tối ưu hóa sớm.
sdenham

3

Theo kinh nghiệm của tôi, nếu bạn nhận được sự phản đối này để tối ưu hóa thường xuyên , mọi người không thực sự phàn nàn về tối ưu hóa. Họ đang phàn nàn về những gì bạn đang hy sinh dưới danh nghĩa tối ưu hóa. Điều này thường là dễ đọc, duy trì hoặc kịp thời. Nếu mã của bạn được phân phối trong cùng một khoảng thời gian và dễ hiểu, mọi người sẽ không quan tâm nếu bạn sử dụng các thuật toán và cấu trúc dữ liệu hiệu quả hơn. Đề nghị của tôi trong trường hợp này là làm việc để làm cho mã của bạn thanh lịch và dễ bảo trì hơn.

Nếu bạn gặp phải sự phản đối này liên quan đến mã của người khác, thì thường là do bạn đề xuất một số lượng đáng kể việc làm lại. Trong những trường hợp đó, bạn thực sự cần một số phép đo thực tế để cho thấy nó đáng để nỗ lực, hoặc có lẽ cố gắng tham gia sớm hơn trong giai đoạn thiết kế, trước khi mã được viết. Nói cách khác, bạn cần chứng minh nó trong 3%. Nếu chúng ta viết lại tất cả các mã không chính xác như chúng ta thích, chúng ta sẽ không bao giờ đạt được bất cứ điều gì.


Thật không may, tôi thực sự đã làm một trường hợp ngược lại, nơi tôi sử dụng ví dụ Dequetừ thư viện chuẩn Java để thay thế một lượng lớn logic được xây dựng xung quanh ArrayListmột ngăn xếp được sử dụng như một ngăn xếp trong khi làm việc với mã ... và điều này được đánh dấu cho thay đổi trong đánh giá. Nói cách khác, người đánh giá muốn có nhiều mã hơn, nó cũng chậm hơn và dễ bị lỗi hơn vì anh ta không quen thuộc Deque.
errantlinguist

3
Không sẵn lòng học một thứ gì đó bằng ngôn ngữ của bạn trong 10 năm là một thái độ độc hại đối với một lập trình viên và là một vấn đề sâu sắc hơn nhiều so với mô tả ban đầu của bạn. Cá nhân, trong tình huống đó tôi sẽ từ chối lời khuyên, và chuyển nó đến quản lý nếu cần.
Karl Bielefeldt

5
@errantlinguist: khi người đánh giá của bạn đề xuất một giải pháp rõ ràng tồi tệ hơn (có nghĩa là phức tạp hơn) để thay thế cho một giải pháp đơn giản và sạch sẽ, bạn nên tranh luận về điều đó. Đừng tranh cãi về hiệu suất! Nghiêm túc, thậm chí không bao giờ sử dụng từ "hiệu suất" trong cuộc thảo luận đó. Chỉ tranh luận về khả năng đọc và bảo trì. Và nếu người xem xét khăng khăng mã xấu của mình, hãy leo thang.
Doc Brown

+1 Không chắc chắn lý do tại sao câu trả lời này có downvote thay vì upvote cộng với là câu trả lời được chấp nhận. Nó gợi ý cả hai cách xử lý vấn đề, cộng với phân tích về vấn đề thực sự tiềm ẩn có thể là gì (tức là không ai muốn được nói mã của họ phải được viết lại một cách triệt để).
Andres F.

2

Thực sự có rất nhiều hiểu lầm về trích dẫn này, vì vậy tốt nhất nên lùi lại và xem vấn đề thực sự là gì. Vấn đề không phải là quá nhiều mà bạn không bao giờ nên "tối ưu hóa". Đó là "tối ưu hóa" không bao giờ là một nhiệm vụ bạn nên đặt ra. Bạn không bao giờ nên thức dậy vào buổi sáng và nói với chính mình "này, tôi nên tối ưu hóa mã ngày hôm nay!".

Điều này dẫn đến lãng phí nỗ lực. Chỉ cần nhìn vào mã và nói "Tôi có thể làm cho nó nhanh hơn!" dẫn đến rất nhiều nỗ lực làm cho một cái gì đó nhanh hơn, đủ nhanh ở nơi đầu tiên. Bạn có thể thấy tự hào khi nói với bản thân rằng bạn đã tạo ra một chút mã nhanh hơn bốn lần, nhưng nếu mã đó là một phép tính xảy ra trên một lần nhấn nút và phải mất 10 msec ngay từ đầu trước khi hiển thị cho người dùng, không ai sẽ cho một cái chết tiệt.

Đó là "sớm" trong "tối ưu hóa sớm". Khi nào nó không "sớm"? Khi khách hàng nói với bạn "điều này quá chậm, hãy sửa nó đi!" Đó là khi bạn đào mã và cố gắng làm cho nó nhanh hơn.

Điều này không có nghĩa là bạn nên tắt não. Điều đó không có nghĩa là bạn nên giữ 10.000 hồ sơ khách hàng trong một danh sách liên kết đơn. Bạn nên luôn luôn hiểu tác động hiệu suất của những gì bạn làm trong tâm trí và hành động phù hợp. Nhưng ý tưởng là bạn không dành thêm thời gian cố tình để làm cho nó nhanh hơn. Bạn chỉ đơn giản là lựa chọn nhiều lựa chọn hiệu quả hơn trong số các lựa chọn khác bằng nhau.


Điều này không có nghĩa là bạn nên tắt não. Điều đó không có nghĩa là bạn nên giữ 10.000 hồ sơ khách hàng trong một danh sách liên kết đơn. > Mặc dù tôi đồng ý với bạn 100% về điều đó, tôi thực sự đã thấy các danh sách được liên kết được sử dụng theo cách đó và được thông báo "không chạm vào nó".
errantlinguist

Mặc dù thông tin tốt, nhưng điều này thực sự không trả lời câu hỏi của tôi về cách làm việc với những người ném đá một cuộc thảo luận vào phút mà nó phải làm với hiệu suất.
errantlinguist

3
Đáng buồn thay, điều "danh sách liên kết đơn" không phải là một ví dụ ngẫu nhiên mà là điều tôi gặp phải.
Gort Robot

1

Bạn có thể làm mọi thứ sai cách, hoặc làm mọi thứ đúng cách.

Thông thường, mọi thứ được thực hiện sai cách và mã được tái cấu trúc để nó được thực hiện đúng cách. Nếu bạn định viết mã mới và bạn biết rằng bạn có thể thực hiện mọi việc đúng cách mà không bị phạt nặng, tôi chỉ sai ở khía cạnh thực hiện đúng cách. (Lưu ý rằng, sau khi thử nghiệm hiệu năng, v.v., một số thứ có thể cần thay đổi - nhưng không sao. Ngoài ra, việc triển khai hoàn toàn ngây thơ hiếm khi, nếu có, đúng.)

Không nhất thiết phải tối ưu hóa sớm nếu bạn a) biết rằng nó sẽ giúp ích trong tương lai hoặc b) biết rằng con đường dưới mức tối ưu sẽ dẫn đến các vấn đề trên đường. Nó giống như một trò chơi cờ vua, thực sự.

Tôi nghĩ rằng mọi người sẽ có xu hướng muốn làm những điều đúng, hơn là làm sai. Sử dụng điều này khi bạn thảo luận về các chiến lược thay thế với các đồng nghiệp của bạn.


5
Không bao giờ có "cách sai" hay "cách đúng". Nhìn chung có vô số cách chạy liên tục từ "Chúa ơi, làm thế nào điều này thậm chí chạy!?" đến "John Carmack và Donald Knuth không thể làm điều này tốt hơn trong khi lập trình cặp".
Gort Robot

@StevenBurnap Điều này đúng. Tuy nhiên, tôi nghĩ rằng đối với cá nhân, nhìn chung có một vài cách đúng và rất nhiều cách sai. . cách tốt nhất, đúng đắn nhất có thể cho bạn . Điều này dẫn chúng ta trở thành những lập trình viên giỏi hơn, trở thành những người đồng đội tốt hơn (cố vấn vấn đề!) Và viết mã tốt hơn.
bữa ăn trưa317

" Tôi nghĩ rằng mọi người sẽ có xu hướng muốn làm những điều đúng, thay vì làm sai " - Vấn đề là, có những ý kiến rất khác nhau về những gì đúng hay sai. Một số thậm chí bắt đầu các cuộc chiến thánh về nó (theo nghĩa đen).
JensG

1

Đây có vẻ như là một vấn đề giao tiếp và không phải là một vấn đề lập trình. Cố gắng hiểu lý do tại sao mọi người cảm thấy cách họ làm và cố gắng kết tinh tại sao bạn nghĩ rằng cách của bạn sẽ tốt hơn. Khi bạn đã làm điều đó, đừng bắt đầu một cuộc tranh cãi mà mục tiêu của bạn là nói cho người khác biết tại sao họ sai và bạn đúng. Giải thích suy nghĩ và cảm xúc của bạn và chỉ để mọi người phản ứng với điều đó. Nếu bạn không thể đạt được bất kỳ sự đồng thuận nào và bạn cảm thấy đây là một vấn đề thực sự quan trọng, thì có lẽ bạn có một số vấn đề nghiêm trọng trong toàn bộ nhóm.

Tập trung hơn vào lập trình thực tế, đừng lãng phí thời gian vào những cuộc tranh cãi dài trên một thứ mà bạn chỉ có cảm giác ruột là "nhanh hơn". Nếu bạn thấy ai đó viết một phương thức được gọi một lần cho mỗi yêu cầu trong ứng dụng web và nó có độ phức tạp về thời gian O (n ^ 2) khi bạn BIẾT thì đó thực sự là vấn đề về thời gian O (log (n)), thì chắc chắn, nếu nó như vậy Không có trí tuệ, đi về phía trước.

Mặc dù vậy, hãy chú ý, vì con người, các lập trình viên của chúng ta rất tệ (và ý tôi là TUYỆT VỜI) khi đoán phần nào trong các ứng dụng của chúng ta sẽ bị nghẽn cổ chai. Eric Lippert viết về chủ đề thú vị này trong bài đăng trên blog này . Luôn ưu tiên bảo trì. Bất kỳ vấn đề hiệu suất nào cuối cùng được tìm thấy sau đó có thể dễ dàng (tốt, tương đối) được khắc phục khi bạn có thêm thông tin.


Tôi chỉnh sửa câu trả lời và bổ sung thêm một chút, liệu downvoter có thể thêm một số phản hồi không? :)
sara

Mặc dù tôi không phải là người đánh giá thấp, đoạn đầu tiên của bạn là giải quyết vấn đề trong tay, nhưng phần còn lại không thực sự trả lời câu hỏi của tôi về cách làm việc với những người ném đá một cuộc thảo luận vào phút mà nó phải làm với hiệu suất (mặc dù nó vẫn là lời khuyên tốt).
errantlinguist

về cơ bản điều tôi muốn tìm hiểu trong hai đoạn cuối là "những tối ưu hóa đó có thể không quan trọng". trong trường hợp đó, tốt hơn là chọn chiến đấu của bạn.
sara
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.