İlk programlama kursu için dil seçimi kriterleri


35

Üniversite düzeyinde bir CS eğitimcisi olarak, ilk programlama kursunda hangi programlama dilinin öğretileceği konusu tartışma için sıklıkla gündeme gelmektedir. Bir dil kampını diğeri üzerinde destekleyen çok sayıda dini ateş (veya ateş) arasında seçim yapabileceğiniz binlerce dil vardır. Her bir programlama dilini çevreleyen bu öznel önyargı, bir eğitimcinin bir dil seçmesini çok zorlaştırıyor.

Sorum şu:

Bir eğitimci birinci sınıf bir üniversite programlama kursuna temel olarak kullanılacak bir programlama dili seçmek için hangi nesnel kriterleri kullanabilir? Bu kriterlerin temeli nedir?

Not : Programlama dillerinin bir listesini ve neden kullanmanın en iyisi olduklarını görmek istemiyorum. Soru en iyi dil ile ilgili değil, bir dil seçmek için kriterler ile ilgili . Bununla birlikte cevaplar, belirli noktaları göstermek için programlama dilleri kullanmak olabilir.


Bu soru konu dışı sayılan başka bir sorudan ilham aldı: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .


1
Bu sorunun açık veya kapalı olup olmadığına ilişkin bir meta ipucu açıldı
Dave Clarke

7
<Patlamış mısır alın> Otto Neugebauer'den alıntı yapmak için : İnsanın bildiği ilk programlama dili herkesi mahvedemez.
JeffE

3
@Raphael: Bence Dijkstra'nın cevabı muhtemelen " İnsanoğlunun bildiği her programlama dili herkesi mahvedebiliyor ."
JeffE

2
@ edA-qamort-ora-y, evet, birkaç programlama paradigmasına maruz kalmaları gerekir. Hayır, ilk derste yapılamaz.
vonbrand

3
Biz vardı SMLo herhangi bir öğrenci elden önce o dili bilen olası çünkü basitçe. Bu, kursu başlatmak için her öğrencinin aynı seviyeye daha fazla veya daha az dengeli olmasını sağlar.
Markus Malkusch

Yanıtlar:


14

Bu konunun dipsiz bir çukur olduğuna inanmama rağmen kendi iki sentimi atacağım. Beni yanlış anlama, bence büyüleyici bir soru, ama muhtemelen burada herkesin memnuniyetini çözeceğimiz bir soru değil.

Özetle, dilin yapmasını istediğini , mümkün olduğunca basit ve açık bir şekilde yapmasını ve daha fazlasını yapmamasını söyleyebilirim .

Benim kendi tecrübelerim, birkaç kuşak birinci ve ikinci sınıf öğrencilerine Oberon programlama diliyle ders vermekten geliyor . Bu dili bilenler düşüncelerimdeki etkisini anlayacaklar Bu dilin "Algoritmalar ve Veri Yapıları" nı öğretmek için kullanıldığını unutmayın. O zamanlar (o zamanlar), işlevsel programlama ve nesneye yönelik tasarım, ikinci sınıftan itibaren ayrı derslerde öğretildi.

Önemli : Herhangi bir dilin özelliklerine girmeden önce, en önemli şeyin kursunuzun hedefleri hakkında kendinize ve öğrencilerinize kesinlikle açık olmak olduğunu vurgulamak isterim. Kendi başına programlama öğretiyor musunuz ? Veya algoritmalar ve veri yapıları? Veya yazılım mühendisliği? Bir dil seçmeden önce, nereye gideceğinizle ilgili bir an düşünmeye değer. Bu seviyedeki farklılıklar (hedefler) muhtemelen benim görüşüme göre, bu konuda en fazla anlaşmazlıklara neden olan şeydir.

Önemli olduğunu düşündüğüm noktalar, daha önce söylenmiş birçok şeyle örtüşebilir, ancak çoğunun, aşağıdaki dört kişiden birinin altkümesi olduğuna inanıyorum:

  • Basitlik : Öğrencilere genellikle herhangi bir özel programlama dilinin özelliklerini ve karmaşıklıklarını değil, programlama, algoritmalar ve veri yapıları öğretilir. Wirth, Oberon'un tasarımında yol gösterici bir ilke olarak "Mümkün olduğunca basit, ancak daha basit değil" ifadesini kullandı ve orada da bunu yapan başka birçok dil var. Seçtiğiniz programlama dili, dersinizde istenen tüm kavramları uygulayabilmeli, ancak bunu mümkün olan en küçük özellik / ayrıntılarla yapmalıdır. Programlama dili genellikle amaç değil, sadece bir araçtır.

  • Belirsizlik : Yakın bir basitlik kardeşi, mümkün olduğu kadar az örtüşmeyle, her konsept için bir yapı olmalıdır. Her kavramı uygulamanın tek bir "doğru" yolu olduğunu düşünün. Anlamsal olarak hepsi aynı şeyi yapan üç farklı döngü türü? Veya bir değişkeni arttırmanın on beş farklı yolu? İyi değil. Bu aynı zamanda ödevlerini düzelterek veya genellikle sadece öğrencilerinizin kodu anlamak yapar çok daha kolay. Öğretim görevlileriniz bunu takdir edecektir.

  • Taşınabilirlik : Öğrenciler Linux, Windows ve OSX makineleriyle sınıfa gidecekler ve programlama ortamı üçünün altında olabildiğince benzer (aynı) olmalıdır. Herhangi bir programın sonuçları da aynı olmalıdır. Bu, ev ödevlerini işaretlemekten ve soru / sorunlarla uğraşmaktan sorumlu öğretim görevlilerinin çok takdir edeceği bir başka nokta.

  • Endüstri tercihi : Cidden, bu konuda endişelenmeye başlamalıyız, ancak "Endüstri" kendisi en çok hangi programlama dilini sevdiğine karar verirse. Bilgisayarların icadı bu yana sürekli hareket eden bir hedef olmuştur. Şu an için eğer öğrencileriniz program yapmayı gerçekten öğreniyorlarsa, o zaman dile bağlı olmayacaktır. Bununla birlikte, endüstrinin bir standart üzerinde anlaşmaya vardığı bazı alanlar vardır, örneğin devre tasarımı için VHDL veya veritabanı sorguları için SQL, bu yüzden hala geçerli bir nokta.

