“Erken optimizasyon tüm kötülüğün köküdür” hakkındaki yanlış anlamalar ile nasıl baş edilir?


26

Dogmatik olarak kelimenin genel İngilizce anlamında "optimizasyon" olarak kabul edilebilecek herhangi bir şeye karşı olan birçok insanla karşılaştım ve sık sık "kısmi" alıntı "erken optimizasyon tüm kötülüğün kaynağıdır" Duruşlarının bir gerekçesi olarak, "erken optimizasyon" olmaktan bahsettiğim her şeyi yorumladıklarını ima ediyorlar. Ancak bu görüşleri bazen o kadar gülünç onlar hemen hemen görevden o yerleşik olan herhangi eskisi şeyler yaptığım şekilde en az herhangi bir sapmanın en saf "naif" uygulanmasından algoritmik veya veri-yapı sapmaların türlü ... ya.İnsan böyle bir yaklaşıma "performans" veya "optimizasyon" hakkında bir şeyler duyduktan sonra tekrar “kulaklarını açmaları” için nasıl yaklaşabilir? İnsanları anında düşünmeden performans üzerinde etkisi olan bir tasarım / uygulama konusunu nasıl tartışabilirim: "Bu adam iki haftayı on satırlık kod üzerinde geçirmek istiyor?"

Şimdi, "tüm optimizasyon prematüre ve bu nedenle kötüdür" olsun ya da olmasın tavrı vardır zaten burada örtülü yanı sıra Web'in diğer köşelerinde ve zaten tartışıldı optimizasyon prematüre ve bu nedenle kötü olduğunda bunu fark nasıl , ama Maalesef, gerçek dünyada hala Anti-Optimizasyon’a olan inancındaki zorluklara açık olmayan insanlar var.

Önceki girişimler

Birkaç kez, "erken optimizasyonun kötü olduğu" ↛ "bütün optimizasyonların kötü olduğunu" açıklamak için Donald Knuth'dan tam teklif vermeyi denedim.

Küçük etkinlikleri unutmalıyız, zamanın% 97'sini söyleyelim: erken optimizasyon tüm kötülüklerin köküdür. Yine de, bu kritik% 3'teki fırsatlarımızı kaçırmamalıyız.

Ancak, teklifin tamamını verirken, bu insanlar bazen benim yaptığım şeyin Prematüre Optimizasyon ™ olduğuna inanıyor ve kazıp dinlemeyi reddediyorlar. Neredeyse "optimizasyon" kelimesi onları korkutuyormuş gibi: Birkaç kez, "optimizasyon (e | ation)" kelimesini kullanmaktan kaçınmak suretiyle veto etme olmadan gerçek performans iyileştirici kod değişiklikleri önerebildim. ve "performans" - bu kelime de korkutucu) ve bunun yerine "alternatif mimari" veya "gelişmiş uygulama" gibi bir ifade kullanmak. Bu sebepten dolayı, gerçekten bunun gerçekten dogmatizm olduğu anlaşılıyor ve aslında söylediklerimi eleştiren bir değerlendirme yapmıyorlar ve daha sonra gerekli ve / veya çok masraflı olarak reddediyorlar.


10
Eh, böyle bir tartışma vardı son kez, gerçekten mi ölçmek performans saf, naif uygulama ile kötü olacağını? Ya da en azından beklenen çalışma süresi hakkında kabaca bir tahmin yaptınız mı? Olmazsa, bu diğer insanlar düşünceleri ile tam olarak doğru olabilirlerdi, bilmenin yolu yok.
Doktor Brown

12
@ errantlinguist: Eğer program gerçekten "pekmez kadar yavaş" ise, o zaman açıkça Knuth'un “bu kritik% 3” ünü kolayca tespit edebilmeniz ve bu nedenle onu optimize etmeyle ilgili herhangi bir tartışmaya değinmeniz gerekir. Ve eğer bunu tespit edemezseniz ... o zaman ödevinizi henüz yapmadınız ve henüz optimizasyona hazır değilsiniz. Yani sorunun nerede olduğu belli değil.
Nicol Bolas

