Bir lisansın bilmesi gereken CS konuları [kapalı]


34

Üniversitede teoriye hiç ilgi duymadım. Asla okumam. Ne kadar denediğim önemli değil, bir şeyleri okuyamadım ve pratikte neler olduğunu bilmiyordum. Mesela, otomat teorisi dersimde profesörüm bana bunun matematiksel yönüyle ilgili her şeyi anlattı, ama bir kez bile pratikte nerede kullanılacağından bahsetmedi. Bu sadece bir örnek.

Üniversitemi geçmeyi başardım ve aynı zamanda bir projeye katıldım, bir proje yaptım ve neyse ki ortalamanın üzerinde olduğu için notlarım için rahatsız etmediler.

Şimdi, bir CS öğrencisinin hangi konuların mutlaka ve olumlu olarak farkında olması gerektiğini bilmek isterim? Endüstride alaka düzeyine sahip olabilecek konular. Bunun sebebi elimde biraz boş zamanım olması ve onları daha iyi anlayabilmem için bana yardımcı olması.

Önerileriniz neler? Biri için olduğu gibi, algoritmalar da bir konudur.


3
Düzenli ifadeler, otomat teorisine dayanır ve herhangi bir şeyi ayrıştırmanız gerektiğinde size yardımcı olacaktır. Okulda sahip olduğum işlerle ilgisiz olduğunu kanıtlayan şeyler yaptım ve öğrendim, ama bu en azından öğrendiklerim üzerinde çalıştığım şey hakkında çok şey söylüyor. Öğrendiğim hiçbir şey bu alanda her koşulda işe yaramaz.
David Thornley,

2
Senin tipinle çalışmaktan nefret ediyorum ... jk (çeşit). Yerinde olsam ilk önce okuldan bilmeniz gereken şeyleri gözden geçirmek için zaman ayırırdım - bu şekilde bir sonraki görüşmenizde aptal gibi görünmezdiniz. Ondan sonra, gerçek dünyada kullanılabilecek gibi görünen makul miktarda veri yapıları ve algoritmaları öğrenirdim. Nerede olmak istediğini öğrenmen gerekiyor. Bir oyun geliştiricisi, muhtemelen lineer cebir, 3d grafik, hesaplama geometrisi gerekir. Genel olarak str, alg, database, os ve compiler verilerinizi minimumda gözden geçirmeniz ve öğrenmeye devam etmeniz gerekir.
İş

Otomat teorisi için belirli bir uygulamayı, aritmetik için belirli bir uygulamayı isimlendirmekle aynı şekilde adlandırmak zor. Abartı, belki, ama o kadar değil. Durum diyagramları genellikle yararlıdır ve kodda işlemek bir takım amaçlar için kullanışlıdır. Karar ağaçları (digraflara küçültülmüş) benim için nispeten yeni bir örnektir ve devlet modellerini (kanonik biçimde) kaplara anahtar olarak kullanmaya bile ihtiyacım vardı. Uygulamaları uygulama içinde göremiyorsanız, bir dolaylı kod oluşturma katmanı ekleme açısından düşünün.
Steve314

1
Aşağıda birçok harika CS yanıtı alıyorsunuz, ancak sorunuzu sınırlayarak, BSCS'imi aldığımdan bu yana 15 yıl içinde gördüğüm en yararlı şeylerden bir kaçını kaçırdığınızı düşünüyorum. Bu sektörde iyi yapmış: küçük grup iletişim ve takım çalışması becerileri. Aptalca göründüğü gibi, konuşma / dil / tiyatro bölümüne gidin ve "küçük grup iletişimi" veya "takım / grup liderliği / yönetimi" gibi bir sınıfa geçin. Yönetim yapmayı planlamasanız bile, orada edindiğiniz beceriler sizi daha iyi bir mühendis ve ekip üyesi yapacaktır.
cabbey

Yanıtlar:


41

İster inanın ister inanmayın, daha sonraki yaşamda benim için kritik öneme sahip olan şeylerden biri Derleyici İnşaat oldu. Lex ve Yacc kullanan modern namby-pamby versiyonu değil, bu aptallar için.

Kendi sembol tarayıcınızı ve ayrıştırıcınızı sıfırdan yazdığınız GERÇEK derleyici yapısı.

Bu, bir daha asla kullanmayacağımı düşündüğüm bir şeydi. Ancak son 20 yılda, bu kurs ağırlığını 4 kat altınla kanıtladı. Yazmak zorunda olduğum her komut işlemcisi, gelen her mesaj tarayıcı, her kullanıcı dağıtıcısı, her komut dosyası tercümanı bu kursun ilkelerini kullandı. Bu şekilde yapın ve hayat tatlı, açık ve basit. Üstelik tüm bilgileri, yapmayan bir meslektaşıma bile verdim - aslında soyut bir makine için bir derleyici yazmak zorunda kaldı. Ekleyebileceğim, ticari olarak çok başarılı olmaya devam etti.

Yukarı çıkıp herhangi bir konuda bir üniversite kursu öğretim görevlisine teşekkür etmek zorunda olsaydım, bu olurdu. O olmasaydı başarabilirdim ama çözümüm çok daha çirkin olurdu.

(Ve biri atlamadan ve "iyi bir şekilde Lex ve yacc kullanmış olabilirsiniz ..." demeden önce cevap, belki de - sisteme çok bağlıdır. Bazı durumlarda programlama dilleri C değildir (örneğin, PL / M ve Ada), bazı durumlarda platform için hazır bir Lex veya Yacc mevcut değildi. Temelleri bilmek, bazı araçları soruna nasıl uyacak şekilde bükmeye çalıştıklarını bulmak için sıkmak yerine bir çözümün el altında olduğu anlamına geliyor.)