Yine, bir dilin bu listeye nasıl uyduğunu öğretmeye çalıştığınız şeye bağlıdır!


4
Aslında VHDL ve Verilog arasında devre tasarımında bir bölünme var.
avakar

@avakar: Aw, kahretsin. Bunu cevabımda düzelteceğim, işaret ettiğiniz için teşekkürler!
Pedro

Yikes, bunu oku ve konuşmacılarımdan biriydi. Küçük harfli anahtar kelimeler anahtarının kullanımı otomatik olarak etkin olduğu sürece, Oberon için +1; yazmak bu kadar acı WHILE expr DO stmts ENDvb
Callum Rogers

3
"Kursun hedefleri neler?" İçin +1 ve ek bir not, yazılmamış olsa bile en yaygın hedeflerden biri, programlamayı ön koşul olarak alan diğer şeyler (dersler ve stajlar) için temel bilgileri vermektir.
AProgrammer

Önemli noktalardan biri (en azından bugün) öğrencilerin görsel olarak çekici programları yakında ve ağrısız bir şekilde oluşturmalarına izin vermesidir. Grafik yoğun uygulamalara ve oyunlara maruz kalıyorlar, doğal olarak bilgisayarların insanlarla nasıl etkileşime girmesi gerektiğini düşünüyorlardı.
vonbrand

13
  • Problemleri temel amaç olarak çözmek için algoritmik düşünmeyi geliştirmek: İlk derste nesne yönelimli bir paradigma kullanmakla ilgili bir kötü şey, yeni öğrenenler miras, polimorfizm, vb. Gibi şeylere alıştırmanın onları yukarıda belirtilen ana hedeften uzaklaştırmasıdır. Aslında, bu temel hedefin yanında, yazılım mühendisliği, taşınabilirlik, sektörün faydası vb. Gibi ikincil hususların getirilmesi, belirtilen nedenden dolayı tersine üretkendir.

  • Nesneye Yönelik Bir Dil Değil: Günümüzde çoğu üniversite nesne yönelimli bir dille programlama öğretmeye başlar. Bence bu bir hata. Dünyada ancak tam tersi olarak tam olarak anlaşılabilecek şeyler var. İşlemsel bir programlama paradigmasına maruz kalmadan (veriler ve programın iki ayrı yönü olarak işlev görür), nesne yöneliminin temel fikri (veri ve davranış özünde görülür. birbirine bağlı ) birçok kişi tarafından kaçırılabilir. Ve nesne yönelimli programlama çok önemlidir, çünkü temel fikrini kaçırmak küçük bir şey değildir. Ayrıca, büyük olasılıkla daha kıdemli derslerde CS öğrencileri temel olarak OO'da program yapacakları için, şeylerin usule ilişkin taraflarına da maruz kalmaları gerekir.

Bu yüzden, sonunda, algoritmik düşünme geliştirmeye odaklanan, gelişmiş özelliklerden kaçınarak, bir prosedürel dile giderdim. Ancak, gelişmiş özelliklerden kaçınarak, zorlayıcı sorunlardan kaçınmak istemem. Demek istediğim, zorlu problemlerde bile, öğrencilerden ilk prensipleri ve basit araçları kullanarak çözmeleri gerekmektedir.


Usul stilini göstermek için önce Java'nın bir alt kümesini kullanarak kolayca başlayabilirsiniz. Sonra Pandora'nın kutusunu açıp OOP ile aynı şeylerin nasıl göründüğünü göstermiş oluyorsunuz.
Raphael

3
@Raphael: Bir public static void main()sınıfın bağlamında olması gereken Java'dan kaçınmak imkansız . Bu, Java'yı bir dil olarak idealden daha az yapar, ancak elbette engel çok fazla değildir.
Dave Clarke

İyi bir IDE public static void main()çok uzun bir süre erteleyebilir . BlueJ, öğrencilerin mainiçinde hiçbir yerde tek bir program olmadan program yazmasına izin veren iyi bir IDE örneğidir .
Barry Brown

2
OOP ile ilgili sorun, programlamanın ilk yılında kapsanan oyuncak problemleri yelpazesi için, açık bir avantajı olmadan, tam da bu şekilde ortaya çıkmasıdır. Programlarınız bin satır olduğunda OOP önem kazanır (ve takdir edilir). “OOP'suz Java” korkunç, “bu şekilde yazılması gereken” pek çok tamamen şeffaf olmayan şey papağanlara değil, öğrenenlere karşı çıkıyor .
vonbrand

11

Bilgisayar Bilimi programındaki ilk programlama kursundan bahsettiğimizden, en önemli hususun, öğrencilerinize öğretecekleri CS'nin temel kavramlarının olacağını söyleyeceğim. Tüm kavramları aynı anda öğretebilecek bir dil olmadığından, daha fazla hangi kavramlara ihtiyaç duyulacağını düşünmeniz gerekir.

@ Kaveh'in endüstri alaka düzeyinin önemli olduğu görüşüne katılıyorum; Bu bonus olabilir, ama burada çok küçük bir öneme sahip. CS ilkelerinin sağlam bir temeli ile, sonraki derslerde "endüstriyel" bir dil öğrenmek nispeten kolay olacaktır.

Not olarak, ilk olarak seçilen dilden bağımsız olarak, öğrencilerinizi mümkün olan en kısa sürede başka, radikal olarak farklı bir dile tabi tutmak önemlidir.


1
Endüstri alaka düzeyi ikincil olarak kabul edilebilir, ancak bunun küçük bir sorun olduğunu sanmıyorum. Bu, programlama dersine bir giriş olduğu için, neden birindeki tüm kavramları öğretmek isteyeceğini anlamıyorum, genellikle programlamada ikinci bir kurs ve çeşitli dillerin tartışıldığı programlama dili konusunda bir başka kurs daha vardır. belirli uygulama alanlarına yoğunlaşan kurslar, örneğin web için programlama, vb.
Kaveh

@Kaveh: Bana bir teknik üniversitenin müfredatı gibi geliyor.
Raphael

6
"Öğrencilerinizi mümkün olan en kısa sürede başka, radikal olarak farklı bir dile tabi tutmak önemlidir." -- kesinlikle doğru. Öncelikle fonksiyonel programlamayı tanıtarak programlayabileceklerini düşünenleri daha yeni belirledik: hemen hemen hepsi bu paradigmada yeniydi ve görünüşe göre daha fazla maruz kaldığın C (++).
Raphael

