Scheme neden üniversitedeki ilk dilim?


80

Her gün insanlar bilgisayar bilimi hakkında konuşmaya başladığında C, C ++, Java'yı duyuyorum, ancak ilk bilgisayar bilimi dersimde Scheme'de yazmam isteniyor (DrRacket).

Neden?

Bu benim gelecekteki programlama anlayışımda ne gibi farklılıklar yaratacaktır?

GÜNCELLEME: İlk dönemimi bitirdim, fakat tamamen Scheme ile bitmedim. İkinci terimde (ki şimdi) C programlamaya başladık. İlk başta işaretçiler öğrenmek hayal kırıklığına uğradı, ama şimdi daha iyi hissediyorum.

Bundan daha fazla söylenecek bir şey yok. Eksik olduğum OOP kısmı için kendime Java (veya C ++?) Öğretmeye çalışıyorum. Şimdiye kadar, hala en iyi işlevsel programlama seviyorum. Lambda sadece büyüleyici. :)


148
Tebrikler, (bana) aslında bilgisayar bilimleri öğretmeye çalışan okullardan birkaçına gidiyormuşsunuz gibi geliyor. İlk dil olarak Öğrenme Programı (IMO) çok iyi bir şeydir. Hayır, diğerleri kadar ticari değildir, ancak bilgisayar biliminin gerçek özünü öğrenmek için mükemmel bir dildir.
Jerry Coffin

21
C, C ++ ve Java, bilgisayar bilimlerinin yan ürünleridir. Scheme'nin tüm kökleri bilgisayar bilimlerinde. Ticari kullanımdaki dillerin, McDonalds'ın mutfağı ile yaptığı kadar bilgisayar bilimi ile de ilgisi var.
JasonTrue

33
Bu adamlar doğru; Eğer karıştırıyorsun bilgisayar programlama ile bilgisayar bilimleri - Dijkstra dediği gibi, o astronomi ile kafa karıştırıcı teleskop yapımı gibi. Program, bilgisayar bilimindeki temel kavramları öğrenmek için en iyi dil hakkındadır . Bilgisayar bilimi diplomasına sahip olmanın Java'da iş kolu uygulamaları yazmayı öğrenmekle ilgili olduğunu düşünüyorsanız, yanlış programa kayıtlı olabilirsiniz.
Eric Lippert

29
Aynı nedenle, zooloji kursları, bir fil duraklatmasını engellemek yerine evrimsel biyoloji, anatomi ve hayvan davranışlarını öğretiyor
jk.

4
Scheme'nin temel sözdizimini anlama konusunda ayaklarınızı altında tuttuğunuzda, “The Little Schemer” yazmayı deneyin. İnce bir kitaptır, ancak içindeki her şeyi anlayabiliyorsanız, işlevsel programlama dillerinin temellerini gerçekten anlayacaksınız.
Eric Lippert

Yanıtlar:


91

Harika bir okula benziyor! Lisp lehçeleri, algoritmaların matematiksel paradigmasını çok daha yakından takip eder. Programcıları özyinelemeyi ve işlevsel stili öğrenmeye zorlarlar. Bu mükemmel bir deneyim. Okulunuz hala gerekli olan CS 6.001 için Abelson ve Sussman kullanan MIT ile saflarda.

Bu makaleyi konuyu anlama konusunda cesaretlendirici ve yararlı bulabilirsiniz .


6
"Zorla" muhtemelen kullanmak için iyi bir kelime değildir. "Tren" nasıl?
Barry Brown

4
Aslında, MIT'nin EECS müfredatında son birkaç yılda önemli değişiklikler oldu. Giriş kursları şimdi iki kursa ayrılmıştır ( ilk yarı için mit.edu/6.01/mercurial/fall11/www/index.html bakınız ) ve dil eğitiminin çoğunluğu Python'dadır.
jonsca

4
Düzenin harika bir dil olduğu ve bunu öğrenmek için iyi bir fikir olduğu konusunda hemfikirim. Ancak bununla yüzleşelim; hemen hemen her gerçek dünyadaki programlama işi zorunlu bir dil kullanır; En gerçekten ciddi programlama işleri C ++ gerektirir ve C ++ programcıları genellikle aktif vazgeçirmek ya da bu sebepten program tasarımı için tüm güzel matematiksel temelli fikirleri kullanmanızı. Zorunlu programlarınızda özyineleme büyük bir rol oynamaz.
Felix Dombek

4
@FelixDombek, emin misiniz? Tüm fikirler? Gerçekten mi? Zorunlu bir döngü de matematiksel bir fikirdir, sakıncası var.
SK-mantık