6
@errantlinguist: Bu kod bölümünün başvuru için önemli bir performans sorunu olduğuna dair kanıt sunmuşsanız ve başvuru bir bütün olarak olması gerekenden daha yavaştı ve yine de kodu değiştirme gereğini reddetti. önemli değil. Kanıta dayalı muhakeme geçirmeyen ve bu nedenle mantıksız olan insanlarla uğraşıyorsunuz.
Nicol Bolas

6
@ errantlinguist: Anahtar soru: Müşteriler bu alandaki uygulamanın yavaş olduğundan şikayet ediyorlar mıydı ?
Robotu Gort

5
Kapatmak için oy kullanıyorum çünkü OP açıkça gerçek bir sorunun cevabını değil bir görüşü doğrulayacak birini arıyor. Bunun Workplace’te açık kalacağını (veya olması gerektiğini) sanmıyorum.
BlueRaja - Danny Pflughoeft

Yanıtlar:


35

İlk önce "en saf saf uygulama" nı denememek için kısayollar arıyor ve doğrudan "daha karmaşık bir çözümü uygulamaya koyuyorsun, çünkü daha önce saf uygulamanın işe yaramayacağını biliyorsun". Ne yazık ki, bu nadiren işe yarayacak - saf uygulamanın ya da çok yavaş olacağını kanıtlamak için zor gerçekleriniz ya da teknik argümanlarınız olmadığında, muhtemelen yanılıyorsunuz ve ne yapıyorsunuz ? prematüre optimizasyonu. Ve Knuth ile tartışmaya çalışmak zor bir gerçeğin tam tersidir.

Tecrübelerime göre, ya kurşunu ısırmanız ve ilk önce "naif uygulamayı" denemelisiniz (ve bunun ne kadar hızlı olduğu muhtemelen şaşırırsınız) ya da en azından çalışma zamanı hakkında kaba bir tahmin yaparsınız:

"Saf uygulama O (n³) olacak ve n 100.000'den büyük olacak; birkaç gün sürecek, o kadar saf olmayan uygulama ise sadece birkaç dakika sürecek olan O (n) 'de çalışacak" .

Sadece elinizdeki bu argümanlarla, optimizasyonunuzun erken olmadığından emin olabilirsiniz.

IMHO'nun tek bir istisnası var : hızlı çözüm aynı zamanda daha basit ve daha temiz olduğunda, en başından daha hızlı çözümü kullanmalısınız. Standart örnek, aramalar için gereksiz döngü kodundan kaçınmak için liste yerine bir sözlük kullanmak veya tam olarak olması gereken büyük bir sonuç yerine tam olarak ihtiyaç duyduğunuz bir sonuç kaydını veren iyi bir SQL sorgusu kullanmaktır. koddan sonra filtrelenir. Böyle bir durum varsa, performans hakkında tartışmayın- performans ek olabilir, ancak büyük olasılıkla alakasız bir fayda olabilir ve sizden bahsettiğinizde, insanlar size karşı Knuth'u kullanmaya başlayabilirler. Okunabilirlik, daha kısa kod, daha temiz kod, bakım kolaylığı - burada herhangi bir şeyi "maskelemeye gerek yok", ancak bunlar (ve sadece bunlar) burada doğru argümanlar olduğu için tartışın.

Tecrübelerime göre, ikinci durum nadirdir - daha tipik olan durum, ilk önce daha karmaşık, fakat muhtemelen daha hızlı olandan daha iyi anlaşılabilir ve daha az hataya eğilimli basit, naif bir çözüm uygulayabilir.

