Hesaplama karmaşıklığı kavramı yazılım geliştiricileri için önemli mi? [kapalı]


11

Compsci dersleri mezunları için zaman ve bellek karmaşıklığı kavramlarının bir zorunluluk olduğu izlenimindeydim, ancak mühendisliği inceledikten sonra durumun bu olduğu konusunda hiçbir bilgim yok. Kısa bir süre önce, yerel bir kolejden kavramı bile bilmeyen bazı mezunlarla röportaj yapmak beni şaşırttı. Sanırım sorum şu:

Hesaplama karmaşıklığı kavramı yazılım geliştiricileri için önemli mi? Ve lisans derslerinde öğretilmeli mi?


1
Soruyu bir örnek kullanarak açıklamak için: Karşılaştığım mezunlar ne O(n^2)anlama geldiğini bilmiyorlar .
Muhammed Alkarouri

Yanıtlar:


12

Çoğu üniversitede, (umarım!) Zaman ve hafıza karmaşıklığının kesinlikle derslerinin bir parçası olduğunu varsayıyorum.

Şimdi, bu "karmaşıklıklar" çok esnek bir konudur. İnsanların tüm teoriyi gerçekten bilmeleri gerekip gerekmediği gibi: "ZPP, polinom zamanında olasılıklı bir Turing makinesinde sıfır hata ile çözülebilen karar problemlerinin karmaşıklık sınıfıdır." ve bu tür şeyler tartışmalıdır. Ben şahsen bu gelişmiş teorileri yazılım geliştirme ile ilgisiz olarak değerlendiriyorum.

Tersine, her geliştiricinin kullandıkları veri yapılarının ve algoritmalarının zaman / alan karmaşıklığından haberdar olması gerektiğini düşünüyorum.


8

Yeni başlayanların çoğu mikro-optimizasyon saplantısından muzdariptir. Öğrenme komp. karmaşıklık, deneyimlerime göre öğrencileri performans ve ölçeklenebilirliği tahmin etmenin çok daha pratik bir yoluna yönlendirir.


6

Gördüğüm kadarıyla, resmi bilgisayar bilimleri eğitiminde big-O notasyonu ve zaman ve bellek karmaşıklığı çok vurgulanıyor gibi görünüyor ... kendi kendine öğretildiği halde, bu algı bu tür eğitimlere sahip insanların duyma ve okumaya dayanmaktadır. söyle ve yaz.

Genel fikirlerin ve kavramların önemli olduğuna inanmama rağmen, iletişim amaçları dışında bunun (büyük-O notasyonu ve çeşitli terminoloji gibi) resmileştirilmesinin neredeyse önemli olduğuna inanmıyorum. Birisi resmi gösterim ve terminolojiye aşina olmadığı için, belirli bir durumda bir algoritmanın diğerinden daha hızlı nasıl ve neden daha hızlı olacağını göremeyeceği anlamına gelmez. İnsanlar dengeli bir ikili ağaç aramak için geçen sürenin, herhangi bir biçimsel anlamda karmaşıklık teorisini ilk önce öğrenmeden düğüm sayısının taban-2 logaritması ile ilişkili olduğunu görebilirler, eğer ağacın nasıl çalıştığını anlarlar ve makul bir yüksek seviyeye sahiplerse okul matematik. Ne zaman karmaşıklığa ve bellek kullanımına dikkat etmeyi bilmek ve tipik ve en kötü durumları düşünmek önemlidir ... ancak bazı insanlar bunu yapmaz.

Gösterim ve terminoloji iletişim için önem kazanır. Bir algoritmanın performansının bir miktarını bir başkasına iletmek için güzel bir yol verirler. Sık sık makalelerde ve açıklamalarda yer aldığından, en azından belirsiz bir anlayışa sahip olmak daha kolay olur.

Bu yüzden evet, kavramlar önemlidir (ancak kaynaklar ve zaman yeterli olduğunda ancak veriler yeterli olmadığında). Ancak kavramlar önemli olsa da, bunların resmileştirilmesi genellikle o kadar önemli değildir - ve notasyon ve terminolojinin kavramların kendileriyle aynı olmadığını hatırlamak gerekir.

Düzenle:

Kavramları resmi olarak çalışmış biri kadar ayrıntılı olarak anladığımı iddia etmem, ancak genel fikirlerin çoğu mantıklı. Bunu resmi olarak incelemede bir değer olduğunu düşünüyorum, ama bu değerin bir kısmı hala var olmadan var olabilir.

Kavramları (resmi çalışma dışında) tanıtmaya gelince, iyi bir başlangıç, insanları veri yapılarının ne kadar bellek yükü olduğunu, algoritmaların hangi adımları içerdiğini ve bunların farklı verilerle nasıl değiştiğini düşünmeye teşvik etmek olduğunu düşünüyorum.

Ayrıca, bir ağacın dengeli olması durumunda ne olacağı ve mümkün olduğu kadar dengesiz olması durumunda ne olacağı ya da çoğu düğümün ağaçta kaç seviye olacağı veya kaç tane daha düğüm olabileceği gibi varsayımsal durumları ve değişiklikleri göz önünde bulundurmaya yardımcı olur. derinlik bir seviye artırılırsa tutun. Bu düşünme şekli, sadece karmaşıklığa bakarken değil, programcılar için genellikle yararlıdır; ve algoritmaların ve veri yapılarının farklı koşullar altında nasıl performans gösterdiğini düşünmeye uygulanırsa, doğal olarak karmaşıklığın daha resmi bir incelemesiyle aynı yönü gösterir.