6
+1 Derleyiciler, üniversitedeki en sevdiğim derslerden biriydi ve her zaman faydalıdır. Nadiren lex / yacc / bison kullandım, temelleri çok daha somut kullanım.
Orbling

Her ne kadar farklı bir sebepten dolayı tamamen katılıyorum. Kod oluşturucuyu nasıl yazacağımı bilmek - Lex ve Yacc kullanmış olmama rağmen - nesne yönelimli programlamaya ilk ve en iyi şekilde daldı.
Peter Turner

Kod üretecini düz C dilinde veya başka bir OO dışı dilde de yazabilirsiniz (ve nasıl bilmesi gerektiğini de bilmelisiniz). Daha sonra çok büyük prosedür kodları yazma ve ayrıştırıcı / tarayıcı / kod üretimini mantıklı ve anlaşılır aşamalara ayırma dersi.
hızla

+1 Derleyiciler, tasarımı ve kodu tamamladıktan sonra tamamen farklı bir ışıkta görmenize izin verecek kadar çok kalıp ve prensip içerir.
Andrew T Finnell

2
“Bu bir daha asla kullanmayacağımı düşündüğüm bir şeydi.” Her seferinde bir dolarım olsaydı, küçükken kendime bunu söyledim ....
Nick Spreitzer

37
  1. Veri Yapıları / Algoritmalar, özellikle Grafikler. Grafikle ilgili algoritmaları kullanmayı başardığım gerçek dünya durumlarının miktarı benim için sürpriz oldu. Bir veri yapısının veya algoritmasının uygun olduğu zaman özelliklerini bilmeye odaklanın. Örneğin bir problemi görebilme ve dinamik programlama / açgözlülük algoritmasını kullanmayı bilme önemlidir ve size zaman kazandırır.

  2. İşlemsel karmaşıklık bilgisi. Kafanızın üstünden, radix sınıfının alt sınırının ne olduğunu bilmek zorunda değilsiniz, ancak yazdığınız bir şeyin hangi en kötü durumdaki çalışma zamanının, özellikle de performans açısından kritik projeler için önemli olduğunu nasıl çözeceğinizi bilmek zorunda değilsiniz.

  3. İşletim sistemi kavramları. Hafıza yönetimi, Zamanlayıcılar, vb. Her geliştiricinin, yazdığınız kodun sürekli olarak etkileşime girdiğini göz önünde bulunduran işletim sistemleri hakkında sağlam bir anlayışı olması gerekir.

  4. NETSEC. Gelişimdeki temel güvenlik kaygılarını (tampon taşmaları, xss, SQLI, vb.) Sağlam bir şekilde anlayan çok az sayıda geliştiriciyle karşılaştım. Endüstride başarılı olmak istiyorsanız bu gerçekten bir zorunluluktur. Bir sonraki büyük şeyi yazabilmeniz harika ama verilerini güvenceye almazsanız çok fazla kullanıcınız olmaz.

  5. Programlama paradigmaları. OO / Fonksiyonel / Prosedürel programlama arasındaki karakteristikleri ve farkları bilir. Şimdiye kadar sahip olduğum en iyi lisans sınıflarından biri, dillerin kendilerinde fortan, şema, prolog vb. İçin 20 basit tercüman yazmaktı. Sadece maruz kalmanın kendisi, yazılım geliştirmenin temel kavramlarını anlamanıza gerçekten yardımcı olabilir.


1
+1 Bütün listeye çok fazla ihtiyaç var, özellikle de 4 (4) özellikle modern dağıtım döneminde çok önemli.
Orbling

1
Veri Yapıları / Grafikler üzerinde +1. Bir Hashtable'ı nasıl doğru kullanacağını bilmeyen programcıların sayısı ya da Neden Bağlantılı Listenin bazı durumlarda basit bir dizinin neden her gün beni şaşırttığını biliyorum.
Machado

Paradigmaların programlanması için +1. Farklı dil türleri arasındaki kontrastların iyi anlaşılması çok yardımcı olur.
apoorv020

19