Ve tabii ki, hangi performansın kabul edilebilir olduğunu ve kullanıcılarınızın gözünde işler çok yavaşlaştığında, bilmeniz gereken şartları ve kullanım durumunu iyi bilmelisiniz. İdeal bir dünyada, müşteriniz tarafından resmi bir performans göstergesi elde edersiniz, ancak gerçek dünya projelerinde, gerekli performans genellikle gri bir alandır, kullanıcılarınızın yalnızca programın üretimde "çok yavaş" davrandığını not ettikleri zaman söyleyeceği bir şeydir. Ve çoğu zaman, bir şeyin ne kadar yavaş olduğunu öğrenmenin tek çalışma yolu budur - kullanıcı geri bildirimi ve ardından takım arkadaşlarınızı "saf uygulamalarının" yeterli olmadığına ikna etmek için Knuth'tan alıntı yapmanız gerekmez.


15
@ errantlinguist: belki kendimi netleştirmedim mi, yoksa duymak istediğim şey bu değil mi? Benim tavsiyem:..% 3 'veya '% 97' "hakkında Knuth ait' * kullanarak felsefi argümanları kalkma olgusal tutun, aksi takdirde meslektaşları büyük ihtimalle sağ performans argümanlar uygunsuz olduğunu vardır
Doktor Brown

4
@ errantlinguist: Karl Bielefeld'in cevabına yaptığınız yorumda açıklamanız durumunda, “performans” kullanmanıza gerek kalmadan sizin yanınızda tüm argümanlarınız var gibi görünüyor. Bir adım daha ileri gideceğim ve eğer böyle bir durumda performans hakkında tartışırsanız, çok büyük bir hata yaptığınızı söyleyeceğim, çünkü meslektaşlarınız haklı: performans genellikle orada önemli değil. Sadelik, okunabilirlik, bakım kolaylığı, daha az kod satırı, ancak bir not olarak değil, performans hakkında (!) Tartışmayın. Onlara Knuth'u size karşı kullanma imkanı sunmayın.
Doktor Brown,

2
@ errantlinguist: gömme - bu yönlere odaklanılması gerektiği doğru olduğunda bu yönlere odaklanın ve son kullanıcı için önemli bir fark yarattığını ispatlayamazsanız performansı argüman olarak kullanmayın .
Doc Brown

2
@ errantlinguist: Bu sonuca nasıl ulaştığınızdan emin değilim. Doktor Brown'un cevabı çok net görünüyor: meslektaşlarınızla olan verimsiz iddiaları, performansın neyin kabul edilemez olduğu hakkındaki gerçek ifadelere uyarak kesin.
jl6

1
Bu, küçük programlama için iyi bir tavsiyedir, ancak mimari tasarım seviyesindeki performans sorularını göz ardı etmek, uzun bir çıkmazdan aşağıya bir takıma yol açabilir, çünkü sorunla yüzleşmeden önce çok şey yapılabilir. ve sorunun mimari olduğu zaman bu işin çoğunun tekrar kullanılabileceğinin garantisi yoktur (bir ürünü öldürdüğünü gördüm.) Cevabınızda bir istisna olduğunu biliyorum, ancak bunun geçerli olup olmadığını bilmek için hala soruyu sormak zorundasınız. ve hatta soruyu sormak bile açıkça görünüşte iş arkadaşlarının yanıltıcı bir biçimde işine yaramadı.
sdenham,

18

Kendine şunu sor:

  • Yazılım performans şartlarını karşılamıyor mu?
  • Yazılım performans sorunu mu var?

Bunlar optimize etmek için sebepler. Öyleyse, eğer insanlar karşı çıkıyorsa, sadece şartnameyi gösterin ve onlara geri dönün ve şartlara uymadığımız için optimize etmemiz gerektiğini açıklayın. Bunun dışında, bir başkası, optimizasyonun gerekli olduğu konusunda ikna etmek zor olacaktır.

Bence, teklifin asıl amacı, eğer bir sorununuz yoksa, zaman ve enerjinin başka bir yerde harcanabilmesi için gereksiz optimizasyon yapmamaktır. Bir iş dünyasından, bu mükemmel bir anlam ifade ediyor.

İkincil, optimizasyondan korkanlar için, performans bulgularını her zaman ölçümlerle yedekleyin. Kod ne kadar hızlı? Performans öncekine göre ne kadar gelişti? Biri önceki sürüme göre sadece% 2 oranında kodu geliştirmek için iki hafta harcarsa, patronun olsaydım mutlu olmazdım. Bu iki hafta, daha fazla müşteri çekebilecek ve daha fazla para kazanabilecek yeni bir özellik uygulamak için harcanabilirdi.

