Bilmem gereken tek bilgisayar bilimi teorisi nedir? [kapalı]


27

Bilgisayar Bilimleri diplomasından ziyade Elektronik Mühendisliği olan biri olarak konuşursak , beni daha iyi bir gerçek dünya programcısı yapmak için bilmem gereken bilgisayar bilimi nedir?

(Gerçek dünyayla, bir programcı olarak günlük işimde kullanacağım ve faydalanacağım bir şeyi kastediyorum - örneğin, veri tabanı normalleşmesini anlamak için çok fazla olan hızlı bir sıralamadan daha pratik bir kullanım olduğunu öneriyorum Kütüphanelerin


42
1 (özür dilerim, zorundaydım)
haylem

5
Ah, ya da en önemlisi! (Şimdi gidiyorum ...)
haylem

Teorik Bilgisayar Bilimi yığın değişimi, buradaki herkesin bahsettiğini onaylar: karmaşıklık, veri yapıları ve algoritmalar. cstheory.stackexchange.com/tags
chrisaycock

2
Bu soruya itiraz etme gereği duyuyorum. Öğrenmeye yetecek “bir bit” ve dahası, (IMHO) bir “en önemli” bit yoktur. CS için eşit derecede önemli olan birkaç yön vardır (yine IMHO) . Dolayısıyla, bu sorunun cevapları ilginç olsa da, sorunun daha iyi formüle edilebileceğini düşünüyorum.
Konrad Rudolph

1
Eenginizi henüz almadıysanız, mantıksal ve / veya ayrık sayı teorisini söylerdim. Hemen hemen her kişi ifve loopşimdiye kadar yazılmış olan ifade, bu iki çalışma alanının alt kümesini kullanır.
Steven Evers

Yanıtlar:


52

Sadece bir parçayı seçmek zorunda kalırsam, ki bu zor bir karardır, Büyük O notalarına bakalım derdim . O (n), O (ln n), O (n²), O (2 ^ n), O (n!) 'İn anlamlarını anlamak, türünde iyi sonuç veren birçok pahalı hatadan kaçınmanıza yardımcı olur. Test ortamı ancak feci bir şekilde üretimde başarısız.


2
+1 ve sadece O (n ^ 2) 'nin O (lg n)' den (örneğin) daha kötü olduğunu bilmek , belirli bir kod parçası için Big-O 'nun nasıl türetileceğini bilmenin daha önemli olduğunu söyleyebilirim .
Dean Harding,

3
Kararlıca kabuletmemek. Bu şey nispeten önemsiz ve CS'de daha ilginç konular var. Ayrıca, çoğu insanın karmaşıklığı sezgisel olarak düşündüğünü düşünüyorum, buna rağmen karmaşıklık
demeyebilirler

Magnus: Deneyimlerime göre, çoğu programlamayan insan karmaşıklık hakkında hiç düşünmüyor, sezgisel olarak tüm problemler için O (n) olduğunu varsayıyorlar.
user281377,

Buna resmen ihtiyaç duymadım.
CaffGeek

1
Çad: Büyük O gösterimi hakkında aşırı formalist olan hiçbir şey yok, ancak şeyler için isimler olmadan, meslektaşlarınızla konuşup durmadan, bu şeyler hakkında pek düşünemezsiniz.
user281377,

19

Bu bir soru, herkesin farklı bir cevabı olacak. Söyleyeceğim: karmaşıklık teorisi en önemli parçadır, yine de doğrudan bir programcı olarak öğrenmiyorsunuz (algoritmalar ve veri yapıları gibi), ancak çalışmanızı etkileyebilecek olan şey. Bir sorunun kübik karmaşıklığa sahip olduğunu bildiğimde yardımcı olur, sorun büyüklüğü arttığında kötü ölçekleneceğini biliyorum.


Daha basit bir dilde kolayca düzeltilebilecek bir problemi çözüp çözmediğinizi bilmek çok yardımcı olur.
philosodad

Karmaşıklık bir kavram olarak önemlidir, ancak aslında bunu hesaplamak çoğu zaman önemli değildir. Daha az karmaşık olanı anlamak önemli bir şeydir.
Bill

@Bill: Kesinlikle. Fakat bu kısım, mutlaka pratik yapamayacağınız bir şey. Teori bu konuda çok yardımcıdır.
Mnementh

12

Veri yapıları, algoritmalar ve karmaşıklık hakkında bilgi edinin.

Bir makinenin sınırsız güce sahip sihirli bir kutu olmadığını anlayabilmek için fazla değil. Ona hiçbir şey fırlatamaz ve onu milisaniye cinsinden ezmesini bekleyemezsiniz. Bildiğin sınırlar var. Bunları kodunuzla test etmemeyi öğrenmeniz gerekir.

Ayrıca programlamadaki belirli tasarım problemlerini çözmek için ortak yaklaşımlara bir göz atın. Tasarım desenleri yani. Onlara ibadet etmeyin, sadece ilettikleri fikirleri alın.

Veri tabanı modelleme bilgisi de önemlidir.

Ondan sonra, temel kavramları uygulayan veya uygulamanıza izin veren farklı programlama dilleri, çerçeveler ve kütüphaneler var. Ne istersen al ve onlarla pratik yap.


Özellikler - Çok sayıda algoritma ve veri yapısı var.
Jon Hopkins,

Sadece bir şeyler hakkında fikir edinmek için temel olanları. Çok kalın olmayan bir kitap alın ve çalışın.

1
Thats biraz fazla bir bit.

7

Bu biraz zor bir soru.

Bilgisayar biliminin tüm yönleri, bir şekilde veya başka bir şekilde önemlidir.

Günlük olarak neye fayda sağlayacağınız konusunda, muhtemelen kodunuzun koddan CPU'ya kadar "başlık altında" nasıl çalıştığına dair genel bir bakış.

Big O Notasyonu anlamak önemlidir ve ayrıca kodunuzun nasıl uygulanabileceğini anlamak da gerçek dünyadaki durumlarda çok önemlidir.


7

Evet, bu beni saatlerce düşünmeye başladı.

Bu süreçte, burada verilen bazı genel cevapları kaldırmak zorunda kaldım.

LİSTE YOK

  1. Büyük O (n) notasyonu . Buraya koymak zor ama Hayır, verimsizlikleri sezgisel olarak çözebilir ve uzaktan asimptotik algoritmik analiz bile duymadan farklı prosedür kümelerini karşılaştırabiliriz.

  2. İşlevsel diller Hayır, tek bir dil ailesi problemler hakkında düşünmek için sadece bir yaklaşımdır. Neden sadece bu bit önemli olmalı?

  3. Durma Sorunu Bazıları çok özeldir ve insanlar var olduklarını bilmeden hayatlarını yaşamışlardır.

  4. Dinle Eğer dinlemiyorsanız, kendi dünyasında yaşarsınız. Mutlaka zararlı değil!

  5. Yazılım Geliştirme Döngüsü Yok! İnanılmaz bir yazılım veya solo kahramanlık çabasına hala yol açabiliriz.

  6. karmaşıklık teorisi sanırım bu olabilir, ama tüm formalizmler olmadan

Comp Science'ın bu bir fikri

" Soyutlamalar Soyutlamalar Soyutlamalar ... " derdim . Bunu öğren. Çevresindeki örneklere bakın ve nasıl kullanılacağını öğrenin. O her yerde. Bilgisayar bilimi, mühendislik ve uygulamaların tümü soyutlama katmanlarının katmanları gibi görünür.

Bunu öğrendikten sonra etrafa iyi bakmayı öğrenmeye başlarsınız.

Kullandığınız bazı birini gördüğünüzde list insertioniçinde pythonve not appendo piton listeleri eklemeleri masraflı ve ekleme ucuzdur dizi soyutlama kullanılarak inşa edilmiştir biliyorum çünkü, gülümse.

Bu sadece bir örnek.


Açıkça düşündüğünüz bir cevap için + 1'lediniz.
Jon Hopkins,

Halting Problemi hakkındaki yorumunuz üzerine yapılan bir yorum: "Var olanı bilmeden yaşamak", HERHANGİ bir bilgisayar bilimi konusu için geçerlidir.


3

Veri yapılarının rekabetçi kullanım durumları.

Performansı garanti altına almak için kırmızı-siyah ağaçları olan bir haritanın, performansı garanti etmek için bir diziyi kullanamayacağınız diğer şeyleri gerektiren durumlar vardır. Hangi veri yapısının ne zaman seçileceğini bilmek çok değerli bir beceridir.


3

önemli olan sadece üç sayı var:

  • sıfır
  • bir
  • çok

ama bu '3' de önemli olduğu anlamına gelmez mi?
Javier,

Sıfır, bir ve sonsuz olması gerekiyordu: en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens

@Javier: 3 birçoklarının alt kümesidir
Steven A. Lowe

@ Tomolar: kim söylüyor?
Steven A. Lowe

@Steven Benim anlayışım% 100 olmayabilir, ama burada fikrimin hiçbir şeyden yoksun olmanız, tek bir şey veya sınırsız olmanız gereken şeylerin sayısı. Hiçbir örneği ya da bir örneği sınırlamıyorsanız, örnekleri sınırlamamalısınız. Ancak, durumun neden böyle olduğundan tam olarak emin değilim (yalnızca Sıfır / Bir / Sonsuzluk kavramına aşina olduğumu biliyorum).
Thomas Owens

3

Ben CS (ve uzun yıllar bir geliştirici olarak ve bir mimar gibi) öğrendiğim en önemli şey dayalı aşağı bir sorun kırmak yeteneğidir oynaklık ve fonksiyonu üzerine. Tüm iyi tasarımlar uçuculuğu izole eder ve kaplar. Tüm iyi geliştiriciler / mimarlar, düşüncelerinde resmileştirmemiş olsalar bile, bunu sezgisel olarak yaparlar. Projenin başarısız olmasının en büyük nedeni, bir problemi volatilite temelinde yıkamamak ve kapsüllememek. Uçuculuğu kapsülleme başarısızlığı kaçınılmaz olarak karmaşıklığı ve proje başarısızlığını ortadan kaldırır.


Tam olarak volatilite ile ne demek istiyorsunuz?
amara

3

Durma Sorunu

Bilgisayar ile ilgili sorunlar sadece bu var aslında olamaz bir bilgisayar tarafından çözülecek.


3

Başa çıkmakta olduğunuz sorunun biçimsel dil hiyerarşisine nasıl düştüğünü bilmek için yeterli otomata teorisi bilmelisiniz. Bundan, HTML'yi ayrıştırmak için neden bir REGEX kullanmamalısınız (HTML açıklamak için bağlamsız bir dilbilgisine ihtiyaç duyar) ve bunun yerine C ++ 'ı derlemenin neden bu kadar uzun sürdüğü gibi, birkaç önemli pratik kullanım olduğunu anlayabilirsiniz . Java veya C # (C ++ bir Turing makinesi gerektirirken, Java ve C # bağlamsız gramerlerle tanımlanabilir).

Resmi dillerin en önemli katmanları en zayıftan en güçlüyedir:

  1. Sonlu bir otomat veya bir REGEX tarafından ayrıştırılabilecek diller (Geri referansları olan REGEX uygulamaları bu kategoriden daha güçlüdür, ancak yine de kategori 2'deki her şeyi ayrıştıramazlar)

  2. Yığın hafızalı veya bağlamsız bir gramer içeren bir otomat tarafından ayrıştırılabilecek diller.

  3. Bir Turing makinesi tarafından ayrıştırılabilecek diller veya rasgele erişim belleğine sahip bir otomata.


Um, hayır. Düzenli bir ifade, düzenli bir gramer ayrıştırır. Bu tam olarak sonlu bir devlet otomatı tarafından kabul edilebilecek bir gramer kategorisidir. Ve bir 'Chomsky Dilbilgisi' sadece yığın makinalarının işlediği içerikten bağımsız gramerlere atıfta bulunmaz.
philosodad

@philosodad - Bağlam ücretsiz dilbilgisi daha kesin ve terimini kullanmak için yazıyı güncelledim. Düzenli ifadeler hakkında söylediklerimle ilgili sorununuzu anlamıyorum.
Dan Monego

@Dan - Benim sorunum düzenli bir ifadenin sonlu bir durum otomatı kadar kesin bir güçlülüğü olduğunu ve TÜM deterministik bağlamsız gramerleri ayrıştırmaya göre HİÇBİR deterministik bağlam içermeyen dilbilgisini bir makine ile ayrıştırabilmenizdir.
philosodad

Ya da daha kesin olmak gerekirse: ya bir yığına ihtiyacınız var ya da ihtiyacınız yok. Bir dili ayrıştırmak için bir yığına ihtiyacınız varsa, dili ayrıştırmak için bir yığına sahip olmalısınız ve bu nedenle, bir dil ayrıştırmak için bir yığına ihtiyaç duyuyorsa, o dili ayrıştırabilirsiniz.
philosodad

@ philosodad - İki tür düzenli ifade vardır - teoride düzenli ifadeler ve yazılımda uygulanan düzenli ifadeler. Teorik düzenli ifadeler konusunda haklısınız, ancak uygulamaların çoğunun teorik temellerinin ötesinde birçok özelliği var ve asal olmayanlar için bir ^ n gibi bazı normal olmayan dillerle eşleşebilir. Bu pratikte teori ile ilgili bir konu olduğundan, biçimsel tanım ile vahşi doğada kullanılanlar arasında bir fark olduğunu söyleme yolumdan çıktım.
Dan Monego

2

Eh, size donuk bir cevap verebilirim: otomat teorisi ve bilgi teorisi.

Ya da uzun zaman önce bir donanım danışmanından öğrendiklerimi söyleyebilirim:

  • "Yeterince İyi" yeterince iyi değil.

1

Yazılım Geliştirme Yaşam Döngüsü , önceden yapmadıysanız bilmenizi önerdiğim bir şeydir. Bu, ikinci bir Bilgisayar Bilimi dersinde tanıtıldı ve yazılım projeleri içinde tekrar tekrar kullanılan bir şey. Bu, bir projenin baştan sona nasıl gittiği hakkında genel bir fikir edinmek için faydalı olabilir; ancak daha ayrıntılı bilgi almak için çalışabileceğiniz Waterfall veya Agile gibi metodolojiler daha ayrıntılı olmak istiyorsa.


2
Murphy kanunu: Yanlış gidebilen herhangi bir şey yanlış gidecektir
Richard

Bu CS teorisi değil, ama bu mükemmel bir cevap.
justkt

1

Programlama

Matematik ve Bilgisayar Bilimleri Bölümü'nden Hobart ve William Smith Colleges Bilgisayar Bilimleri 124'e Giriş Programlamaya Giriş :

Konular kontrol yapıları, nesneler, sınıflar, kalıtım, basit veri yapıları ve yazılım geliştirmenin temel kavramlarını içerir.

Programlayamazsanız, gerçek dünyada bilgi işlem konusunda çok ileri gitmiyorsunuz.

Ve evet, programcı olduğunuzu not ettim. Bu, genel olarak programlama teorisi bilginizi ve sizin için başka hangi yaklaşımları kullanabileceğinizi geliştirmektir.

Bildiğiniz gibi Bilgisayar Bilimi programlamak mı?

@Thomas Owens'ın (tamamen haklı olarak) programlamanın kesinlikle Bilgisayar Bilimi olmadığını belirten yorumuna cevap olarak, Wikipedia'nın Bilgisayar Bilimi makalesinden alıntı yapmak istiyorum :

... bilgisayar biliminin odak noktası, oyunlar ve web tarayıcıları gibi yazılımları uygulamak için kullanılan programların özelliklerini anlamak ve bu anlayışı yeni programlar oluşturmak veya mevcut programları geliştirmek için kullanmaktır ...

Böylece, okuduğum gibi, programlama yaparak programlama teorisi anlayışınızı kanıtlıyorsunuz. Bu da, başkalarının birlikte çalışması için bir zevk olan basit ve zarif bir kod oluşturmanıza yardımcı olacaktır.


Programlama CS teorisi değildir. Aslında, programlamanın bilgisayar bilimi olmadığını kolayca söyleyebilirim.
Thomas Owens

@Thomas Owens Geçerli olduğu iddiamı yedeklemek için cevabımı güncelledim. Gözden geçirip düşüncelerinizi bildirir misiniz?
Gary Rowe

1
Yine de programlamanın CS olduğunu düşünmeyin. Programlama bir algoritma veya veri yapısını uygulamak isteyen bir bilgisayar bilimcisi için faydalı olabilir, ancak CS teorisindeki konular (Girişimden CS Teorisi kitabına, bu yüzden muhtemelen daha gelişmiş konular da var) mantık, otomata teorisi, grafik teorisi de var , hesaplanabilirlik, hesaplama karmaşıklığı ve algoritmaların analizi. Ayrıca programlama dillerinin (bir dilin tasarım ve uygulamasının arkasındaki teori) bilgisayar biliminin bir parçası olduğunu da söyleyebilirim. Ancak, iyi bir bilgisayar bilimcisi olmak için program yapabilmeniz gerekmez.
Thomas Owens

@Thomas Owens Amacınızı anlıyorum ve (saf şapkayı koyar) katılıyorum. Bununla birlikte OP, kendisine gerçek dünyada yardımcı olacak bir parça CS istiyor. Programlama teorisinin (iyi kodda uygulandığı gibi) bir bit olduğu fikrine hızlıca bağlıyım Buna göre biraz düzenleme yaptım.
Gary Rowe

Evet. CS'den, programlama dillerini ve paradigmalarını anlamak yardımcı olabilir (özellikle DSL'ler uyguluyorsanız, ancak prosedürel, işlevsel, OO, mantık gibi birçok paradigmayı bilmek yazılım geliştirmeye yardımcı olur) derim. Algoritmaları ve veri yapılarını anlamak aynı zamanda probleminizi en verimli şekilde çözmek için doğru olanı seçmenize yardımcı olur. Otomata teorisi yardımcı olabilir (bir zamanlar dev bir FSM olan bir sistemle çalıştım, ama bunun ne kadar yaygın olduğunu bilmiyorum). Böylece veri yapıları, algoritmalar ve PL teorisi CS'den öğrenilecek en faydalı şeyler olacağını söyleyebilirim.
Thomas Owens

1

Konrad Rudolph ile aynı fikirde değilim. Seni daha iyi bir "gerçek dünya programcısı" yapmak için bilmen gereken "bir bit" bilgisayar bilimi var. Buraya verdiğiniz cevaplardan başka bir şey alamazsanız, en azından bunu düşünün - Gereklilikleri yerine getirmek müşteriyi tatmin etmekle aynı değildir! Son kullanıcılar HER ZAMAN programınızı hiç düşünmemiş ya da kodlanmış bir şekilde kullanmaya çalışacaktır. HER ZAMAN, HER ZAMAN, HER ZAMAN.

Bu nedenle, daha iyi bir programcı olmak için önce DİNLE yazmalısınız. Müşteriyi dinle. İhtiyaçlarını dinle. İsteklerini dinle. Ve özellikle, "teknoloji pertise" seviyelerini dinleyin. Size tam olarak istenen şey olan bir projeyi kaç kez gördüğümü söyleyemem, ancak müşterinin gerçekten neye ihtiyaç duyduğunu değil. Bütün bunlar talep edenlerin toplanacağı programcının gerçekten dinlememesiydi.

UI tasarımında bir geçmişiniz yoksa, kullanıcı arayüzünü tasarlamak için birinden birini edinmek için elinizden alabileceğiniz başka bir şey var. HER ZAMAN UI'nin programcı tarafından tasarlandığı ve bir uzman tarafından tasarlanmadığı bir uygulamayı tespit edebilirim. Mantıklı olan ve sizin için anlamlı olan şey müşteriye bir anlam ifade etmeyecektir. Ve eğer müşterileriniz teknik açıdan güvenilir değilse (ve kim?) O zaman “işlevselliğin doğru, ancak estetik açıdan çirkin” çözümünüz bir akşam yemeğinde kokarcanın sıcaklığıyla karşılanacak.


3
Bu cevap, Hopkins'in sorduğu şey olan CS teorisi ile ilgilenmiyor.
James,

1

İşlevsel diller!

İşlevsel dilleri öğrenmek, adımlar ve adlandırılabilir değişken durumlar (değişkenler) yerine ifadeler hakkında düşünmenizi sağlar. Bu, günlük programlama problemleriyle etkin bir şekilde başa çıkabilme yeteneğiniz üzerinde önemli bir etkiye sahiptir - özellikle şimdi neredeyse her popüler dilin işlevsel özellikleri vardır.

Algoritmalar ve karmaşıklık teorisi de önemlidir, ancak çoğunlukla bildiğiniz ve çıkartabileceğiniz şeylere isimler koymanıza izin vermesi biraz daha az ilginçtir.


0

Bu bilgisayarlar esasen desen eşleştiricileridir, başka bir şey değildir. Her şey, Turing Makinesi'ne kadar - klasik bilgisayar bilimi kavramıyla kalıp işleme hakkında bilgi veriyor.


-2

Problem Çözme ve öğrenmeye devam etme isteği!

Bana hızlı sıralama ve veritabanı normalizasyonunu bilmekten çok daha iyi hizmet veriyorlar.


6
Bu, bilgisayar bilimi teorisi değil, elektronik (veya hemen hemen başka herhangi bir şekilde) mühendisliği için aynı şekilde uygulanır.
Jon Hopkins,

Örneğimi hesaba katmak için hızlı sıralama bilmem yeterli değil. Var olduğunu ve neyin özel olduğunu bilmek faydalıdır, ancak bunun hakkında bir şey bilmeseydim bir google araması da yapılabilir. Herhangi bir algoritmayı bilmek de yardımcı olmaz. Ancak nasıl yaratılacağını ve nasıl yorumlanacağını bilmek! Belki de cevabımı değiştirebilirsem, Karmaşıklık muhtemelen en önemlisidir.
Bryan Harrington

1
İhtiyacınız olduğunu ya da var olduğunu bilmiyorsanız, bir şey arayamazsınız. Yanıtınız, bir geliştiricinin sahip olması gereken önemli özellikleri listeler, ancak sorulan soruyu cevaplamaz.
Adam Lear
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.