Mezuniyet şartlarını yerine getirmek, olabileceğiniz en iyi bilgisayar bilimcisi olmak için mutlaka yeterli değildir. Tipik bir üniversite müfredatı için, öğrenmeniz gereken ilk on şey:

  1. Ekonominin temelleri - Tamamlayıcılar ve ikame ediciler gibi konuları kapsayan giriş dersi , daha büyük ekonomide çalışmak için veya sadece basitçe anlamak için hayati öneme sahiptir. Bir Giffen İyi kavramı mutlaka size yardımcı olmazken, dışsallıklar hakkında bilgi sahibi olur. Ayrıca, fark ettiğinizden daha fazla kazan-kazan olduğunu anlamanıza yardımcı olabilir.

  2. Bir kanıt nasıl yazılır? - Tüm bilgisayar bilimleri uzmanları nasıl bir kanıt yazacağını bilmelidir. Ve ayrık matematik, dengeli bir kahvaltının parçası sayılmaz. [İndüksiyon sadece bir prova tekniğidir ve provalar hakkında pek bir şey bilmeden elde edebilirsiniz.] Gerçekten prova yazmak için cebir veya gerçek bir analiz dersi gereklidir. Cebir derken, lisede aldığınız dersten değil, grup teorisi veya soyut cebirden bahsediyorum. Tüm fayda için, aynı terimde cebir ve gerçek analiz almak.

    Kanıt yazmak neden önemlidir? Çünkü programlama! Programlamayı ilk ne zaman öğrendiğinizi düşünün: bir görev gerekliyseifve bir döngü, onları birbirleriyle nasıl ilişkilendirebilecekleri konusunda hiçbir sezginiz olmayabilir. Fakat şimdi aynı görev tamamen doğal hissedecekti. Kanıt yazmak çok benzer. Öğreneceğin bir dizi hile var ve bir kere öğrendiğinde her şey çok farklı görünüyor.

  3. Nasıl yazılır - İster endüstride ister akademide çalışacak olursanız olun, yazılı iletişim becerileri önemlidir. Bir mekanik kursu bulabilirseniz ve farklı bir konuyla ilgili etkili bir yazı kursu bulamazsanız en iyisidir. Diğer bir deyişle, birçok okul, yazı kurslarını özel bir konuyla ilgili yaparak daha ilgili veya ilginç hale getirmeye çalışacaktır. Kursun “sıkıcı” versiyonuna gitmeye çalışın.

  4. Olasılık ve istatistikler - Sadece bir kursa katılarak alacağınız bazı şeyler vardır. CS ana gereklilikleri (size ayrık matematik, tek değişkenli ve çok değişkenli hesaplamalar ve doğrusal cebir vermeli) ve cebir ve / veya gerçek analiz ile birlikte, istatistiklerin toplanması muhtemelen matematikte küçük bir değer verecektir. İstatistik öğrenmek, diğer bilim insanları ile projeleri üzerinde çalışmanıza yardımcı olabilir.

  5. Güncel konu - Önceki yıllarda, veritabanları veya nesne yönelimli programlama olabilirdi. Bugün web programlama veya servis odaklı mimari olabilir. Şu andaki sorun ne olursa olsun, içinde bir kursa gittiğinizden emin olun. Sadece tuhaflığın ne hakkında olduğunu görmek için.

  6. Durma sorunu - Çoğu sorun makineler tarafından çözülemez. Bu, kültürümüzün o kadar iyi emdiği ve artık şok edici gelmediği oldukça derin bir fikirdir. Aynısı radyo, Goedel ve atom bombası ile de gider; postmodern sanat ve soğuk savaşa kadar bu kavramlarla bir kez daha başa çıkabildik. Ancak, hesaplanabilirlik teorisinde bir kursa katılmak sizi bu oldukça şaşırtıcı kanıtlara yeniden duyarlılaştırabilir.

  7. Saf fonksiyonel programlama - Eğer araştırma yapmazsanız veya belirli birkaç şirket için çalışmadıkça büyük olasılıkla saf fonksiyonel programlamaya giremezsiniz, ancak bunun daha iyi bir programcı olmanıza yardımcı olacağını bilmek. Bunun nedeni birçok yeni soyutlama formunu öğreneceksiniz ve Church sayıları ve sürekliliği ve monadleri ve evet, özyineleme gibi kavramlar ve bu araçlar bir sonraki Java programınıza da uygulanabilir.

  8. P ve NP - Tamam, bu zaten kritik yolunda, ama yine de dikkat et. Birisini yanlış bir şekilde NP “polinom olmayan” olarak adlandırdığında düzeltebileceğinizden emin olmak istersiniz!

  9. Kurstan nefret ettiğinizden emin olduğunuz konular - Bu çok düşük düzeyde, çok teorik veya çok sıkıcı veya çok sıkıcı bulduğunuz bir CS dersi olabilir . Böyle bir kurs sizin için bir sorun gibi görünüyorsa ve kendinizi başkalarına neden bu kadar çok sevinmek zorunda olmadığınızı açıkladığınızı açıklarsanız, çok şey öğreneceğinizi söylemelidir. kursa katılarak! Belki dersin materyallerini öğrenemezsiniz, ancak kendi sınırlarınızı ve belki de kendinize yaptığınız gerekçeleri öğreneceksiniz. [İpucu: Genellikle zayıftır.]

  10. CS-olmayan kursu seveceğinize eminiz - Sonunda biraz eğlenmelisiniz. Muhtemelen en az elde edeceğiniz ders budur, ama yine de alın. Bir kere yap. Pek çok kursu seviyorsanız, o zaman sizin için iyi, ancak bu listedeki diğer kursları kapsayan bir yöntem olmadığından emin olun.

Buradaki yaklaşımım, uygulayabileceğiniz derslere dayanarak pratikti. Ve öğrenilmesi muhtemel öğrenme hedeflerine odaklandım. Not: Bu cevap, her Bilgisayar Biliminin Binbaşı Öğrenmesi Gereken On Şey Üzerine yazdığım bir blog yazısından uyarlanmıştır .


Aşırı oy için bir açıklama faydalı olacaktır. Belki cevabımı değiştirebilirim, sonra fikrini değiştirebilirsin.
Macneil

Profesör, cevabınızı aşağıya oy kullanmam ama sorun çıkarmam gereken bir şey var. İspat Yazma: Bir numarayı tek veya çift olarak ispatlamamı istemediğiniz sürece, o güne dek hala Kesikli ispat yazamıyorum. Bu ve endüstri arasındaki bağlantıyı göremiyorum. Belki de "Problem Çözme Yönünü" özlüyorumdur. Beynimi hiçbir zaman Matematiksel İndüksiyon veya Pumping Lemma'nın etrafına saramadım. Beni yavaşlattığını sanmıyorum.
Bryan Harrington