3
@FelixDombek, C ++ ' da kuyruk özyineleme yerine yinelemeyi kullanmak için sadece bir neden görebiliyorum . Diğer tüm özyineleme biçimleri, işlevsel dil uygulamalarında olduğu gibi aynen sunulur. Bu yüzden sözüne kesinlikle katılıyorum. C ++ kodlamanıza ne kadar çok matematik harcarsanız, o kadar iyidir. Söylemeye devam etmeden, kırmızı ++ siyah ağaçları C ++ 'ta uygulamaya çalışacağınızdan şüpheliyim.
SK-mantık

37

Hiç kimse bir birinci sınıf öğrencisi olarak gerçek bir iş bulmak için herhangi bir dilde yeteri kadar yetkin olacağınızı beklemiyor, peki neden öğrenmesi kolay olan biriyle başlamıyorsunuz? Acemilerden profesyonel bir IDE'de profesyonel bir dil kullanarak programlama öğrenmelerini beklemek bir nevi birinci sınıf tıp öğrencisine neşter vermek ve canlı bedenler üzerinde çalışmalarını sağlamak gibidir.

Endişelenme; Sonunda Java / C / C ++ 'ı öğreneceksiniz, muhtemelen ikinci yılınıza başlayacak. Java 6'yı şimdi öğrenmeye başlarsanız, mezun olduğunuzda Java 8 çıkacaktır. Yoksa Python ile değiştirilmiş olacak. Ya da henüz icat edilmemiş fakat sektörü fırtınayla ele geçiren başka bir dil. "Popüler" şeyleri mümkün olduğunca öğrenmeyi ertelemek daha iyidir, bu nedenle işgücüne girdiğinizde eski değildir.

Şema / Raket önemli kavramlara odaklanmanıza yardımcı olacaktır: algoritma tasarımı, veri yapıları ve bilgi manipülasyonu. Bilirsin, tüm diller için ortak olan şeyler.


36

Tebrikler, şimdi bilgisayar dünyasındaki bir veganın eşdeğerine dönüşüyorsunuz ve iki yıl içinde insanları ayağa kaldırdığınız yüksek ahlaki zeminden haberdar etmeden herhangi bir tartışmaya katılamayacaksınız . ;)

Neyse çok iyi bir okula gittin. Endüstri çırpmayan okullar iyidir.
Başka birinin dediği gibi, size zanaattan türettiğiniz bilimi öğretiyorlar .

Pek çok kötü kod maymunu çiftliği size zanaat öğretir ve bundan sonra bilimi ondan çıkarabilirsiniz, ancak bu garanti edilmez. (ve bu konuda oldukça garip yanılgılarla sona erebilir)

Neyse, işlevsel kalabalığın onurlu bir üyesi olarak, oradan çıktığınızda, her zaman yanlış anlaşıldığını ve takdir edilmediğini hissedeceksiniz .

Kabul edelim ki, ortalama bilgisayar sihirbazı yeni değil.

Şu an için yüksek risk altındasınız:

  • akademik bir kariyere katlanmaya çalışmak ,
  • doktora peşinde koşmak ,
  • ... emacs .

Muhtemelen açık kaynaklardan da hoşunuza gidecek, ancak işlevsel projeleriniz için asla yeterli sayıda ortak çalışan bulamayacaksınız.


2
Üzgünüm, yorum yapmak için ama neden emacs? Merak ediyorum. OP ile aynı teknedeyim (bu sonbaharda üniversitenin birinci sınıf öğrencisi) ve Racket'i kullanacağız (Scheme'ye benzer).
Kevin Johnson,

2
@KevinJohnson emacs, LISP'de yazılmış ve yanlışlıkla birçok kişinin kod düzenlemesine yardımcı olan bir işletim sistemi olarak adlandırılır . İşlevsel paradigmalar yaparsanız ve LISP benzeri sözdizimlerinin müstehcenlikleri gibi (onlara öğretilirse) , tercih ettiğiniz metin editörünüz olarak muhtemelen sizin üzerinizde büyür.
ZJR

1
"size zanaat türettiğiniz bilimi öğretin": +1
Giorgio

23

Bu benim gelecekteki programlama anlayışımda ne gibi farklılıklar yaratacaktır?

Bu Shakespeare'i okumanın, dönem ödevleri yazmanıza nasıl yardımcı olacağını sormak gibi bir şey. Programlama (herhangi bir dilde) sadece fikirlerinizi yürütülebilir biçimde ifade etmenin bir yoludur. Bilgisayar bilimi size söylenecek ilginç bir şey verecek kavramsal yapı taşlarını sağlar. Düzen sözdizimi nispeten basittir, bu nedenle hızlı ve ilginç derleyici hataları, standart kütüphaneler vb. İle karşılaşmadan ilginç fikirlere erişebilirsiniz.