3
@Kaveh: Gerçek Dünyada Yapılması Gerekenler için tasarlanan diller, kavramları öğretmek veya becerileri geliştirmek için mutlaka uygun değildir. Hedefler çok farklı.
JeffE

1
@Kaveh: Endüstride kullanılan dil bilgisinin önemsiz olduğunu asla yazmam. Demek istediğim, sağlam bir ilk programlama dili verildiğinde, daha sonraki derslerin, öğrencilere mezun olduklarında ne yapacakları hakkında bir şeyler öğretmede sorun yaşamayacaklarıdır. Birkaç giriş kursunu kendim öğretmenin bir parçası olarak (TA olarak), öğrendiğiniz becerilerin endüstride ihtiyaç duyulan hiçbir şey olmadığını söyleyebilirim (bunun için çok az zaman var). Bu durumda, onlara katı kavramlar vermeyi daha iyi buluyorum, böylece sadece $ DİL-programcıları değil, daha iyi programcılar haline gelebilsinler.
evilcandybag

8

Asıl endişem evrensellik , bu programlama dilini öğrenmenin öğrencinin çoğu programlama dilini idare etmesini sağlaması anlamında .

Pişman olduğum kadar, bu kriter saf işlevsel dilleri dışlıyor. Ayrıca dilin egzotik özelliklerini kullanmaması gereken kurs için de geçerlidir.

... ama bu sadece sağduyulu.


1
Haskell'deki gibi monadlarla, bu kriterlerin artık salt fonksiyonel diller için geçerli olmadığı tartışılabilir.
Dave Clarke

@DaveClarke: monad'lar fonksiyonel olmayan şeyler yapmanın çok güzel bir yoludur. Fakat bu şeyleri ilk önce doğrudan yerine monad tepegözüyle öğrenmek çok riskli değil mi? (Belki de değildir, bilmiyorum!)
jmad

2
@jdam: Muhtemelen haklısın. Sorun tek başına değil, genel olarak ve programcıya iyi hata mesajları sunmanın zorluğudur. Haskell çeşidi Helium bu konulara değinmiştir ve birinci sınıf öğrencileriyle başarıyla kullanılmıştır.
Dave Clarke

@DaveClarke: vay bunu duymadım. Bu çok havalı! Ne yazık ki bu Haskell'i öğrenmek için çok faydalı olsa da, bu başka dilleri öğrenmeye yardımcı olamayacağı sorununa değinmiyor.
jmad

4
@Ben: Benim hislerim manuel bellek yönetiminin bugünlerde bazı dillere özgü (ve bu durumlarda öğrendiğiniz) temel bir programlama şeyinden daha fazla olduğu bir şey. Buna katılmıyorsanız, o zaman C (veya C ++) 'ya işaret ettiğini sanırım.
jmad

8

İlk programlama dilini seçerken, göz önünde bulundurulması gereken birçok konu vardır. Bunların çoğu yukarıdaki cevaplarda göz önüne alınmıştır. Bu soruya ilham veren kapalı soruya verdiğim yanıtın bir parçası olduğu için 3 tane daha ekliyorum ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) . Şu anda kapalı soruları silme politikamıza dayanarak cevabımı buraya kopyaladım (ve değiştirdim).

Örnek olarak birkaç programlama dili kullanarak göz önünde bulundurulacak 3 nokta:

Büyük programlama, küçük programlama

Programlamayı ilk kez öğrenirken , büyük programlamaya yardımcı olacak mekanizmaları öğrenmek için ilerlemeye başlamadan önce küçük programlamayı öğrenmek gerekir .

Küçük programlayarak, 100'den az satır içeren programlar yazmayı kastediyorum. Bu programlar, basit veri yapılarını manipüle eden, basit kontrol akışına sahip ve basit problemleri çözecek algoritmaları içerecektir. Genelde başvuru sayılmazlar .

Genelde programlama yaparak, birçok istemci / bileşenden oluşan, bir API üzerine inşa edilen, bir GUI'ye sahip bir veritabanı, muhtemelen bir istemci-sunucu konfigürasyonunda büyük programlar yazmak anlamına gelir.

Bir programcının küçük programlamada düşünmesi gerekenler, büyük programlamada olduğundan çok farklıdır. Genel olarak programlama, programcının modülerlik, iyi arayüzler, iyi tasarım, yeniden kullanılabilirlik ve diğer birçok konu hakkında düşünmesini gerektirir. Modern programlama dilleri, genel olarak programa yardımcı olmak için birçok yapı sağlar. Bu yapılar sınıfları, modülleri, arayüzleri, bilgi gizlemeyi vb. İçerir. Küçük programlanırken bu konular çok daha az önemlidir.

C ++ gibi bir programlama dili, büyük ölçüde programlamaya yardımcı olacak birçok özelliğe sahiptir, ancak oturup oldukça basit bir program yazmaya başlamak daha zordur. Java benzer.

Öte yandan, Python, Ruby, Scheme veya Haskell gibi bir dil doğrudan bir program yazmayı çok kolaylaştırıyor.

Yüksek seviye vs düşük seviye

C ++ ve C gibi diller daha düşük seviyeli bir dildir. Programcının doğrudan belleğe referansları manipüle etmesini sağlar. Bu, birinin çok verimli bir kod yazmasına izin vermesine rağmen, düşük seviye ayrıntılarının ilk programcının dili öğrenmesi zor olabilir. Bazıları bu düşük seviyeli ayrıntıların sorunu çözmek için mantığı yazma yolunda olduğunu savunuyor.

Python gibi daha üst düzey bir dil, kavramları problem alanı açısından daha doğrudan ifade etmeyi kolaylaştırır.

Staticallly Typed vs Dinamik Typed

C ++, Haskell, Java ve daha birçok dilde statik olarak yazılmıştır. Bu, derleyicinin, koddaki her bir konumdaki beklenen değer türlerine bağlı olarak olası hataların meydana geldiği yerleri otomatik olarak bulduğu anlamına gelir. Statik yazmanın iyi bir şey olup olmadığına dair bir miktar dini savaş var, ama bundan uzak duracağım. Yeni programcılar için statik yazım ile ilgili bir sorun, derleyici tarafından bildirilen hata mesajlarının anlaşılmasının zor olduğudur. Bu özellikle C ++ şablonlarında ve genel olarak Haskell programlarında geçerlidir.