Kanıt yazmak, program yazmak gibi bir şeydir. Örneğin, bir * 0 = 0'ın matematiğin FizzBuzz'ı gibi olduğunu kanıtlamayı öğrenmek (belki de biraz daha zor). İlk başta korkutucu görünüyor, ama yakında programlamayı öğrenirken yaptığınız gibi küçük püf noktaları alıyorsunuz. Kanıtlar özyinelemeli ve yapısal olarak düşünmenize yardımcı olabilecek farklı yapılara sahip olabilir. Dediğim gibi, ayrık bir matematik kursu gerçek kanıtları öğrenmek için kesmiyor. Bunun için grup teorisi veya gerçek analiz gerekir.
Macneil

Övgü bilgisi kesinlikle faydalı olsa da, tamamlama bilgisinin ekonomi ile daha alakalı olduğunu düşünüyorum.
59'da

1
@ijw: CS öğrenciler için ekonomi ile ilgili olarak, Joel iyi tartışma değerinde okuma vardır: joelonsoftware.com/articles/CollegeAdvice.html
MacNeil

8

Çok sayıda görüşme yapmış olan birkaç şirket temsilcisi ve arkadaşıyla konuştuktan sonra:

  • Veritabanları
  • OOP
  • Algoritmalar
  • Veri Yapıları

yeni işe alımlar için "must" olma eğilimindedir (veya dedikleri gibi, "şiddetle tavsiye edilir" dersleri).

Yararlı olabilecek diğer dersler bilgisayar güvenliği, montaj ve makine mimarisidir. Profesörlerin çoğu bana da bir derleyici kurs önerdiler. Ayrıca, zamanınız varsa, grafik teorisi, kesikli matematik ve birleştirici gibi matematik derslerini şiddetle tavsiye ederim. CS derslerinin çoğunun parladığı, ancak çok karmaşık programlar yazarken çok yararlı olduğu bu sınıflarda birçok akıl yürütme becerisi öğreniyorsunuz.

Umarım yardımcı olur!


1
OOP ve veri yapıları ile hemfikir olur.
apoorv020

4
Temel veri yapıları ... sooooooooooo önemli. Sanırım OOP'dan daha önemli. Bilgilerin nasıl saklanacağını ve düzenleneceğini düşünebilmeniz gerekir. Gömülü sistemde, veri yapılarınızın hafıza içi düzeni, ölüm kalım meselesi.
Çabuk_

3
Matematik dersleri için +1. Ayrıca büyük sorunları / sistemleri takip etmeyi öğrenmenize yardımcı olurlar.
Michael K,

1
Ağ kurmak, aynı zamanda yapmak için iyi bir tanesidir.
Keyo

OOP? OOP olmadan Haskell veya C de programlayabilirsiniz ... Size yaygın olarak kullanıldığını söyleyeceğim, ancak bunun bir temel olduğunu düşünmüyorum. Öte yandan, çeşitli paradigmalara maruz kalmak oldukça yararlı görünüyor.
Matthieu M.

6

Bu, derecesi ile ne yapmayı planladığınıza bağlı. Çoğu CS ana dalının bir tür yazılım mühendisi olduğu anlaşılıyor. Bunu akılda tutarak, neden daha fazla insanın sadece yazılım mühendisliğinde önemli olmadığını bilmiyorum. Özellikle kamu kurumlarında yeterli yazılım mühendisliği programı bulunmadığından şüpheleniyorum.

Gömülü bir arka plandan geliyorum. Çalıştığım her bir insanın EE derecesi veya CE derecesi vardı ve bunun nedeni kısmen “yaşlı adamlar” ne zaman üniversiteye giderken o kadar fazla CE programı mevcut değildi. Bu nedenle, eğer gömülü alanda çalışmak istiyorsanız bir donanım arka planının istendiği açıktır.

Ancak çalışmak istediğiniz alan ne olursa olsun, her programcının bir araya gelerek programlama dersi alması gerektiğine inanıyorum. Bunu asla kullanmayabilirsiniz, ancak işlev çağrısı sırasında işlemci düzeyinde tam olarak ne olduğunu, kesintilerin nasıl yapıldığını, belleğin nasıl yapılandırıldığını veya farklı adresleme modlarının nasıl kullanıldığını öğretir. Bütün bunların seni daha iyi bir programcı yapacağına inanıyorum.

Ayrıca, açıkça görülmese de, bazılarının hepsi belirli bir platform için Veri Yapıları ve Algoritmaları dikkate alırken önemli konulardır.


+1 çünkü bir bilgisayar bilimi derecesi size çok çeşitli konular / teknolojilerle deneyim kazandırır. Sadece yazılım tasarım kursuna dikkat ettiğinizden emin olun.
Bay Ant,

+1 Montaj için, yığının altında ne olduğunu tam olarak anlamak her zaman akıllıca olacaktır. Herkesin de donanımı bilmesi güzel olurdu, ama çoğu için çok uzak bir adım olurdu.
Orbling

5

Sorunuzu yanıtlamanın 2 yolu var. İkisini de deneyeyim. İlk yol, potansiyel bir iş piyasası bakış açısından, kodlama becerilerindeki vb. Şeylere bakmaktır. İşte benim listem:

  1. Veri yapısı
  2. Algoritma Analizi
  3. Nesne yönelimli programlama
  4. C ++ veya Java dilinde belirli bir kurs
  5. İşletim sistemleri
  6. Kullanıcı arayüzü tasarımı
  7. Paralel Programlama