Son olarak, çoğu yazılımın yüksek düzeyde optimize edilmesi gerekmez. Sadece birkaç özel sektörde hız gerçekten önemlidir. Böylece, çoğu zaman iyi bir etki için önceden var olan kütüphaneleri ve çerçeveleri kullanabilirsiniz.


4
İyi bir bilgi olsa da, bu aslında performansla ilgili bir tartışmayı sarkan insanlarla nasıl çalışılacağı konusundaki sorumu cevaplamıyor.
errantlinguist

7
Tüm bunlara katılıyorum, "Sadece birkaç özel sektörde hız gerçekten önemlidir." Müşterinin bakış açısından performans sorunları olan yazılım miktarını hafife aldığınızı düşünüyorum.
Robot'a Gort

@StevenBurnap: Evet, vahşi doğada gerçekten yavaş olmayan web uygulamaları var mı? - Birini aynı bilimde görmek isterim.
errantlinguist

1
google.com oldukça hızlı. :-P
Robot'a Gort

Bir EDGE mobil bağlantısında google.com'u kullanmayı deneyin. Evet, bu çok saçma bir durum, ama kesinlikle çok hızlı olmayacak . ;) (Pun aslında tasarlanmadı-- gerçekten)
errantlinguist

7

Performansla ilgili olduğu anda bir tartışmayı duvardan çıkaran kişilerle nasıl çalışılır?

Grubunuzun stratejik yönünü temel alan ortak ilkelerle başlayın.

İlkelerim:

Kod yazma konusundaki kişisel ilkelerim önce programımda doğruluğu hedeflemektir, sonra onu profillendirmek ve optimizasyona ihtiyaç duyup duymadığını belirlemektir. Kodumu kendim profillerim çünkü diğer programcılar kodumun potansiyel tüketicileridir - ve eğer yavaşsa kullanmazlar - kodum için hız bir özelliktir.

Tüketicileriniz müşteriyse, müşterileriniz size daha hızlı koda ihtiyacınız olup olmadığını söyleyecektir.

Bununla birlikte, kodda yapılabilecek bilinen ve gözle görülür şekilde daha iyi seçimler vardır. Birkaç nedenden dolayı ilk taslağımda doğru yapmayı tercih ederim:

  1. İlk seferinde doğru yaparsam, uygulamayı (bilginin gizlenmesinden faydalanarak) unutabilirim ve kodumu TODO'larla karıştırmam.
  2. Diğerleri (özellikle yalnızca işi öğrenen kişiler) doğru şekilde yapıldığını görürler ve ileriye doğru giden aynı stil kodunu öğrenir ve kullanırlar. Tersine, beni yanlış şekilde yaptıklarını görürlerse, yanlış da yaparlar.

Optimizasyon ihtiyacının doğru olduğunu varsaymak

Bunun, optimizasyon gerektiren kodunuzun gerçekten önemli bir parçası olduğunu varsayarsak, Ressam Schlemiel'in ressamını söyleyebilir veya alıntıların geri kalanını vurgulayabilirsiniz:

“Programcılar, programlarının kritik olmayan kısımlarının hızını düşünerek veya endişelendirip çok fazla zaman harcarlar ve bu verimlilik girişimleri, hata ayıklama ve bakım dikkate alındığında gerçekte güçlü bir olumsuz etkiye sahiptir. Zamanın% 97'si: erken optimizasyon tüm kötülüklerin kökenidir. Ancak bu kritik% 3'teki fırsatlarımızı kaçırmamalıyız. ” - Donald Knuth

Ek karmaşıklık maliyetlerini tartın