Python, Ruby ve Scheme dinamik olarak yazılmıştır. Bu, program çalışırken hataların algılandığı anlamına gelir. Birisi hataları tespit etmek için bunun çok geç olduğunu iddia edebilir (ancak bu tür hataları önlemek için sınamayı da kullanabilirsiniz). Yine, dini argümandan kaçınılarak, dinamik olarak yazılmış bir programlama dilinde basit programlar yazarken karşılaşılan hataların avantajı, bu nesnenin bu işlemin nasıl yapılacağını bilmediği türdendir . Küçük bir program bağlamında, bu hataların anlaşılması ve izlenmesi kolaydır.

C gibi dillerin zayıf yazımları vardır, yani derleyici bazı hatalarda yardımcı olsa da, çalışma zamanının geçersiz bellek erişimi gibi diğerlerini yakalayamadığı anlamına gelir. Sonuç olarak, programlayıcıya geri gönderilen hata mesajı "Program çöktü" ifadesine benzer. Dinamik olarak yazılmış bir dil bu hataları yakalar ve daha anlaşılır bir hata mesajına dönüştürür.

Diğerleri

Diğer diller için, programlama ortamının sağladığı destek, mevcut API'ler, kitapların kalitesi ve çevrimiçi öğreticiler vb. Gibi farklı konular ortaya çıkabilir.


Yürekten katılıyorum.
vonbrand

1
Ayrıca “statik vs dinamik türler” tartışması hakkında kendi tercihlerim de var. Ancak, genel bir CS programında, her ikisi de bir noktaya kadar öğretildiği sürece, düzenin çok önemli olmadığını düşünüyorum. Ancak madalyonun sadece bir tarafı verilirse, bu benim için büyük bir sorun.
chi

8

Giriş notu olarak, birden fazla dil sunma olasılığını göz önünde bulundurun (bir kursta). İlk dönemimde hem SML hem de Java gösterildi. Kontrastın kendine ait ve önemli bir mesajı vardı: iş için doğru aracı seçin.

Ama şimdi kriterler için, keyfi sırada.

Zorluk öğrenmek için öznel bir mesele, ama önemlidir: Eğer öğrenci dilini öğrenme üzerinde zaman harcamak istiyorum, ama üzerinde yok yapıyor onunla şeyler. Muhtemelen, Ruby gibi dinamik diller bu cephede kazanabilir: Onlara her şeyi besleyebilirsiniz ve internette mükemmel "kukla" öğreticiler var. Doğru hatırlıyorsam, daha önce programlanmayan öğrencilerin fonksiyonel dillerle diğerlerinden daha iyi sonuçlar elde ettiklerini gösteren çalışmalar da var.

Zenginlik : Dil (ler) öğretmek istediğiniz tüm kavramlar için yeterince zengin olmalıdır. Örneğin, üst düzey işlevleri tartışmak istiyorsanız, işlevlerin işlevsel diller veya Scala gibi değerlerin olduğu bir dile ihtiyacınız vardır.

Ölçeklenebilirlik : Şansınız, öğrencilerinizin kendi gösterdiğiniz dillerden daha fazla dil öğrenmemeleridir. Bu nedenle, seçtiğiniz dil (ler) in çalışmalarının seyri boyunca ölçeklenmesini istersiniz: evcil hayvan alıştırmalarınızı şimdi yazmaları gerekir, ancak daha sonra orta ölçekli bir projeye de saldırabilirler. Java ve benzer ekosferli diller burada iyi seçimlerdir.

Araç desteği : Bu ölçeklenebilirlik ile ilgilidir. Öğrencilerinizin dil ile üretken olmalarını beklerseniz / bu durumda iyi IDE'ler, yapım yöneticileri ve kütüphaneler mevcut olmalıdır. İnteraktif mermiler (Ruby, Scala) da özellikle yeni başlayanlar için iyi bir şey. Araçlar da tüm büyük platformlarda çalışmalıdır.

Belgelendirme : Muhtemelen aslında dili öğretmek istemezsiniz ama öğrencilerin (soyut) rehberliğinizle kendilerini öğretmelerini isteyin. Bu nedenle, iyi belgeler önemlidir. Tartışılabilir, bir dil ne kadar popüler ve kurulmuşsa, belgeler o kadar iyi olur. Örneğin, Scala'nın belgeleri oldukça zayıf (ancak iyileştiriliyor). Hoogle gibi araçlar bir artı.

Kullanılabilirlik : Aslında Matlab veya Visual C ++ kullanmayı öğreten insanlar var. Herkesin gerekli programları çalıştırabilecek bir lisansı ya da makinesi olmayabileceğini düşünün. Muhtemelen çeşitli platformlarda çalışan ücretsiz dilleri tercih etmelisiniz.

Temizlik : Muhtemelen öğrencilerinizin düşünme şeklini şekillendirmek istersiniz. Dil ne kadar karmaşıksa, düşünecekleri o kadar karışık; PHP'yi bir kursta asla teklif etmem. Genel olarak dinamik dillerin burada dezavantajları vardır: kötü alışkanlıkları bile bazen teşvik ederler.

Hangi kriterler sizin için diğerlerine göre daha önemlidir, ne öğretmek istediğinize de bağlıdır . Bu tam anlamıyla bir programlama kursu mu? Bir algoritma ve veri yapıları kursu mu? Programlama dilleri kavramlarını farklı paradigmalarda tanıtan bir kurs mu? Büyük yazılım geliştirme konusunda bir kurs mu?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... ya da her ikisi de sonsuza dek fonksiyon göstergeleri olan C veya Pascal. Pratikte, bu kriterin gerçekten ortaya koyduğu tek (ana dil) dil Java'dır.
Mason Wheeler

Yeni doğmuş bebeklere farklı sözdizimleri ve temel kavramların karmakarışıklığını öğretmeye çalışmak sadece beyin karıştırıcıdır.
vonbrand

6

Büyüleyici soru; Objektif kriterlere vurgunu sevdim. Birinci sınıf öğrencilerinin öğrenmesini istiyoruz:

programlama kavramları : İlk programlama dili şunları desteklemelidir: işlev çağrıları, yineleme, özyineleme

temel fikirler : İlk programlama dili dizileri desteklemelidir (hafızanın gerçekte nasıl çalıştığına ve işaretçilerin nasıl çalıştığına dair nazik bir giriş bölümündeki ilk adımlar için)

pratik programlama becerileri : hata ayıklayıcının nasıl kullanılacağı, profilcinin nasıl kullanılacağı, büyük problemlerin (üst seviye bir dil) nasıl çözüleceği, büyük sistemlerin nasıl bir araya getirileceği, problemlerin nasıl çözüleceği (problemlerin ayrıştırılması), nasıl yazılmaması gerektiği karmaşık kod, (genellikle şifreli) bir çalıştırılabilir ifadeler dizisinin arkasındaki amacın insanlara nasıl iletileceği

Önceden yazılmış kütüphanelerin sort () gibi şeyler için var olması ve nasıl kullanılacağı - yani, her şeyi sıfırdan yazmak gerekmediği gerçeğidir.

İlk dilin diğer kriterleri :

yorumlanır (hızlı geribildirim öğrenme sürecine yardımcı olur).

öğrenme, test etme ve hata ayıklamayı hızlandıran etkileşimli bir ortam.

Öğrencilerin bu dilde okuması için yüksek kaliteli kaynak kodu bulunur.