İkinci yol, şeylere biraz soyut bir perspektiften bakmak ve kim bilir, biraz da felsefi olabilir. Aşağıdaki liste iş piyasasının gerektirdiği en yüksek becerilere sahip olmayabilir, ancak bu kurslardan çıktığınız zaman yazılım geliştirme sanatını daha derinden tanıyacağınızdan eminim.

  1. Sonlu Dil ve Otomatlar Kuramı
  2. Derleyici İnşaatı
  3. Grafik teorisi
  4. Yapay zeka

Sadece bence gerekli olduğunu düşündüğünüz, bir listesini listeleyen sebepler ve deneyimler sağladığınız bir dizi ders listelemeyin.

2

İçeriği genellikle sektördeki öğrenciler tarafından toplansa da, listeye Yazılım Mühendisliği veya Tasarım Uygulamaları'nı da eklerdim.

Ayrıca, bence (çok fazla tecrübeyle desteklenmese de) şirketler veritabanları gibi derslerde öğretilen teorik şeylerin çoğunu istemiyorlar, insanların bu şeyleri anlamalarını ve kullanabilmelerini istiyorlar .

EDIT: Olumsuz oy nedeniyle cevabımı açıklamak istiyorum. Son sınıf bilgisayar bilimi öğrencisiyim ve deneyimlerim alanındaki lider firmalarla yaptığım staj ve iş görüşmelerime dayanıyor. Tecrübelerime göre, insanlar nadiren karmaşık algoritmalar kullanmak veya görüşmelerde veya işlerde çok karmaşık veri yapılarını kodlamak zorunda kalıyorlar.

Veritabanları oluşturabilir ve kullanabilir, kaynak kontrolünü kullanabilir, doğru şekilde nasıl hata ayıklayacağınızı, tasarım kalıplarını nasıl kullanacağınızı bileceğinizde daha faydalı olur. Ancak, söylediğim gibi, bu beceriler genellikle endüstride toplanır ve derslerde ele alınmaz. Yazılım Mühendisliği / Tasarım Uygulamaları tipik olarak, tüm tez becerilerini öğrenmek için çok yararlı olan orta ölçekli bir proje inşa etmeyi içerir.


Lütfen deneyimleriniz ve neden birileri bu dersleri almak zorunda olduğu hakkında daha fazla ayrıntı verin.

@Mark: Aşırı oylamanın ardındaki mantığı açıklayabilir misiniz?
apoorv020

@ apoorv020, Yazılım Mühendisliği veya Tasarım Uygulamaları'nı neden önerdiğinizi açıklamaksızın yanıtınızı kullanmaz. Düzenlemeniz neden onları önerdiğinizi açıklamıyor.

@ apoorv020, Yazılım Mühendisliği veya Tasarım Uygulamaları almanın tek yararı, tipik olarak orta ölçekli (bu ne anlama gelirse) bir proje inşa etmenizdir. Bu dersleri almaktan şahsen ne öğrendiniz?

Bilmeleri iyi, ama bunlar CS konusu değil.
Thomas Owens

2

Her gün kullandığım kolejde öğrendiğim şeyler:

  • Nesneye yönelik tasarım metodolojisi
  • Tasarım desenleri
  • Düzenli ifadeler
  • Temel algoritmalar ve analiz
  • Veri yapıları

Keşke bir veritabanı kursu alsaydım. (Mezun olduğumdan beri alabileceğim kadarını buldum ama keşke daha fazlasını bilseydim.) Versiyon kontrolünün de öğretilmesini diliyorum - her yerde, çok kullanışlı ve okulumun müfredatında tamamen göz ardı edildi.

Birkaç matematik dersi almak zorunda kaldım. Mezun olduğumdan beri hesabı kullanmadım. Keşke bir istatistik kursu almış olsaydım. (Yine, mezun olduktan sonra geçecek kadar para topladım, ancak keşke daha fazlasını bilseydim.)

CS bölümünün ötesinde, bir yazı kursu alın. Başarı için iyi yazılı iletişim becerileri gereklidir.


+1 Veritabanlarının dersinizde zorunlu olmadığından, genellikle önemli bir bileşen olarak kabul edildiğinden şaşırdım.
Orbling

Öyleydi. Teknik bir konuda ondan çıktım ve pişman oldum.
pwc

@Orbling: Genellikle küçük bölümler (büyük devlet okullarındakilerin aksine) her büyük konuyu zorunlu kılacak yeterli öğretim görevlisi yoktur. Okulumda, örneğin, veritabanları bir seçmeli idi.
Macneil

@ Macneil: Benim kursumda, birincil veri tabanları dersi bir önkoşuldur (tüm temel bilgileri kapsar: ER modellemesi, normal formlar, SQL (sadece temel SQL değil, bileşik / iç içe, vb.), Dizin yerleşimi vb.), İkincisi, daha karmaşık , veritabanı dersleri seçmeli idi (toplamda üç olduğunu düşünüyorum). Onları almayı hiç seçmedim, düşündüğüm gibi, kaçırdığım diğer derslerden bağımsız olarak daha kolay emebileceğim şeylerdi. Sanırım bunun yerine, ileri VEYA aldım.
Orbling

PWC: İddiaya girerim, neden bunun dışında neden ondan çıktığını hatırlıyor musun?
Orbling

2