Sınıfta dikkat edin - bu dönem çok ilginç şeyler öğreneceksiniz.


14

Önceden hiçbir deneyimi olmayan programlamada çok yenisiniz. Öyleyse işte bazı açıklamalar:

Neden Şema ve C / C ++ / Java ... değil?

Bir programlama dili öğrenirken (İngilizce ile bir analoji yapılabilir) , kodunuzun gramatik olarak doğru olması için takip etmeniz gereken sözdizimini öğrenirsiniz . Ancak bir dil size problem çözmenin ardındaki mantığı öğretmeyecektir . Bu mantığı öğrenmek için farklı programlama paradigmalarını öğrenirsiniz .

Her dil bir veya daha fazla paradigma (az ya da çok doğru) uygulayabilir. Bir paradigma, mantığınızı yapılandırmanın bir yoludur ve Şema tarafından uygulanan paradigmaya İşlevsel Programlama (FP) adı verilir .

Yani sorduğunuz asıl soru şudur: Neden FP?

Bahsettiğiniz gibi, C, C ++ ve Java (FP uygulamıyor) çok daha popüler. Gerçeklerden dolayı (ve çeşitli nedenlerden dolayı herkesin kendi görüşü vardır) FP endüstride pek popüler değildir.

Öte yandan, FP akademik çevrelerde çok saygınlık kazanmaktadır. Ortak matematiksel yaklaşıma daha yakındır, algoritmaların üretilebilirliği ve optimizasyonuna daha fazla odaklanır ve çoğu insan sizi genel olarak daha iyi bir programcı yapacağı konusunda hemfikirdir.

İngilizcenin İngilizceyi incelemek için Latince öğreten okullara benzer.


1
Programın işlevsel olarak kullanılması gerekmese de, C, C ++ ve Java'dan daha fazla kullanmanız muhtemeldir.
Ricky Clarkson

“İngiliz edebiyatını incelemek için Latince öğreten okullara benzer.”: Veya diğer daha geniş kapsamlı işletim sistemleri yerine Unix benzeri bir işletim sistemi öğreten işletim sistemleri sınıflarına.
Giorgio

11

Programlamanın nasıl yapıldığını ve temel kavramların ne olduğunu öğrenmeniz gerekiyor . Çoğu işletmede kullanılan günlük diller, bugün ihtiyaç duyulan yazılımı üretmek için uygun olabilir, ancak programlama temellerini öğretmek için mutlaka en uygun yöntem değildir.

Kavramları kavradıktan sonra, bunları diğer dillere uygulamak kolaydır.


4
"Çoğu işletmede kullanılan günlük diller, bugün ihtiyaç duyulan yazılımı üretmek için uygun olabilir" - Tipik maliyet, kalite ve başarı oranlarını göz önünde bulundurarak, bu oldukça iyimser bir ifade :-)
Jörg W Mittag

Bu kesinlikle doğru! Bu yüzden "yerine" olabilir "yazdım" :-)
perdian

1
"Kavramları bir kez anladıktan sonra, onları diğer dillere uygulamak kolaydır." - Bu ifade tamamen doğru. Herhangi bir yeni dilde sözdizimini almamın bir hafta alacağını ve yetkin olacağını düşünüyorum. Okulda C / C ++ ve Assembly dersleri aldım, ancak kendime bir yandan Python ve Lisp'i bir araştırma projesi için öğrettim. Python, Lisp ve Assembly'den edindiğim temel anlayış olmadan bugün olduğum programcı olacağından şüpheliyim.
Wayne Werner

9

DrRacket ile öğreniyorsanız, Nasıl Program Tasarımı dersi müfredatı kullandığınızı iddia ediyorum.

HtDP'nin (kuşkusuz yanlı) yazarlarından birinin , “Eğitim Programı” nın Northeastern Üniversitesi'ndeki işbirlikçi eğitim programı için lisans öğrencilerini nasıl hazırladığını anlatması (“ko-op”: öğrenciler akademik çalışma dönemlerini tam zamanlı sömestreleri ile değiştiriyor.) iş).

Girişten önce, Northeastern yirmi yıldır standart bir müfredat kullanıyordu: pratik uygulamalarla ilgili derslerle iç içe geçmiş son derece grafik zengin bir alıştırma seti kullanarak şu anda moda olan dilin üç terimi (Pascal, C ++, Java). Müfredat SIGCSE ve ilgili topluluklarda geniş çapta yayınlandı, ancak işe yaramadı. Web balonunun doruğunda, öğrencilerin sadece üçte biri programlama kooperatifi aldı; diğerleri ise kendilerinin dediği gibi “teknolojiler” olarak bitti: bilgisayarları taşımak, senaryoları çalıştırmak, yönlendiricileri ve ağları kurmak vb.