Bazen ilave karmaşıklığın korunması açısından gerçek bir maliyet söz konusudur. Bu durumda, ikincil uygulamayı farklı bir fonksiyonda veya alt sınıfta tutabilir ve aynı en uygunları uygulayarak doğru olduğuna dair hiçbir soru olmayabilir. Daha sonra, kodunuzu profillerseniz ve naif uygulamanın tıkanıklık olduğunu tespit ederseniz, optimize edilmiş kodunuzu değiştirebilir ve programınızı belirgin bir şekilde iyileştirebilirsiniz.

Liderlik

Bazen sorun ego'dur - bazı insanlar bir başkasının olduğundan daha doğru olması yerine suboptimal veya buggy kodunu kullanırlar. Muhtemelen bu insanlarla çalışmaktan kaçınmak istersiniz.

Liderlik, özellikle insanlar üzerinde konumsal bir yetkiniz olmadığında, makul önerilerde bulunmak ve başkalarını bir fikir birliğine yönlendirmekle ilgilidir. Ekibinizi bir zihniyet toplantısı için yönlendiremezseniz, belki de sorun baskı yapmaya değmez. Kızartılacak daha büyük balık var.


6

İlerlemenin yolu, gerçek alıntıyı ve çeşitli yorumları unutmaktır - bu dogmatizm, bir gurunun özel bir alıntıya bu kadar odaklanmanın bir yoludur. Zaten Knuth zaten her zaman haklıdır diyor?

Bunun yerine eldeki projeye odaklanın, birlikte çalıştığınız meslektaşlarınızla birlikte geliştirmekte olduğunuz yazılım parçası. Bu yazılım parçası için kabul edilebilir performans için gereksinimler nelerdir ? Bundan daha mı yavaş? Ardından optimize edin.

"Optimizasyon" olarak adlandırmanız gerekmiyor, "bir hatayı düzeltmek" diyebilirsiniz, çünkü uygulama gereksinimlere uymazsa tanım gereği bir hatadır.

Daha genel olarak, optimizasyonlarla ilgili iki olasılık vardır:

  1. Optimize edilmiş kod ayrıca daha kısa, anlaşılması daha basit ve bakımı kolaydır.

  2. İyileştirilmiş kodun anlaşılması daha karmaşık, yazılması ve test edilmesi daha uzun sürüyor ya da gereksinimler beklenmedik şekillerde değişirse gelecekte değişmesi daha karmaşık olurdu.

Eğer durum (1) ise, optimizasyon hakkında tartışmak zorunda bile değilsiniz. Fakat eğer (2) durum böyle ise, takas kararıyla uğraşıyorsunuz demektir. Bu aslında işletme düzeyinde bir karardır, tamamen teknik bir karar değildir. Optimizasyonun maliyetini avantaja karşı tartmanız gerekir. Bir avantajın olması için bile, verimsizliğin, ilk başta, kötü kullanıcı deneyimi veya donanım veya diğer kaynakların maliyetini önemli ölçüde artıran bir sorun olması gerekir.


İlk cümlenizi tamamen kabul ediyorum. Bununla birlikte, bir yazılım parçasının, açıkça resmi bir şekilde belirtilen performans gereksinimlerine sahip olmadan, "amaçlanan kullanım durumu için can sıkıcı derecede yavaş" olabileceğinden eminim.
Doktor Brown

@DocBrown: Elbette, ancak her durumda geliştiriciye değil çok yavaş olup olmadığına karar veren müşteridir.
JacquesB

Performans gereksinimlerini açıkça belirten iş gereksinimlerine hiç rastlamadım.
errantlinguist

@ errantlinguist: Benim tecrübeme göre, çevrimiçi mağazalar gibi müşteri odaklı işletmelerde oldukça yaygındır. Ancak bir şirkette dahili kullanım için araçlar ve uygulamalar için, kullanıcı deneyimi genellikle proje sahibi için bir endişe değildir.
JacquesB

4

Bence bağlamdaki tam alıntı öğreticidir. Konuyla ilgili Reddit'te yaptığım bir yayından kopyalayacağım:

Kuşkusuz verimlilik kazancının suiistimallere yol açtığına şüphe yok. Programcılar, programlarının kritik olmayan bölümlerinin hızını düşünerek veya endişelendirip çok fazla zaman harcarlar ve bu verimlilik denemeleri, hata ayıklama ve bakım dikkate alındığında gerçekten olumsuz bir etkiye sahiptir. Küçük etkinlikleri unutmalıyız, zamanın% 97'sini söyleyelim: erken optimizasyon tüm kötülüklerin kökenidir.

Yine de, bu kritik% 3'teki fırsatlarımızı kaçırmamalıyız. İyi bir programcı, böyle bir nedenden ötürü aciklik içinde kaybolmayacak, kritik koda dikkatlice bakmak akıllıca olacaktır; ancak bu kod tanımlandıktan sonra.

- Donald Knuth, İfadelerle Yapısal Programlama , ACM Hesaplama Anketleri, Cilt 6, Sayı 4, Aralık 1974, s.268

Mesele ve uygulama, dikkatinizi optimizasyona çok erken sokmaktan daha endişe edilmesi gereken daha önemli şeyler olduğu yönünde. Kuşkusuz, veri yapılarınızı ve algoritmalarınızı dikkatlice düşünmelisiniz (bu% 3'tür), ancak çıkarma işleminin modulo'dan daha hızlı olup olmadığı konusunda endişelenmemelisiniz (bu% 97'dedir) gerekli.

İlki, meslektaşlarınızın düşündüğü anlamda mutlaka optimizasyon değildir, ancak kötü seçilmiş algoritmalar ve veri yapılarının yetersiz kalması anlamında optimizasyondur .


2
Birisi Knuth'un, algoritmaların zaman karmaşıklığını analiz etmenin ve tasarım seçimlerini bu temelde yapmanın erken optimizasyon olduğunu açıkça düşünmediğini ekleyebilir.
sdenham,

3

Tecrübelerime göre, düzenli olarak optimizasyona karşı böyle bir muhalefet alırsanız , insanlar gerçekten optimizasyondan şikayet etmiyorlar. Optimizasyon adına neleri feda ettiğinizden şikayet ediyorlar. Bu genellikle okunabilirlik, bakım yapılabilirlik veya zamanlamadır. Kodunuz aynı miktarda ve aynı zamanda anlaşılması kolay bir şekilde verilirse, daha verimli veri yapıları ve algoritmaları kullanıyorsanız insanlar daha az umursayamazlardı. Bu durumda benim önerim, kodunuzu daha şık ve sürdürülebilir hale getirmek için çalışmak.

Başkalarının kodu ile ilgili olarak bu tür bir muhalefet alıyorsanız, bunun nedeni genellikle önemli miktarda yeniden işleme önerdiğinizdir. Bu gibi durumlarda, harcadığınız emeğe değer olduğunu göstermek için bazı gerçek ölçümlere ihtiyacınız var veya kod yazılmadan önce tasarım aşamasında daha önce yer almaya çalışın. Başka bir deyişle,% 3 olduğunu kanıtlamanız gerekir. Tam olarak bizim istediğimiz gibi olmayan tüm kodları tekrar yazarsak, hiçbir zaman başarılı olamayız.


Ne yazık ki, tam tersini yaptım, burada örneğin DequeJava standart kütüphanesinden bir ArrayListkod kullanarak çalışırken bir yığın olarak kullanılan çok sayıda mantığı değiştirmek için kullandım ... ve bu incelemede değişiklik. Başka bir deyişle, gözden geçiren, aşina olmadığı için daha yavaş ve daha fazla hataya meyilli olduğu için daha fazla koda sahip olmak istedi Deque.
errantlinguist

3
10 yıldır kendi dilinizde olan bir şeyi öğrenmek için isteksiz olmak bir programcı için toksik bir tutumdur ve başlangıçta tanımladığınızdan çok daha derin bir sorundur. Şahsen, bu durumda tavsiyeyi reddeder ve gerekirse yönetime iletirim.
Karl Bielefeldt

5
@ errantlinguist: gözden geçiren kişi temiz ve basit bir çözümün yerine geçen net bir şekilde daha kötü (daha karmaşık anlamına gelir) bir çözüm önerdiğinde, bunu tartışmalısınız. Performans hakkında tartışmayın! Cidden, bu tartışmada asla "performans" kelimesini bile kullanmayın. Sadece okunabilirlik ve sürdürülebilirlik hakkında tartış. Gözden geçiren kişi kötü kodunda ısrar ederse, yükselir.
Doktor Brown,

+1 Bu cevabın neden artı oylar yerine artı oylar olduğundan ve kabul edilen cevap olmaktan emin değil. Hem sorunu ele almanın bir yolunu hem de asıl temel sorunun ne olabileceğinin bir analizini önerir (yani, kimsenin koduna kökten yeniden yazılması gerektiğini söylemek istemez).
Andres F.

2

Bu alıntıyla ilgili gerçekten birçok yanlış anlaşılma var, bu nedenle geri adım atmak ve asıl sorunun ne olduğuna bakmak en iyisidir. Sorun o kadar da değil, "optimize etmemelisin". Bu "optimize etmek" asla yapmanız gereken bir görev değildir. Asla sabahları uyanmamalı ve kendi kendinize "hey, bugün kodu optimize etmeliyim!" Demelisiniz.

Bu boşa harcanan çabalara yol açar. Sadece koda bakıp "Daha hızlı başarabilirim!" Diyerek. İlk etapta yeterince hızlı olan bir şeyi daha hızlı yapmak için büyük çaba harcar. Dört kat daha hızlı bir kod yazdığınızı kendinize söylemekten gurur duyabilirsiniz, ancak bu kod bir düğmeye basıldığında gerçekleşen bir hesaplamadıysa ve ilk önce bir insan kullanıcısına göstermeden önce 10 saniye umurumda olacak.

Bu "erken optimizasyon" daki "erken" dir. Ne zaman "erken" değil? Müşteriler size “bu çok yavaş, düzeltin!” Deyince. Bu, kodu girip daha hızlı hale getirmeye çalıştığınız zamandır.

Bu, beyninizi kapatmanız gerektiği anlamına gelmez. Bu, tek bir bağlantılı listede 10.000 müşteri kaydını tutmanız gerektiği anlamına gelmez. Yaptığınız şeyin performans üzerindeki etkilerini her zaman anlamalısınız ve buna göre davranmalısınız. Fakat fikir şu ki, bunu daha hızlı yapmak için kasıtlı olarak fazladan zaman harcamak istemiyorsunuz. Sadece eşit seçeneklerden daha performanslı bir seçim seçiyorsunuz.


Bu, beyninizi kapatmanız gerektiği anlamına gelmez. Bu, tek bir bağlantılı listede 10.000 müşteri kaydını tutmanız gerektiği anlamına gelmez. > Bu konuda% 100 sizinle aynı fikirdeyken, aslında bu şekilde kullanılan bağlantılı listeler gördüm ve “dokunmama” dendi.
errantlinguist

İyi bilgi olsa da, bu aslında performansla ilgili bir tartışmayı sarkan insanlarla nasıl çalışılacağı konusundaki sorumu cevaplamıyor.
errantlinguist

3
Ne yazık ki, "tek tek bağlantılı liste" olayı rastgele bir örnek değil, kişisel olarak karşılaştığım bir şeydi.
Robot'a Gort

1

Bazı şeyleri yanlış ya da doğru şekilde yapabilirsiniz.

Genellikle, işler yanlış bir şekilde yapılır ve kod doğru şekilde yapılır, böylece doğru şekilde yapılır. Yeni bir kod yazacaksanız ve önemli bir ceza vermeden işleri doğru şekilde yapabileceğinizi biliyorsanız, sadece doğru şekilde yapmanın yanına gelebilirim. (Performans testinden sonra vb. Bazı şeylerin değişmesi gerekebileceğini unutmayın - ama sorun değil. Alternatif olarak, tamamen saf bir uygulama nadiren olsa bile, doğru olur.)

A) Gelecekte yardımcı olacağını biliyorsanız veya b) suboptimal yolun yolda sorunlara yol açacağını bilirseniz, erken optimizasyon olması gerekmez. Gerçekten bir satranç oyunu gibi.