Hangi yöne gitmeyi planladığınıza bağlı olarak birçok önemli kurs vardır. Ancak, hiç program yapabileceğinizi varsayarsak, en önemli kurs aşağıdaki gibi olmalıdır:

  • Veri yapıları ve algoritmalar

    Neredeyse hesaplamadaki her şey algoritmaları kullanarak veri işlemeye geri dönüyor. Yaygın olarak kullanılan en faydalı veri yapıları oldukları için listeler ve ağaçlar ve grafiklere özellikle dikkat edin, ancak listeler ve ağaçlar ve grafikler (listeler sınırlı ağaç türleridir ve ağaçlar sınırlı grafik türleridir). de önemli ol. Dahası, algoritmaları anlamak, korkunç olmayan kodlar üretmek için çok önemlidir. (Aksi takdirde, O ( n log n ) 'in yapacağı O ( n 3 ) algoritmasını kullanmak gibi korkunç şeyler yapacaksınız.) CS derecenizin zorunlu bir DS + A kursu yoksa , CS değil. Veya yazılım mühendisliği. Ya da sadece programlama.

Bunun dışında, yıllar boyunca birçok alanda en faydalı bulduğum ders şu oldu:

  • eşzamanlılık

    Eşzamanlılığın birçok yönü vardır, ancak paylaşılan hafıza ile mesaj iletme arasındaki farkın anlaşılmasını bekliyorum. Aynı zamanda kilitleme stratejilerinin (mutekseler, semaforlar vb.) Ve işlemlerin güçlü bir şekilde kapsanmasını istiyorum.

    Bu elbette paralelleşmeyi anlamak için hayati öneme sahiptir, ancak dağıtılmış herhangi bir şey için de önemlidir (örneğin, müşteriler zaten asenkronize olacağından tek iş parçacıklı olsa bile , internete maruz kalan bir hizmeti yazmak ). Oyun yazmanın (genellikle okuyuculu) ve gömülü aygıtlarla çalışmak için de faydalı olduğunu biliyorum.

Bunun yanı sıra, çoğu lisans öğrencisinin mümkün olduğunca farklı fikirlere maruz kalmaları için en çok ilgi duyduğunu düşünüyorum. Programlama dilleri ve paradigmaların bir sürü. Birçok farklı uygulama alanı vardır. Makul miktarda matematik (yine de çok yararlı olduğu için) ve ayrıca insan faktörlerine ve psikolojiye maruz kalma (çünkü kullanıcılar ile etkileşime giren herhangi bir yazılım insanlarla ilgileniyor). Sonuçta, gelecekte ne yapacağınızı asla bilemezsiniz, bu nedenle esneklik planlaması harika bir yaşam stratejisidir.


1

Kolejdeyken, gerçek hayatımda kullanamadığım birkaç konu vardı ve bazen sezginin doğru olduğu kanıtlandı (Formal Metotlar çoğu zaman önemsiz problemler için sadece pratiktir) ve diğer zamanlarda Tamamen yanlıştı (Big-O notasyonu çok faydalıdır), bu yüzden sanırım genç benliğimin bir kısmı doğru çıktı.

Kendinizi gerçek dünyaya hazırlamak istiyorsanız, @ K-Ran'ın önerdiği şeylere ek olarak, Code Complete'i okumanızı ve bunu zor bulduğunuz veya sahip olduğunuzu hissetmediğiniz konularda daha derinlemesine bir araştırma yapmak için kullanmanızı öneririm. yeterince kaplanmış.


Bazen yalnızca küçük bileşenlerde açık olmasına rağmen, resmi yöntemleri faydalı buldum. Dijkstra ve ark. "Mükemmel bir matematikçiyseniz, iyi bir programcı olabilirsiniz."
David Thornley

Sanırım, yaşamınıza bağlı olacak kod üzerinde çalışıyorsanız, temel olarak bu şeyleri kavramak zorunda kalacağınızdan şüpheleniyorum. Ama yaptığım iş için asla gerekli olmadı. Şimdi ihtiyacım olsaydı, geri dönüp sıfırdan
öğrenmem gerekirdi

Z gibi şeyler, yalnızca sizin de dediğiniz gibi, yaşamın risk altında olduğu organizasyonlarda kritik bir yazılım için kullanılıyor. Ancak, onları öğrenmenin kod doğruluğu konusunda çok daha fazla farkındalık yarattığını ve her türlü belirtimde tam olarak geri derinlik kazandığını düşünüyorum. Bazen öğrendiklerin kendi iyiliği için değildir, ama yukarıda neyin durduğundan emin olmaya yardımcı olur.
Ocak'ta

Bunu sağlam olan daha büyük yapı taşları yapıyormuş gibi düşünün. Bileşenlerinizi doğruladıysanız (ve tasarım ve kanıtlarda yaptığınız aptalca hataları bulmak için onları test ettiyseniz), yazarken ve hata ayıklarken endişelenmeniz gereken daha az şey vardır.
David Thornley

1

Bence aşağıdakileri çalışmalısın:

İşletim Sistemi: - Bir programcı olarak çalışmaya ihtiyacınız olmasa da, bir işletim sisteminin nasıl çalıştığını ve bir CS derecesinden beklendiğini bilmeye değer. Herhangi bir iyi kitap yardımcı olabilir.

OOP: - Bu ekmek ve tereyağı. Bir zorunluluk. Kitaplar sormak istiyorsanız: İlk kitabınız şöyle olmalıdır: - önce OOAD'a gidin, sonra Grady Booch ve Ivar Jacobson'ın kitabına gidebilirsiniz.

Veri Yapıları ve Algoritmalar: - Mantıksal düşünme ve zihniyet gelişimi için çok önemlidir.

Bana bu kadarı yeter. Asla geç Değil. :)


1

