Her bilgisayar bilimi öğrencisi size göre üniversitede hangi dilleri (veya programlama dillerinin sınıflarını (paradigmalarda olduğu gibi) ve bu sınıfın tavsiye edilen dilini) öğretmelidir? Cevaplarınızı motive edin; neden bu dil? Bundan ne faydası olacak? Hangi kavramları öğretiyor (X dilinden daha iyi)?
Not/açıklama: Bu soru, saf bilgisayar bilimi değil, yazılım mühendisliğine yoğun bir şekilde odaklanan bilgisayar bilimi ile ilgilidir. Odak noktası olan yazılım mühendisliği eğitimi değil, hala bilgisayar bilimleri eğitimi.
Bir liste vereceğim:
Öğrenciler en azından tümü bunlara paradigmalar maruz bırakılmalıdır. Sadece bir ya da iki değil.
Sanırım birçok kişi Python yöntemsel stili, OOP stilini ve belki de diğerlerini kapsamayı önerecektir, ancak Python ile yeterli kişisel deneyimim yok güvenle tavsiye edebilmek.
Kişisel olarak fonksiyonel dillerin eskiden olduğu gibi öğretilmemeleri üzücü. En azından comp sci öğrencilerinin tüm önemli paradigmalardan bir dile maruz kalmaları gerektiğini düşünüyorum: prosedürel, nesne yönelimli, fonksiyonel ve dinamik.
İyi dengelenmiş bir CS öğrencisine 4 programlama dili türünün her birinde bir dil öğretilmesi gerektiğini düşünüyorum:
İşlevsel - LISP/Haskell/PostScript. Haskell ile pek tecrübem yok, ama bu konuda öfkeli olan diğer programcıları duydum. İşlevsel programlamanın yapılarını ve neden birçok durumda yararlı olduklarını anlamak, bir programcının diğer dillerdeki algoritmaları düzenlemede daha iyi olmasına yardımcı olacaktır.
Nesneye Dayalı - Seçiminizi yapın. C #/Java/Python/Ruby/yadda yadda yadda. Bu tipin öğretilmesi gerekir, çünkü modern işletmelerin istediği budur.
Zorunl - C/Fortran/Pascal. Bunlar bugünlerde daha az yaygındır, ancak yine de pratik/tarihsel bir bakış açısıyla öğrenilmelidir. Kullandıkları yöntemler hala pratikliğe sahiptir, çünkü her dilde, hepsi bir talimata dayanır. Ve zorunlu diller, talimatları listeleme ve takip etme konusunda çok iyidir.
Mantıksal - ProLog. Bu dillerden hiçbiri için iyi bir pratik kullanım bulamadım, ancak mantıksal dillerin arkasındaki bazı kavramları daha nesne odaklı dillerde nasıl yazacağımı anlamaya çalışırken kullanışlı buldum. Üniversite yıllarım boyunca mantıklı dillere uzun süre odaklanamadım ve sanırım o zaman daha güçlü bir odaklanma bana iyi gelebilirdi.
Mezun olan her CS mezununun bilmesi gereken 1 numaralı dil, harika bir işe girme potansiyellerini en üst düzeye çıkaran dildir. Bu zamanla değişecek, bireyin harika iş tanımına bağlı olarak değişecek ve coğrafi bölgeye göre değişecektir.
Şu an için söyleyeceğim İngilizce her CS majörünün bilmesi gereken # 1 dil (bu, tabii ki) , bölgeye göre değişir.)
Bir CS öğrencisi için, tartışılan CS kavramlarıyla yakından eşleşen programlama dillerini arayın. Şunu öneririm:
Liste bu şekilde devam edebilir, ancak temel fikir oldukça basittir: Öğrencilere, kavramları öğretmek istediğiniz şekilde en uygun programlama dilini öğretin.
Zamanla değiştiğini düşünüyorum, ama ideal olarak - 3 farklı perspektiften 3 dil. Benim günümde prosedürel, OO ve işlevseldi - Pascal, C++ ve LISP. Özellikle bu üçte çok satılmadım. Ama röportaj yaptığımda şunu ararım:
Başka bir ticaret olarak - CS programlarının öğrencileri pazarda öne çıkan diller konusunda eğitmeleri gerektiğini düşünüyorum. Herhangi bir zamanda, 2-3 dilin işlerin çoğunluğu için ciddi bir öneme sahip olduğunu düşünüyorum. Bence bir okul öğrencilere borçludur ve bu dilden 3'ünden 2'sini en az birinde eğitim derinliği ile öğrenme fırsatı sunmaktadır.
hangi programlama dilini kullanırsanız kullanın, perde arkasında neler olup bittiğine dair bir fikir edinmek için. ölü kod gibi temel kavramları ve (iyi) bir derleyicinin sizin için yapabileceği çeşitli optimizasyon türlerini kavramaya yardımcı olur.
Bence dil insanların inandığı kadar önemli değil.
Evet, vb.'nin nasıl programlanacağını bilmeniz gerekir, ancak birçok büyük programcı, gelişirken onlara yardımcı olan gerçek dünya deneyimlerini kendi kendine öğrenir.
Öğrenciler sadece kitap yöntemlerini değil, gerçek dünyada nasıl programlama yapılacağına dair bazı derslerle yapabilirler, bu onları daha "yuvarlak" hale getirir ve benim tercihimde daha iyi geliştiriciler/mezunlar olur.
Üniversiteden ayrılıp çalışmaya başladıktan sonra programlama ve yazılım geliştirme hakkında daha fazla şey öğrendim!
LISP (OOP için CLOS ile) ve Haskell. Bu soru öğrencilerle sınırlı değildir. Yeni süslü programlama dilleri, bu ikisinden birçok özellik ödünç aldı (kopyalandı, çalındı mı? ... hayır, fena değil). Kendinizi geleceğe hazırlayabilirsiniz. Fonksiyonel programlama (stil) bugün daha önemlidir ve C # (LINQ) veya C++ (lambda) gibi zorunlu programlama dillerinde tanıtılmaktadır. Bazı öğrencilerin Java) öğrenmesi çok kötü.
GERÇEKTEN ÖNEMLİ Mİ?
Genellikle bu sorunun ardındaki kaşıntı, "Bana en kazançlı/ilginç/zorlayıcı/kolay işleri sağlayacak olan özgeçmişimi koyabilir miyim?" Her ne kadar sorunun en özgeçmişi olsa da, ilk önce aradıklarını anlamayan İK insanlar tarafından taranıyor. ama çok sığ, kapıları geçtikten sonra malları teslim etmeniz gerekiyor.
Sizi iyi veya kötü bir programcı yapan hangi dilleri bildiğiniz değil, onu nasıl kullanabileceğinizdir. Bunun için temel olarak iki programcı kategorisi vardır:
Özünde bir dil öğrenmeye odaklananlar. En önemlisi dil ve nasıl kullanılacağıdır. Aşırı uçlarda, her küçük kod parçasını süper optimize etme eğilimindedirler ve genellikle yapabildikleri için genellikle belirsiz özellikler kullanırlar.
Sonra teknikler ve paradigmalar hakkında bilgi edinmek isteyenler var. Kullandıkları dil, zihinsel resimlerini zarifçe ifade edebildiği sürece gerçekten önemli değil. Aşırı uçlarda, bunlar UML veya başkalarının bunu kodlama işini yapacaklarını ummak gibi diğer sistemleri kullanma eğiliminde olacaktır.
Bence ikisine de ihtiyacınız var. # 1 kısa vadeli beceriler sağlayacaktır ve akıllıca seçildiğinde İK kapıları boyunca sizi kolaylaştıracaktır, ancak # 2 sizinle tüm kariyerinizde kalacaktır ve sizi programcı olarak tanımlayacaktır.
# 2 rehberlik sağlayacak ve elinizdeki soruna çalışan bir çözüme yönelik düşünce treninizi düzenleyecektir, ancak 1 olmadan bu fikir bir fikir olmaya devam edecektir, sonsuza dek buharlı cennetin limbolarında yüzen (veya nereden baktığınıza bağlı olarak cehennem).
# 1, size gerçek çalışma sistemlerine fikir uygulama araçları verecektir, ancak 2 olmadan sistemleriniz kanserli şekilsiz canavarlara yönelecektir.
Montaj dili ve mikrokod. Bir CS öğrencisi, boolean durum makineleri ile en son üst düzey fonksiyonel/OOP/vb. Arasındaki tüm soyutlama katmanlarını anlamalıdır. programlama dili paradigması.
Temel veya Logo veya Gıcırtı (et.al.), eğer küçük çocuklara bilgisayar okuryazarlığını nasıl öğreteceklerini anlayabilmek istiyorlarsa.
Fortran, Cobol ve LISP, programlama dillerinin tarihini ve modern uygulamaların düzelttiği asıl sorunların ne olduğunu anlamak istiyorlarsa.
Farklı paradigmalardan 3 veya daha fazla dil seçmek o kadar da zor değil, birçok iyi cevap verildi. Ama sadece bir dil seçmek zorunda olsaydım, Scala'ya giderdim, çünkü hem işlevsel hem de nesne odaklı. Aynı dilde farklı yaklaşımları açıklayabilir ve karşılaştırabilirsiniz.
Yığın yönelimli/birleştirici dilleri unutmayın! Gerçek zihin bükücüler olabilirler. Küçük, anlaşılması kolay ilkelleri kullanarak karmaşıklık oluşturmayı vurgularlar. Onları çok temiz hisseden pointfree (veya tacit) kodu yazmak için kullanabilirsiniz.
Sorunuzu kısmen kendiniz cevapladığınıza inanıyorum.
Asıl önemli olan, öğrencilere birkaç paradigma ile temas kurma fırsatı vermektir, gerçek diller önemli olmamalıdır.
Tabii ki, en çok iş fırsatı veren paradigmaları öğretmek önemlidir (muhtemelen OOP) Bu nedenle, bu paradigma için yaygın olarak kullanılan bir dili öğretmek daha iyidir, çünkü asla kullanamayacağınız bir şey öğrenmekten daha yararlıdır, bu yüzden sınavlarıma da sahte kod yazmaktan nefret ettim.'Pseudocode 'sabit' sözdizimi olmadığı sürece gayet iyi. karşısında.
Somut olarak:
OOP: .NET veya Java
Öğrencinin diğer yaklaşımlardan haberdar olmasını sağlamak için en az 1 ek programlama paradigması.
Fonksiyonel: Lisp?
Ana akım olmamasına rağmen, D'nin, özellikle sürüm 2'nin, başka bir yerde kolayca öğrenilemeyen bazı ilginç dersler verdiğini görüyorum. Birbiriyle Nice oynaması ve çok düşük bir seviyede (işaretçiler, manuel bellek yönetimi, satır içi) programlamaya izin vermek için zorunlu/prosedürel, nesne yönelimli ve fonksiyonel programlama almayı düşündüğüm diğer dillerden daha ciddi bir girişimde bulunur. Montaj dili) ve aynı dilde çok yüksek düzeyde (genel ve üretken programlama).
Bu değerlidir, çünkü paradigmaları farklı evrenlerde varmış gibi tek başına görmek yerine, ormanı ağaçların arasından görürsünüz. Her paradigmanın güçlü ve zayıf yanlarını programlarınıza harmanlarken ince taneli bir düzeyde görürsünüz. Paradigmaların önemli yönlerinin alt düzey kod açısından kütüphanelerde nasıl uygulanabileceğini göreceksiniz. Standart kütüphane modülü std.algorithm önemli fonksiyonel programlama ilkellerini uygular, ancak sihir olmadan düz, basit D kodudur. Benzer şekilde, std.range tembel değerlendirme uygular, ancak yine oldukça basit bir D kodudur. Her paradigmanın ilkellerinde yer alan maliyetleri anlayacaksınız, çünkü D'nin metale yakın özellikleri, kaputun altında gerçekten olup bitenleri nispeten şeffaf hale getiriyor. Hatta C'ye benzeyen düşük seviyeli bir şey yazabilir ve daha sonra, aynı dilde, sihirli tutkal katmanları engellemeden güzel, yüksek seviyeli bir arayüz oluşturabilirsiniz.
Pseudocode.
Alandaki insanlar fikirlerini, çerçeveye veya sözdizimine özgü jargon olmadan tutarlı, yapılandırılmış bir şekilde açıklayabilmelidir. Algoritmanızı anlamak için köşeli parantezleriniz ve parantezleriniz arasındaki farkı bilmek zorunda olmamalıyım.
?? 'Un ne anlama geldiğini veya
grep anahtarlarının ne olduğunu bilmeme gerek yok.
Düz dilde yazın, ancak kod gibi yapılandırın ve biçimlendirin. Daha sonra herkes istediği dilde uygulayabilir.
edit: Bu cevap kısmen bazı programcıların sözde kod yazma yetersizliği tarafından motive edilir.
"Algoritmayı sahte kodda yaz"
"Bu da ne?"
Sahte kodun faydaları, programlama dışı paydaşların anlayabilmesidir. BA'ların ve kullanıcıların kodunuzu prova etmesini istediğinizi önermiyorum, ancak bir programcı olmayan gerekli algoritmayı anladığında yardımcı olabilir. Psuedocode
for (int i = 0; i < j; i++) açıklamasını ve esas olarak kazan plakası jargonunu açıklama ihtiyacını ortadan kaldırır.
Genel problem çözme becerilerini kazanmak için uygulanan programlama dillerinden bazıları ve programlama kavramları Logo ve Karel'dir, C/C++/Java/LISP/Perl/Assembly/herhangi bir programlama paradigması öncesinde öğretilmelidir.
Öğrenciler programlamaya çok pratik bir giriş yaparlar.
C.
Tabii ki, sadece eski bir prosedür dili değil, birden fazla dil bilmelidir. Ama tek bir derleyici ile ıssız bir adaya gitmek zorunda olsaydım, eski iyi gcc'imle giderdim. Düşük seviyeli programlamayı biliyorsanız yüksek seviyeli programlamayı anlayabilirsiniz. Bence tam tersi doğru değil.
İşlevsel bir şey, Haskell veya LISP benim ilk tercihim olurdu, ama belki Erlang. İşlevsel diller gerçekten nasıl soyutlamalar yapılacağını çok güçlü bir şekilde öğretir.