İnsanların yanlış yapmak yerine işleri doğru yapmak istediklerini düşünüyorum. Alternatif stratejileri meslektaşlarınızla tartışırken bunu kullanın.


5
Asla "yanlış yol" ya da "doğru yol" yoktur. Genel olarak, “Tanrım, bu nasıl çalışıyor!” Diye devam eden bir süreçte sonsuz sayıda yol vardır. "John Carmack ve Donald Knuth, ikili programlama sırasında bunu daha iyi hale getiremedi".
Robot'a Gort

@StevenBurnap Bu doğru. Ancak, bireyler için genellikle birkaç doğru yol ve bir sürü yanlış yol olduğunu düşünüyorum. (Daha iyi programcılar olduktan sonra, bu spektrum değişmeye başlar - eski "doğru yollarımız" bazen yeni "yanlış yollarımız" olabilir, yeni doğru yollarımız eskilerden daha iyidir.) Bence işleri yapmanın iyi olduğunu düşünüyorum. Sizin için mümkün olan en iyi, en doğru yol . Bu daha iyi programcılar olmamıza, daha iyi takım arkadaşları olmamıza (mentorluk meseleleri!) Ve daha iyi kod yazmamıza yol açar.
öğle yemeği317,

İnsanların yanlış yapmak yerine işleri doğru yapmak istediklerini düşünüyorum ” - Sorun , doğru ya da yanlış ne olduğu konusunda çok farklı görüşler olması. Hatta bazıları kutsal savaşlara (kelimenin tam anlamıyla) başlar.
JensG