Northeastern'da bir yıl sonra dekanımız benden ilk kursu devralmamı istedi. İlk örnek, bazı yerel fakültelerin tahminlerine aykırı bir başarıydı. Deneme olarak kabul edilmesine rağmen, TeachScheme! kalıcı müfredat; dekan, HtDP kursunu müfredatın geri kalanına bağlamak için bir köprü kursu tasarlamamı önerdi; Bu benim HtDC Viera Proulx ile işbirliğine başladı. Aşağıdaki yazıya bakın. Birkaç yıl içinde kooperatif fakültemizden programlama pozisyonlarının payının arttığını duymaya başladım. 2007'ye kadar - kursa en son ne zaman katılmıştım - ilk kooperatifte programlama oranının üçte iki ya da daha yükseğe çıktığı söylendi. Bu arada, tüm TeachScheme! dersler kendiminkinden farklı öğretim stilleri ve kişilikleri olan çok sayıda öğretim üyesi tarafından öğretildi. Programlama kooperatifinin oranı dörtte üçe yükseldi ve tüm alt eğitim fakülteleri öğrencilerin programlama becerilerinden memnunlar.

Düzenleme: müfredatın arkasındaki rasyonel ile ilgilenenler için ana mimarın açıklaması - http://www.youtube.com/watch?v=m3be1PHW5X0


6

Okulum da Scheme ile başladı. Bahsedilen sebeplerden biri, oyun alanının düzleştirilmesine yardımcı olmaktı. Çoğu, 1 yıllık Comp Sci, daha yaygın dillere maruz kalma konusunda biraz veya çok fazla olabilir. Herhangi bir kimsenin çok fazla Scheme bilgisine sahip olması olası değildi.


4
Katılıyorum; CS'yi Pascal, C, Basic, x86 Assembler'ı tanımaya başlarken, diğerleri farklı dillerde deneyimler yaşadılar ya da hiç bilmiyorlardı. Sadece kimseyle daha önce hiç tecrübesi olmayan ama aramızda en deneyimli olanlar için bile baştan başlayacak kadar yabancı bir paradigması olan ML ile tanışmıştık. Daha sonra, ML'nin (fonksiyonel paradigma) CS'de öğrendiğim en yararlı şey olduğunu düşünüyorum.
KaptajnKold

6

Aslında, Lisp (Şema lehçesi), işlevsel dillerin Grande Dame'ı olduğu için (F #, Groovy, Clojure, Haskell vs. düşünün), o zaman bu eğitim sizi en sıcak olduğu gibi herhangi bir ticari dezavantajda bırakmaz. şu anda geliştirme bloğundaki konu.


4

Program, iyi programlama yapmanıza ve fonksiyonel programlama dillerini kullanmanın doğru şekilde düşünmenize yardımcı olacaktır. Örneğin Scala, biraz yoğun olmasına rağmen oldukça parlak olan bir Functional / OO hibriddir. Bunun gibi diller geleceği işaretler - umarım.

Lisp benzeri diller, öğretimi biraz daha kolaylaştıran tasarımlarında saflık ve basitliğe sahiptir. Yine de iyi bir avantaj, daha sonra Scala gibi bir şey öğrenmek için çok daha kolay zaman geçirmeniz olacak.


3

Programı ikinci dönemin ilk ve ilk yarısında tamamladık. Aslında C ile çalışmaya başladığımızdan beri Scheme'nin gücünü anlamaya başladım.

Sorunuzla ilgili olarak, neden Şema seçildi: cevap, buradaki en basit dillerden biri olduğu ve çok şey yapmanıza izin verdiğidir (özellikle daha sonra tembel listelerle oynamaya başladığımızda). Dahası :

  1. Programlama deneyimi olmayan insanlar için öğrenmesi daha kolaydır. Çok fazla teknik detay ve sadece birkaç özel form yok.
  2. Daha yüksek seviye soyutlamaya izin verir. İyi bir kurs, öğrencilerin daha iyi programcılar olmalarını sağlayan teknik ayrıntılara odaklanmak yerine, programcılara nasıl düşüneceklerini öğretmeye odaklanabilir.
  3. Listeler harika. Onlarla yapabileceğin çok şey var. Car ve cdr güçlü araçlar olduğunu kanıtladılar ve yalnızca göstericilerle çalışmaya başladığınızda Scheme'nin listelerde harika olduğunu fark ettiniz.
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.