"okunması kolay", "doğal dile yaklaşan sözdizimi" (SourceCode'u okumayı ve notlandırmayı kolaylaştırmak için)

taşınabilir (Mac OS, Windows, Unix'te çalışır). Dilin en az bir özgür yazılım uygulaması.

öğretmek için hızlı, "çok az sayı" - örneğin, "[I] ilk önce Python'u, sonra da Java'yı ilk OOPL olarak Java yerine öğretmek için daha hızlı olmayabilir." - "Nesneye Dayalı Progamming Dillerinin Karşılaştırılması" ve Teleskop Kuralı

Matthias Felleisen başlangıç ​​seviyesindeki izleyicilere yönelik hata mesajları ile bir programlama dili geliştirdi. Belirli bir dil seçiminin, iyi bir tasarım metodolojisi öğretmek kadar önemli olmadığını vurgulamaktadır. Aslında, ilk CS dersini Liberal Sanatlar sınıfı olarak görüyor, eleştirel düşünme, problem çözme ve detaylara dikkat etmeyi öğretiyor.

ikinci bir programlama dili için kriterler

Öğrencilerin öğrenmesini istediğimiz şeyler ama belki de bu ikinci programlama dilini bekleyebilir:

"çok ezoterik olmayan" bir "ilgili" dil; "Sektörde popüler" bir şey

Karmaşıklık teorisi: mevcut teknoloji ile imkansız olan görevlerin nasıl tanınacağı.

üst seviye malzeme: iş için doğru aracı nasıl seçer, bir derleyici nasıl kullanılır, yapılar, nesne yönelimli programlama, işlevsel programlama, mantıksal programlama, derleyici tasarımı, oluşturma ve düzenleme işlevleri (Lisp / ML anlamında), eşzamanlı ve dağıtık programlama,

Düşük seviye malzeme: pointer aritmetik, bilgisayar mimarisi. bellek yönetimi, yığın çerçeveleri, montaj programlama, makine mimarisi, aygıt sürücüleri ve işletim sistemi tasarımı (böylece makine "nüfuz edemeyecekleri ürkütücü bir kara kutu gibi görünmez")

EDIT: Diğerleriyle işbirliği içinde yazdığım bir şeyin özetini "yasal bir yazı olmayabilir" diye hayal kırıklığına uğrattığımı hayal ediyorum.

Bu yüzden önceki gayrı resmi bağlantıya daha resmi bir alıntı ekleyerek adil kullanıma uymaya çalışıyorum ve diğer wiki telif hakkı sorunlarına .

Bu cevap, Portland Örneği Deposundaki Birinci Sınıf Dilinin (Anon 2011) özetidir .

(Anon 2011) Birçok isimsiz ve diğer yazarlar. "Freshmans İlk Dil". Portland Desen Deposu. 27 Eylül 2011. http://c2.com/cgi/wiki?FreshmansFirstLanguage .


Orijinal yazarlara içeriklerini çoğaltmanıza izin verilip verilmediğini kontrol ettiniz mi? Kaynak kurumsal bir web sitesidir ve içeriğin ücretsiz olduğuna dair bir bildirim bulamadım, bu nedenle bu yasal bir yazı olmayabilir!
Raphael

1
@Raphael Kaynak bir wiki'dir (bu nedenle potansiyel olarak birçok farklı yazarı vardır). Bu materyalin yazarı (herhangi bir ortak yazar) buraya eklenmesini istemiyorsa, [bu sayfanın altında listelenen iletişim adresine] bir DMCA alındı ​​bildirimi göndermelidir (mailto: team+cs@stackexchange.com) . Ayrıca, bilgiler yalnızca ifade edildiği şekilde telif hakkı kapsamında değildir. WordsRunTogetherWikiWikiStyle'ın yeniden düzenleme ve Kaldırma işleminin bir kısmı bu cevabı geliştirir ve telif hakkı ihlali riskini ortadan kaldırır.
Gilles 'SO- kötülük'

1
+ İyi cevap, ama seçmem gereken bir nit var - profiler. Arkasında teori yok - sadece “ortak bilgi”. Akademisyenler arasında genellikle bulamadıkları birçok sorun olduğu ve başka bir tekniğin olmadığı takdir edilmez. Bu bağlantıyı kontrol et.
Mike Dunlavey

5

Bence basitliğin ve öğrenmenin kolaylığının temel kriterlerden biri olduğunu düşünüyorum. Programlamaya giriş niteliğinde bir kursta gereksiz programlama engellerinden kaçınmak ve mümkün olduğunca programlama ve algoritmik problem çözme prensiplerine odaklanmak istiyoruz. Birinci sınıf öğrencileri genellikle problemler hakkında algoritmik olarak düşünme kabiliyetinden yoksundur, bu yüzden kurs algoritmik düşünme öğretimi hakkındadır.

Diğer bir kriter, sektördeki dilin faydasıdır. Endüstride kullanılmayan bir dili öğretmek istemeyiz. Öğrencilerin açık bir çoğunluğu endüstride çalışacak, bu nedenle endüstride ne kullanıldığına (ve öğrenciler mezun olduğunda kullanılacak) dikkat edilmeli.

Üçüncü kriter, öğrencilerin daha sonraki yıllarda alacağı dersler olacaktır. Kurslar, özellikle de zorunlu kurslar kendileri için tasarlanmamış, diğer kurslarla koordineli olarak düzenlenmiştir.

Şu anda düşünebildiğim son şey, jmad'in cevabıyla aynı, dilin diğer önemli dilleri öğrenmede kolaylık sağlamalıdır. Yeterince zengin olmalı ve daha sonraki önemli dilleri toplamak kolay olacaktır (burada, öğrenciler açısından önemli olan önemli araçlar).

Birçok üniversitenin ana programlama derslerine Java / C ++ / C'den Python'a geçiş yaptığını düşünüyorum, ancak zaman zaman diğer dillerde de programlamaya giriş sağlayabilirler (genellikle bilgisayar mühendisliği bilmeyenler için, örneğin elektrik mühendisliği için C) eğitmen arada sırada başka bir dil öğretmek istiyorsa esneklik gösterebilirler.


3
Girişsel bir programlama kursunda, endüstride işe yararlığı çok fazla değerlendirmedim. Vahşi doğada başarılı bir programcı muhtemelen kariyerleri boyunca bir kısmı dil öğrenmek zorunda kalacak, bazıları ise "işte", bu yüzden yeni dilleri alıp öğrenebilme becerisi öğretilmesi gereken önemli bir beceridir. Sonuç olarak, üniversite dili dersinde ilk dilin öğretilmesinin, mezun olduklarında mutlaka en kuvvetli olmasını beklemem.
Ben

1
@Ben: Öğrencilerin CS konusunda büyük bir başarı elde etmemesi durumunda endüstride işe yararlık özellikle önemlidir. Pek çok insandan geldiğimde biyoloji ya da diğer bilimler üzerine çalışmaya gidiyorum ve birçok dili öğrenmek için nasıl zamanları olmayacağı göz önüne alındığında, Python gibi ekosistemlerinde yaygın olan bir şeyi öğrenmek muhtemelen ML, Java ya da C'den daha yararlı olacak.
hugomg

1
Endüstriden biri olarak (belirli bir endüstri, mutlaka temsili olmak zorunda olmayan biri olarak) konuşan, sektörün ilgisinin gelecekteki seviye-1 programcıları için bir faktör olduğunu düşünmüyorum. Birden fazla paradigmaya maruz kalmak, etki alanımda (gömülü programlama) çoğunlukla C kullanıyor olsak bile, programcıları daha iyi hale getirir. Dilin belli başlı özellikleri bir el kitabında öğrenilebilir, genel kavramlar okulda daha iyi öğretilir. Rastlantısal programcılar için (örneğin bilim adamları) öncelikler farklıdır - ancak Fortran'a çok fazla odaklanmak, kullanmaları gereken şeyleri yaparken insanların Numpy'yi görmezden gelmesine neden olabilir.
Gilles 'SO- kötülük'

5

Öyleyse, derhal sarsıntı tepkimden hemen kurtulacağım, bu yüzden herkes SICP üzerinden programlamayı öğrenmeli , çünkü Lisp Doğru Şey.

Dil seçimi için zaten sunulan birçok iyi kriter var ... basitlik ve taşınabilirlik en önemliler arasında yer alıyor. Ancak, programlamaya yeni başlayan öğrencilerin, modern dillerin olduğu sahnelerin gerisinde neler olduğu hakkında yanlış bir fikir edinmemek (veya hiçbir fikrim yok) için çok önemli olduğunu düşünüyorum.

Bu yazıların bazıları mükemmel kriterler sunsa da, 'kriterlere uymanın' neye benzediğini göstermek için belirli bir dili kullanmak istiyorum.

Bu endişelerden bazıları Joel Spolsky'nin blog yazarı The Perils of JavaSchools'da (deneyebileceğimden çok daha iyi) ele alındı . Java veya Python gibi dilleri seçmek, CS'deki daha zor (ve en hayati) kavramlardan ikisini kapatır; yani, işaretçiler ve özyineleme.

Tabii ki, C'de bir intro kursunun öğretilmesi inanılmaz derecede yoğun olacak ve muhtemelen özyinelemeyle ilgili birçok önemli kavram eksik. Aynı şekilde, Lisp'te verilen bir kursun, kapakların altındaki işaretçilere hitap etmesi carve cdrbağlantılı listelerle ilgili önemli kavramları ima etmesinin yanı sıra , dilin detayları ele almasına izin vermesi gerekecektir.

Temel olarak, elde ettiğim şey, öğrencilerin pratik uygulamaların yanı sıra veri yapılarının ve algoritmaların temellerini anlamaları gerektiğidir.

Ben de öneriye katılmıyorum değil bir nesne yönelimli dil kullanmak. Nesne yönelimli dillerin gerçek dünyayı modellemeye yararının, empedans uyumsuzluğu açık bir şekilde anlaşıldığı sürece ve nesne yönelimli diller arasında bir paradigma olduğu sürece, yeni programcılar için olumlu bir varlık olduğunu düşünüyorum.

Ruby'nin (başka bir gönderinin de önerdiği gibi) önerilen bir programlama kursuna giriş için kullanılacak bir dilde aramak için birçok niteliği örneklediğini öne süreceğim.

Bir an önce bu iddiayı haklı çıkaracağım, ama önce CS derslerinde beni rahatsız eden bir eğilim hakkında yorum yapmak istiyorum. Birçok okulda olduğu gibi, yakın zamanda giriş kursları için Python'u kullanmaya geçen bir üniversitede çalışıyorum. Python'un yeni bir TEMEL olduğuna ve dilin eğiliminin yakın zamanda başka yerlerde de belirttiğim gibi güç ve dışavurumda yeni bir dostluk seçmek olduğuna kesinlikle inanıyorum . Bu bir kötüye kullanımdır ve şu anda olacakları değil, olacakları programcıları düşünmemiz gerekir.

Her neyse, Ruby'yi bir tanıtım dili olarak haklı çıkarmak ...

  • Yakut, kuyruk çağrısı optimize edilmese de, özyinelemeyi oldukça iyi yapar. İşte bu var.
  • Ruby çok paradigmadır. Her ne kadar saf nesne yönelimli bir dil olsa da, işlevsel programlamanın yanı sıra, bazı zorunlu C türevli eğitim tekerleklerinin üzerine oturtulmasını da kapsar. Bunu, bazı sabitlenmiş OO'larla (cıvatalar gösteriliyor olsa da) prosedürel bir dil olan Python ve bazı fonksiyonel unsurlar (Python'un BDFL'sinin tekrar tekrar çıkarmaya çalıştığı ) ile karşılaştırın.
  • CRuby (MRI veya 'Ruby Classic') C dilinde yazılmış ve genişletilmiştir. C malloc()dilinde dili genişletmeyi öğreterek öğrencilere işaretçiler, bellek yönetimi ve dehşet tanrısı hakkında bilgi verebilirsiniz .
  • Yüksek düzeyde ve dinamik bir dil olduğu düşünüldüğünde bile, veri yapıları, türleri vb. Hakkında çok şey öğretebilirsiniz; Kırmızı-siyah ağaçlardan ördek yazarak tuhaf şeyler yapmaya kadar hayal edebileceğiniz bir şey için kütüphaneler (taşlar) vardır.

Her neyse, profesyonelce kullansanız da kullanmasanız da, birçok paradigmadan pek çok dili öğrenmek için bir alternatif yoktur. Temelde, herkesin gerektiğini düşünüyorum anlama değilse, kullanmak C ve Lisp'i. Ruby, tanıtım dönemi için aklıma gelen en iyi uzlaşma.

Her neyse ... bu benim ABD Dolarım 02. Sizi Ruby'yi kullanmaya ikna etmeye çalışmıyorum, aklınızdan çıkarmayın ... sadece bir giriş kursunu öğretmek için bir dilde aramak için nitelikleri örnek olarak kullanın.


2
"Python'un yeni BASIC olduğuna kesinlikle inanıyorum" - şunu kopyalayın. "CS'deki zor (ve en hayati) kavramlardan ikisi; işaretçiler ve özyineleme" - İşaretçilerle açıkça ilgilenen bir dili hiçbir zaman öğrenmedim ve hiçbir şeyi kaçırmadım. Derleyicilerin nasıl çalıştığını öğrendiğimde, işaretçiler yeterince hızlı bir şekilde açıklanmıştır.
Raphael

Bir çok paradigma dilinin kendi katsayısına sahip olduğuna katılıyorum (ikisine "saf" dilleri öğretmek daha iyi olabilir), ancak Ruby'yi bu nedenle seçmeyeceğim. Daha iyi bir meslek için diğer diller, imho, özellikle temel kütüphaneye göre. Örneğin, Scala değişmez koleksiyonların bir kütüphanesine sahiptir.
Raphael

3
Ayrıca Python'un yeni BASIC olduğuna inanıyorum. Peki neden Python'a karşı bir tartışma ?
JeffE

1
@Raphael, işaretçiler, yalnızca çok fazla şey çözülmediğinde ve dizilerle kafa karıştırıcı bir ilişki içinde olduklarında sizi işaretçilere maruz bırakmaya zorlayan C ile başladığınızda zordur. Kendime Pascal öğrettiğimde işaretçiler benim için zor değildi. İşaretçiler sınıfımdakilere Algol 68'de öğretilen insanlar için zor değildi (orada referans olarak adlandırılıyorlardı, ancak Java'da olduğu gibi başka bir isimle işaretçiler; Algol 68'de zor olan otomatik kuralsızlaştırma kurallarıdır), C alt kümesini öğreterek başlamazsanız, işaretçiler C ++ ile bile zor olmaz.
AProgrammer

1
@DaveClarke: Bunlar için oluşturduğundan daha fazlası olan boşlukla girintiler.
Raphael

5

İlk programlama dilim oyuncak bir montaj diliydi. İkincisi Fortran'dı. Arasında, bir Algor 60 olan kabaca bir "algoritma" gösterimi öğrenildi. Aslında, bana öğretilenin oldukça mükemmel olduğunu düşünüyorum.

İşlevsel programlamaya ilk baktığımda, araştırma yazılarında uygulamalı bir dilde olmasam da "vay, bu tamamen farklı. Oldukça matematiksel!" Oldum. Fonksiyonel programlama dersi alan çoğu insan hala aynı "vay" tecrübesine sahip. Bence bu harika.

Bence zorunlu programlama ve fonksiyonel programlama dünyaya bakmanın tamamen farklı iki yolu. Onları bu farklı deneyimlerden arındırırsak öğrencilerimize zarar veririz.

En iyi ilk programlama dili mümkün olduğu kadar basit ve mümkün olduğu kadar açık bir şey olmalıdır, böylece öğrenciler nasıl net bir şekilde düşünebileceklerine odaklanabilirler. Ne yazık ki montajın sadeliği ve netliği, Fortran ve Algol 60, günümüz programlama dillerinin çoğunda eşsizdir. Haskell iyi bir istisnadır. Fakat Haskell, ideal ikinci programlama dilimi yapar, ilk değil. Eyfel veya Oberon belki de tasarıya uygun olabilir.


5

At Fen ve Matematik North Carolina School , biz yeteneği kısa yazmayı düşünüyorum, çünkü prosedürel programlama öğretmek için kullanabilirsiniz 2004 yılından bu yana Python öğrencilere girmiştik, doğru prosedürler, ağır araçlarla daha sonra ilerleyen OO dahil etmek önemlidir programlama.

Bu sebeplerden hoşlanıyoruz.

  1. Python serbest formatlı bir dil değildir. Öğrencileri, kodlarını girintiyi kullanarak bloklara yazmaya zorlar. (Teknik not olarak, vim metin editörünü kullanıyoruz ve [set tabstop=4 set et rahatsız edici sorunları gidermek ve kod girintilerinin farkedilebilmesi ancak çirkin aşırı yatay kaymaya neden olmamak için .vimrc'ye ] ). Öğrencilerimiz boşluklarla ayrılmış programların hiyerarşik yapısını görmeye alışırlar. Sonuç olarak, biçimlendirme alışkanlıkları diğer dillerde programladıkları için çok iyi olma eğilimindedir.

  2. Python'un sözdizimsel basitliğini acemi dostu yapar. Basit programlar, en az arcane anahtar kelimeleri ve büyülü teşviklerle yazılabilir. Normalde denemek için programlama yapmayı düşünmeyen bir öğrenci istiyoruz. Python'un güzel sadeliğine dikkat edin hello.py; ne olduğu çok açık.

  3. Python dinamik olarak yazılmıştır ve ördek yazılmıştır. Bu değişkenleri tanıtmayı kolaylaştırır. Öğrencilerime değişkenlerin sadece etiketler olduğunu söylüyorum. Nesneleri işaret ediyorlar. Birisi sizi telefonla arayarak size bir mesaj gönderdiği gibi değişken adını kullanan bir nesneye mesaj gönderirsiniz.

  4. Python, hırslı öğrencilerin geçemeyeceği bir araçtır. Yararlı şeyler barındıran karmaşık kütüphanelere sahiptir. Yeni başlayanlar için erişilebilir güçlü bir yaratıcı araçtır.

  5. Python ücretsizdir ve tüm büyük platformlarda çalışır. Okulumuz her türlü makinenin bulunduğu heterojen bir işletim sistemidir. Uyumluluk sorunları gibi baş ağrıları hakkında endişelenmemize gerek yok. Hemen hemen herhangi bir bilgisayarda çalışacak.

  6. Python'un mükemmel belgeleri var. Öğrencilerimizi çizgilerin dışını keşfetmeye, inceltmeye ve renklendirmeye teşvik ediyoruz. Python belgelerini erken kullanmayı öğrenirler ve çoğu zaman ders dışında harika şeyler keşfederler.

Python'dan çok memnunuz.


1
Hoşgeldiniz! Bu güzel bir vaka çalışması, ancak seçim kriterleri sonrasında soruyu cevaplamak için çok az şey var, imho. Öğelerinizi geriye doğru okumak, bunu yapabilir, ancak bu şekilde mi tasarladığınızdan emin değilim.
Raphael

Belirli bir sipariş tasarlanmamıştır. Bu bir "ve".
ncmathsadist,


1

TL; DR: Buna nesnel olarak cevapvermenin bir yolu yokçünküarkasındaki kriterler için nesnel bir temelyok. Mavinin, nesnel olarak , kırmızıdan daha "renkli" bir renk olup olmadığını veya vanilyalı dondurmanınçikolatadan nesnel olarak "daha lezzetli"olup olmadığını tartışmaya çalışmak kadar keyfidir.


Bence zaten harika yazılar var ama kendi 2 sentimi ekleyeceğim.

Bir eğitimci birinci sınıf bir üniversite programlama kursuna temel olarak kullanılacak bir programlama dili seçmek için hangi nesnel kriterleri kullanabilir?

Bu soru, bir dondurma mekanını ilk kez ziyaret ederken başka birinin denemesi gereken ilk dondurma lezzetini objektif olarak seçmenin bir yolu olup olmadığını sormaya benzer . Hayır, doğası gereği öznel olan bir şeyi seçmenin nesnel bir yolu yoktur .

Niye ya? Çünkü Pedro'nun cevabında belirtilen makul ölçütlere baktığımızda bile , herkes yine de her bir faktörün başkasının görüşlerine karşı "nasıl dayandığı" konusunda öznel bir görüşe sahip olacak .

Örneğin, Ruby nesnel olarak Python'dan daha basit midir? Hangi anlamda daha basit? Neye göre? "Basit" sizin için ne ifade ediyor ? "Daha az kod satırı" anlamına mı geliyor? "Okumak ve anlamak daha kolay" mı demek? Ya diğerleri? Neden birileri burada belirli bir seçimle aynı fikirde? Bu soruyu nesnel olarak cevaplayabileceğimizi sanmıyorum .

Bu bir sonraki soruya yol açar.

Bu kriterlerin temeli nedir?

Bazı kriterler olabileceği kadar makul, bunun her şeyden çok öznel tercihlere dayandığını düşünüyorum . Örneğin, Pedro’nun basitlik , açıklık , taşınabilirlik ve endüstri tercihini , bazılarının ne kadar makul olduğunu düşünmeksizin , basitlik , açıklık , taşınabilirlik ve sektör tercihlerini kabul etmem için hiçbir neden yok . Aslında, endüstri tercihi tanım gereği özneldir ve kısır bir döngüye yol açacaktır. (Herkes bu konuda eğitim alır, böylece herkes endüstride kullanır, bu yüzden herkes bu konuda eğitim alır, ...)

Örneğin, neden olmasın

  • Verimlilik: Uygulama zamanları ve hafıza alanı gerçekten ölçülebilir.
  • Boyut: Mümkün olan en az sayıda ayrılmış sözcük, dilin öğrenilmesini kolaylaştıracaktır.
  • Özellik Kümesi: Daha geniş bir dizi destek özelliği (örneğin, lambda, jenerik, nesne yönelimi, operatörün aşırı yüklenmesi, vb.), Dilleri değiştirmek ve kare haline geri dönmek zorunda kalmadan daha fazla kavram öğretmenizi sağlar.
  • Birlikte çalışabilirlik: Diğer dillerle ve yerel sistemlerle (örneğin C # veya Python'dan Win32 API vb.) Çalışmayı kolaylaştıran bir dil, daha iyi ve uzun vadeli bir yatırım olarak yükseltilebilir.

Mesele şu ki, farklı bir değerlendirme kriteri ortaya koyabilirken ve yine de makul kabul edilebilecekken, nesnel olarak başka birininkinden daha düşük / düşük olduğunu iddia edemeyiz .

Sonuç olarak, kriterler için nesnel bir temel yoktur . Mavinin, nesnel olarak , kırmızıdan daha "renkli" bir renk olup olmadığını veya vanilyalı dondurmanın olup olmadığını tartışmaya çalışmak kadar keyfi nesnel çikolatadan lezzetli .

Bu, tercihlerinizi haklılaştırmak için iyi sebeplere sahip olamayacağınız anlamına gelmez , ancak günün sonunda, onlar sadece sizin tercihlerinizdir.

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.