İlginç bir alternatif görünüm. Kavramları nasıl tanıtacağınızı açıklayabilir misiniz? Ya da onları nasıl anladınız? Bu, gerekli anlayışı elde etmenin alternatif bir yoluna işaret edebilir.
Muhammed Alkarouri

1
@MuhammadAlkarouri Buna biraz cevap vermek için cevabımı düzenledim.
Dmitri

4

Evet

Karmaşıklığın temellerini anlamak önemlidir ve bir lisans olarak öğrendiğiniz bir şey olmalıdır. Aslında, hangi sınıfta veri yapıları hakkında bilgi verirse genellikle ona değindiğini düşünüyorum. Mezunları anlamadığını ya da hatırlamadığını anlayabiliyorum, ancak onlara karmaşıklığın temelleri öğretilmediklerini göremiyorum.

Güncelleme: Neden Önemli?

Belirli bir işte veritabanı geçişindeydim. Göçün ne zaman yapılması gerektiğine dair bir son teslim tarihimiz vardı. Senaryoyu yazan kişinin karmaşıklıkta bir temeli yoktu. Ne yazık ki, hiç kimse senaryoda kullandığı mantığa yakından bakmadı. Bir hashtable yerine iki kat iç içe döngü kullandığı dışındaki özellikleri hatırlamıyorum. Senaryoyu sürekli çalıştıran bir hafta sonra mantığa baktık, sorunu fark ettik. Değişiklikten sonra tamamlanması 5 saat sürdü. Karmaşıklığı anlamayan birinin sonucu olarak göçün tamamlanma tarihini neredeyse kaçırdık.

Mesele şu ki, büyüklük dereceleri daha yavaş olan veya iş tamamlanmadan önce her zaman bellek tükenecek bir şey yapmak kolaydır. Daha fazla belleğe sahip daha hızlı makineler küçük hataları azaltabilirken, genellikle karmaşıklık sorunlarını azaltamazlar.


Ama yine de, soru "önemli mi?" Çünkü çiftler listesi üzerinde tekrar etseler bile, bu son ürünün ne yapması gerektiği anlamına gelmiyor mu? Bu yavaş olduğu anlamına mı geliyor? Yapmaları için ödenen işi yapmadığı anlamına mı geliyor?
Yam Marcovic

Programın 2 gün içinde bitmesi gerekiyorsa, bunun yerine 2 yıl sürecekse, yapmaları için ödenen işi yapamadıklarını söyleyebilirim.
dietbuddha

Açıkladığınız sorun, zayıf geliştiricinin bir sorunu değil, karar verme sürecinde kalifiye olmayan bir programcının böyle bir programdan sorumlu olmasına neden olan bir problemdi.
Yam Marcovic

Ya da belki de "jr. Yazılım geliştiricisi" veya "stajyer" yerine "yazılım geliştiricisi" olarak programlanması için kalifiye olmayan birini işe almaya götüren bir karar verme süreci.
dietbuddha

3

Bunun "önemli olup olmadığını" sormak oldukça belirsiz buluyorum.

Birçok insanın, bu dünyadaki her küçük bilgi parçasının kendi görüşlerine göre nasıl gerekli olduğuna dair evangelize ettiğini göreceksiniz. Ancak bu biraz anlamsızdır, çünkü kişi her şeyi asla bilemez ve işinin ortaya koyduğu şartları yerine getirmesine yardımcı olmadıkça beklenemez. Genel olarak, hobi veya keyfi kişisel tercih konusu olmadıkça, eğitimsel önkoşullara daha pragmatik bir yaklaşım getirmeyi tercih ederim.

Son derece verimli kod veya yenilikçi altyapı algoritmaları yazması beklenen programcılar için önemli mi? Evet.

Geleneksel web uygulamaları geliştiren programcılar için önemli mi? Onsuz yönetebilir veya açık kaynak dünyasında etkili uygulamalar yapabilirler.

Uygulamalar için GUI geliştiren programcılar için önemli mi? Muhtemelen hayır, çünkü başarılı GUI çerçeveleri tüm bu küçük ayrıntıları soyutlamaktadır.

Her zaman olduğu gibi bilmek her zaman güzeldir, ancak birçok (hatta çoğu) programcının işini sadece işverenlerinin memnuniyetine kadar yapmasını engellemez.

Öte yandan, daha yüksek çalışmalara kaydolduysa, temel ve teorik eğitim arayışında, tanım gereği pratikten daha teorik olan konuları öğrenmesi beklenmelidir. Bence CompSci'nin olması şart. öğrenciler karmaşıklığı öğrenir, tıpkı matematik hakkında öğrendikleri kadar önemlidir.

Her neyse, CompSci ne zamandan beri. programları insanlara nasıl iyi programcı olmayı öğretir? Bunun için uzmanlaşmış eğitim programlarınız ve pratik deneyiminiz var (ya sizin ya da sizinle paylaşabilecek programcılarınız).


1
İkinci bölüm muhtemelen daha az belirsiz: BSc düzeyinde compsci öğrencilerine öğretilmeli mi?
Muhammed Alkarouri

1
Bu soruyu da cevaplamak için görevimi düzenledim.
Yam Marcovic
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.