Programlama işleri için düzenli olarak adaylarla röportaj yapan biri ve 12+ yıldır sektörde olduktan sonra makul bir şekilde başarılı olduğunu hisseden biri olarak,

  • Veri Tabanı Tasarımı ve SQL: Kaç tane programcının basit SQL'yi bilmediği ve iyi SQL becerilerine sahip olanların paha biçilmez olması şaşırtıcı. İyi bir veritabanı tasarlayabilmeniz için, belirli bir veritabanı yapısına sahip bir şirkette, yeni başlayanlar ve değişikliğe uğrayan şirketler için faydalı olmayabilir.
  • Tasarım desenleri. Basitçe iyi tasarım hakkında daha iyi kararlar almanıza yardımcı olacaklar
  • OOP: Bu, çoğu ders için genellikle ön koşuldur, ancak yardımcı olacaktır.
  • Algoritmalar: Çok az insan özyinelemenin ne olduğunu bildiğinden, onları ne zaman çok karmaşık bir kodlamadan kurtaracağını anlayalım
  • Veri Yapıları: Çoğu modern dil sizin için bu şeyleri ele alır, ancak onları anlamak iyi tasarımın anahtarıdır.

Sonra, bazı ekstra müfredat çalışmaları, şunları okuyun:

  • Sertifika türü kitaplar. Genellikle size kapak türlerinin ve sözdizimi türlerinin altındaki operatörleri öğretir. 'İşe yaradığı için' yerine neden bir şeyler yaptığınızı bilmek çok yaygın bir durumdur.

1

BT DEPENDS , bu soru için iyi bir cevap yok.

Programcı, bilgisayar yazılımı yazan birini tanımlamak için kullanılan genel bir dünyadır.

Şimdi, orada her türlü yazılım var. Örneğin, wikipedia 'ı bir genelleme kaynağı olarak kullanarak 3 büyük genellemeyle karşılaşabiliriz :

  • sistem programlama
  • programlama yazılımı
  • Uygulama yazılımı

Birinci alan sistem programlamasında cihaz sürücüleri, işletim sistemi, sunucular geliştirilir, örneğin bir işletim sistemi dersini takip edebilirsiniz.

peki ya programlama yazılımı ? Burada wikipedia'nın yazdığı gibi derleyicileri, hata ayıklayıcıları, tercümanları, bağlayıcıları, metin editörlerini kodlayabilirsiniz, bu nedenle, otomatikleştirme teorisi, dil teorisi, dil ve derleyicilerdeki bir kurs yararlı olabilir.

Her türlü uygulama yazılımı hakkında konuşamaz mıyız:
- video oyunları: cebir, fizik, nesne yönelimli kurslar?
- matematiksel yazılım: matematiksel dersler?
- resim düzenleme: matematiksel, fizik, algoritma kursları?
- endüstriyel otomasyon: matematik, fizik, algoritma, robotik kurslar?
- tıbbi yazılım: biyoloji, tıbbi, başka ne dersiniz?
- burada bir sürü şey: burada bir sürü kurs.

Gördüğünüz gibi pek çok elbette takip edebilirsiniz ve işiniz için faydalı olacaksınız.

Tecrübelerime göre, güvenlik konusunda bir sistem yazılımı mühendisliği ve uygulama yazılımıyım (bir güvenlik kursunu takip etmek ister misiniz?) Alanında, programlamada biraz deneyimliyimden başlayarak algoritmalar ve dağıtık sistemlerde daha ilgi çekici hale geliyor ve tekrar hissediyorum genel amaçlı uygulamanın basitliğinden rahatsızlık duyduğum (sniffer, ağ saldırı tespit sistemi, protokol disektör ve dedektör, vb.)

Teorik olarak bilgisayar bilimlerinde öğrendiğiniz gibi! Bu kursları okudun mu? : P

Örneğin, tüm bilgisayar dilinin birtakım hesaplanabilir matematiksel fonksiyonlara yerleştirilebileceğini öğrendiniz ve örneğin deneyimleriniz aynı yolu buluyorsa, yakında bu küçük hesap kümesinde rahatsızlık duyuyorsunuz ve benim gibi gelişmeye başladığınızı görmeye başlayabilirsiniz. yazılım çok ilgi çekici ve şaşırtıcı değil çünkü aynı DESIGN DESEN tekrar tekrar geri geliyor (tasarım deseni kurslarını takip ediyor musunuz?) ve örneğin WHY ve HOW dilinin matematiksel fonksiyona çevrilip başlayabilmesi için daha fazla ilgi göstermeye başlayabilirsiniz. bilgisayar dilinin çok karmaşık olmadığını öğren! Örneğin yakında kişi ve psikoloji hakkında daha fazla şaşırtabilirsiniz, ve bununla daha fazla ilgilenebilir ve iyi bir proje yöneticisi olabilirsiniz! Yazılım yaşam döngüsü ile ilgili kursları takip ettiniz mi?

Peki şimdi, CS kariyerinde MUST-HAVE kursu nedir?

Tüm alanlarda, özellikle teorik alanlarda, öğrenebildiğiniz kadarını öğrenmenizi öneririm, çünkü ortak çalışma alanında, etrafınızdaki küçük karmaşıklıktan gerçekten sıkıldığınızı hissedebilirsiniz ve tam zamanlı bir işçi olmak için daha az zamanınız olacak. işlerin gerçekte nasıl yürüdüğünü ve teorik olarak güçlü bilgiye sahip kişilerin nasıl iş yapmaları gerektiğini ve size evde yiyecek almak için kodlama imkanı verdiğini görmek için çok daha fazla zaman.

bilgisayar bilimlerinde yanlış bir gerçeklik duygusu var. örneğin bilgisayar bilimcisi bazen yazılım geliştiriciden gerçekten çok uzaktadır.