1

Bu bir iletişim problemi gibi görünüyor, programlama problemi değil. İnsanların neden böyle hissettiğini anlamaya çalışın ve neden daha iyi olacağını düşündüğünüzü kristalize etmeye çalışın. Bunu yaptığınızda, amacınızın başkalarına neden yanlış olduklarını ve haklı olduğunuzu söylemektir. Düşüncelerinizi ve duygularınızı açıklayın ve insanların buna tepki vermesine izin verin. Herhangi bir fikir birliğine varamazsanız ve bunun gerçekten kritik bir sorun olduğunu düşünüyorsanız, o zaman takımda genel olarak ciddi sorunlarınız olabilir.

Daha çok gerçek programlamaya odaklanın, sadece bir "daha hızlı" hissine sahip olduğunuz bir şey için uzun argümanlarla zaman kaybetmeyin. Bir web uygulamasında istek başına bir kez çağrılan bir yöntem yazan birini görürseniz ve gerçekten bir O (log (n)) zaman problemi olduğunu bildiğiniz zaman O (n ^ 2) zaman karmaşıklığı vardır, öyleyse emin olun. beyinsiz, devam et.

Yine de, insanlar olarak, programcılarımızın uygulamalarımızın hangi bölümlerinin darboğaz olacağını tahmin etmekte gerçekten kötü olduklarını (ve AWFUL'yi kastediyoruz) farkındayız. Eric Lippert, bu blog yazısında bu ilginç konu hakkında yazıyor . Daima bakım kolaylığı. Sonunda bulunan performans sorunları, daha fazla bilgiye sahip olduğunuzda kolayca (iyi, nispeten) düzeltilebilir.


Cevabı düzenledim ve etleri biraz daha fazla çıkardım, müteahhit biraz geri bildirim ekleyebilir mi? :)
sara

Olumsuz olan olmamasına rağmen, ilk paragrafınız eldeki soruyu ele almakta göze çarpıyor, ancak gerisi aslında performansla ilgili bir tartışmayı durduran kişilerle nasıl çalışılacağı konusundaki sorumu yanıtlamıyor. (Her ne kadar hala iyi bir tavsiye olsa da).
errantlinguist

temelde son iki paragrafta aşmak istediğim şey “bu optimizasyonların bile önemi olmayabilir”. Bu durumda, kavgalarını seçmek daha iyi.
sara,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.