wikipedia açıklamalarına bir göz atın.

hayatla eğlenin :)

2 sentim.

gerçekten kötü ingilizcem için üzgünüm


1

CS öğrencilerinin akıcı olması gereken bir numaralı şeyi ingilizce bilmeli.

Hem konuşma hem de İngilizce konuşma anlayışı olmadan sonsuza dek dezavantajlı olacaksınız.

Sadece Stack sitelerinde gelen sayısız soruya bakın. Birçoğunun deşifre etmesi zor. Bazı insanlar bir l33t, manifatura karışımı kullanır (doğru terim olduğundan emin değil). Diğerleri bir açıklama yapar ve fiiller veya sıfatlar gibi önemli küçük düşünceleri kaçırırken basitçe bir soru işareti ekler.

Eğer iletişim kuramıyorsanız, o zaman başkalarının ne dediğini daha az anlamanızı sağlamak için kendinize bir şey yapamazsınız.

Her şey sadece detaylardır. İletişim kurabiliyorsanız, en azından ortalama bir zekaya sahipseniz ve ne okuduğunuzu anlayabiliyorsanız, başarılı bir kariyer programına da sahip olabilirsiniz.


1

Buna CS'den mezun olmadığım için biraz farklı bir perspektiften geldim, Elektronik Mühendisliği'nden mezun oldum (işletme okulu ile).

Buna dayanarak, anlamanız gereken şeylerin bir listesinin nispeten kısa olduğunu düşünüyorum (ve diğer birçok CS mezunu olmayan kişi), derleyici tasarımı veya benzeri hakkında bir şey bilmeden mutlu bir şekilde hayatta kalıyor.

Yararlı bulduğumu anladım diyeceğim:

  • RDBMS tasarımı - RDBMS'ler çoğu sistem ve sitenin arkasına otururlar ve en azından neler olup bittiğinin temellerini anlamalısınız (bunu işte öğrendim).
  • Temel Kullanıcı Arabirimi Tasarımı - birlikte çalıştığım en iyi programcılar, cehennem kadar çirkin olmayan kullanışlı bir uygulama üretebilir. Biri hariç, ancak kuralı kanıtlayan istisna.
  • Bazı temel programlama - ve temel demek istiyorum. Bazı C (görüntü işleme ve gömülü sistemler için), bazı Assembly Language (kursu tamamladıktan sonra unuttuğum) ve bazı Pascal (temel bir bilgisayar kursu tüm mühendisler için standarttı) öğrendim. Mülakat yaparken, az sayıda CS mezununun ticari kuruluşların herhangi bir şekilde gerçekten ne kadar programlayabileceklerinden çok şaşırdım, bu yüzden fazla bir şey beklemiyorum, ama temellerini bilmelerini bekliyorum.
  • Mantık - Dijital elektronikten, matematikçilerden teoriden, CS'nin programlama yoluyla derecelendirildiğini öğrendim ama yine de öğrenirseniz, o kadar çok şey olursa olsun, onu iyi kavramanız gerekir.
  • İletişim becerileri - Üniversitede gerçek derecemin, sunum becerilerimin ve iddialı olmamın dışında birkaç ders yaptım. Pek çok sağduyu, ancak birkaç kez mantıklı şeyler söylenmesi asla acı vermez.
  • İşletme ve muhasebe temelleri. Bazı programcılar farketmez gibi davranırlar ama aklımda bir şirkette çalışan herkes için önemlidir - oyun bu şekilde çalışır ve hayatınızı kontrol eder, bu yüzden neden en azından esaslarını bilmek istemezsiniz? işler nasıl ve neden oluyor?

Ve eğer proje yönetimi hakkında bir şeyler öğrenme şansını yakalarsanız, bu gerçekten zarar vermez, ancak bu, birçok durumda üniversitede oldukça kötü bir şekilde öğretilir ve bu, sadece projeler üzerinde çalışarak biraz öğreneceğiniz bir şeydir.


0

Listeye bazı temel İnsan Kaynakları / Psikoloji derslerini de eklerdim.

Bu garip bir ek gibi görünebilir, ancak profesyonel olarak işin bir parçası kendinizi nasıl satmayı ve pazarlığı nasıl yapacağınızı öğrenmektir. HR-drone'un motivasyonlarını sağlam bir şekilde bilmeden ilk 'gerçek' röportajınıza girmeniz, felaketin bir reçetesidir ve öğrencinin düşük maaşlı bir maaşın içine batmasıyla bitmesi muhtemeldir.

Düşmanını tanı ki kendini koruyabilirsin.


-1

1. yıl:

  1. Üst düzey bir dilde temel OOP
  2. Veri Yapıları

2. yıl:

  1. Derleyici, basit bir form sıfırdan inşa
  2. eşzamanlılık

3. yıl:

  1. Algoritma
  2. İşletim Sistemi, basit bir birine işlevsellikler ve geliştirmeler eklemek
  3. Resmi dil

4. Yıl:

  1. Dağıtımlı sistem
  2. Kullanıcı arayüzü
  3. Gelişmiş Derleyici
  4. Gelişmiş İşletim Sistemi
  5. Yapay zeka
  6. Bilgisayar grafikleri

Bu kurslar bol miktarda teori ve kodlama pratiği sağlamalıdır.


-2

Bilgisayar Mimarisinden kimsenin bahsetmemesi garip.


Sana hafıza önbelleklerini, sayfa hataları vb etkisini anlamak istiyorsanız bilgisayar mimarisi bilmek önemli olduğunu düşünüyorum
apoorv020
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.