TCS'ye nasıl programlanacağını bilmek ne kadar önemlidir?


66

Daha matematiksel bir arka plandan gelince, kodlamayı gerçekten öğrenmedim. TCS'de doktora yapıyorum ve birçok kişi programlama hakkında (ve genel olarak bilgisayar hakkında) ne kadar az şey bildiğimden şaşırdı. Algoritmaları sözde kodda yazabilirim, ancak gerçekten herhangi bir programlama dili bilmiyorum.

Bir gün işim için bazı algoritmalar uygulamak zorunda kalacağımı hayal edebiliyorum ama sonra bu anı bekleyebilir miyim? Yoksa daha başka bir şey mi var?

TCS'de nasıl kod yazılacağını bilmek ne kadar önemlidir (programlamanın doğrudan dahil olmadığı alanlarda): nasıl kodlanacağını bilmek için bir CC teorisyeni (örneğin) getirebilecek sebepler var mı? Kodlamayı öğrenmek için çok zaman harcamakta fayda var mı? Ve eğer varsa, daha uygun olan bir programlama dili kategorisi var mı (işlevsel, zorunlu, nesne yönelimli ..)?


12
Anlamlı, yani kesin ve çalışma zamanını yansıtan, sahte kod yazabilmek için bazılarını programlamış olmalısınız. Matematikçiler çoğu zaman da yapmazlar. Ayrıca, geliştirdiğiniz teoriyi gerçekten kullanmak istiyorsanız, bir şeyler uygulamanız gerekecek. Dillere gelince, muhtemelen işlevsel bir şeyler öğrenmekte daha iyi olursunuz. C, performans için güzeldir, ancak birçok konuda mantıklı ve zordur. (Gördüğünüz gibi, YMMW)
Raphael

6
"Matematikçiler çoğu zaman hiçbirini yapmazlar" ile aynı fikirdeyim. Bir algoritmayı tanımlayan bir matematikçinin gerçekten programlanmış olup olmadığı üzerine yapılan basit bir test " Tam olarak bir X… " ile neyi kastediyorsunuz?
Jeffε

4
Programlama, bu nedir? Teoremler benim programlarım. Bir pişirme prosedürü pişirme tekniğinden farklıdır. Üzgünüz, 20 yıldan fazla bir program kodunu okuyamıyorum. Aslında, bu "PC'de gerçekleşen" karışıklıktan nefret ediyorum. (Zaten bu gösterim hasta ediyor.) Öklid programlayamadı. Ancak yüzyıllar boyunca programlar yaptı.
Stasys

6
@StasysJukna: Euclid aslında gerçekten çok berbat bir programcıydı. Algoritmalarını yalnızca hiçbir zaman uygulamamış, aynı zamanda orta derecede karmaşık test durumlarında bile elle çalıştırmamış.
Jeffε

3
@ Jɛ E: Evet, Euclid berbat bir programlayıcıydı, tam olarak söylemek istediğim bu. Biz, TCS'de, yemek pişirme kitapları ve yemek pişirme sanatı arasında ayrım yapma eğiliminde değiliz. Öklid yapabilir. Programlayabilenlere büyük saygı duyuyorum. Ancak bu özelliğin "TCS'de bir CAN" anlamına geldiğini sanmıyorum. Sadece acıtmayacak.
Stasys

Yanıtlar:


55

Teorik bilgisayar bilimi geniş bir alandır ve programlamanın önemi TCS'de yaptığınız işe bağlıdır. Programlamanın size yardımcı olabileceği iki yoldan bahsedeceğim, bunların tek yol olduğunu ima etmeden.

İlk olarak, pratik öneme sahip problemler için algoritmalar tasarlarsanız, algoritmalarınızı uygulamak ve kodu başkaları için kullanılabilir yapmak büyük bir artı olabilir. Örneğin, dışbükey sorun birçok alanda ortaya çıkar ve insanlar gibi yazılım paketlerini kullanmak cdd Komei Fukuda ve tarafından lrs bu sorunu çözmek için David Avis tarafından. Algoritmalarını yalnızca kağıtlarda yayınlamış olsaydı, muhtemelen daha az insan algoritmalarını kullanırdı. Daha fazla kullanıcı, daha fazla geri bildirim ve muhtemelen işbirliği için daha fazla fırsat anlamına gelir; bu da paha biçilmezdir.

İkincisi, algoritmalarda çalışmasanız bile, bir defalık bir kod yazmak, varsayım sayısal hesaplamaya uygun olduğunda basit bir hesaplamayı test etmenize yardımcı olur. Örneğin, üç pozitif kesin matrisin ürününün her zaman pozitif bir ize sahip olup olmadığını merak ediyorsanız, rastgele 2 x 2 veya 3 x 3 pozitif matris seçenekleriyle test etmek ve bir karşı örnek bulmak için bir kod yazmak kolaydır. Hedefi test etmek için herhangi bir program yazdığınızın reklamını yapmasanız da, programlama yanlış bir beyanda bulunmak için boşuna harcanan zamanı koruyabilir.

Seçilecek programlama dili, programlama ile ne yapmak istediğinize bağlıdır ve bence bütün kitap için bir konu olabilir. Ancak algoritmalar tasarlarsanız ve algoritmaları başkalarının uygulamayı kullanabilmesi için uygulamak istiyorsanız, o zaman önemli bir faktör kullanılabilirliktir. Kodunuzun potansiyel kullanıcılarının çoğunun bir C derleyicisine erişebilmesini beklemenize rağmen, aynı kişilerin Haskell derleyicisine erişmesini bekleyemezsiniz. Bir kerelik programlar için, seçim daha çok mevcut kütüphanelere dayanır ve Matlab gibi ortamları içerir.

Bu arada programlama da eğlenceli olabilir.


2
@SureshVenkat: Aslında, eğer programlama eğlenceli ise, “Programlama ne kadar önemlidir?” Sorusu pek ilgili olmayabilir. Ama sonra cevabımın çoğu ilgisizleşecek. Ne kadar üzücü! :)
Tsuyoshi Ito

Daha önce ikinci argümanınızı düşünmedim, aslında bir programı kısa bir programla test etmek gerçekten iyi bir fikir! Programlama gelince eğlenceli olabilir, öyle gözüküyor, ama henüz uzun hafta sonu öğrenmeyi görmedim =).
Gopi

@ Gopi: Pek çok varsayım bu “basit bir programla yapılan test” çerçevesine uymadığını söyledi. Örneğin, genellikle asimptotik davranışları test edemiyoruz (en azından basit bir programla). Ancak, test edilebilecek bir varsayımınız olduğunda, küçük bir programlama güçlü bir araç olabilir. Eğlenceye gelince, evet, anlıyorum. “Faydalılık” bakış açısıyla sadece bazı motivasyonları listeleyerek “eğlenceli” bakış açısını görmezden gelmek istemedim.
Tsuyoshi Ito

3
Knuth'un problem çözme dersine ilişkin notları, varsayımlar ve kod arasındaki etkileşime harika bir örnektir (bkz. Problem 1): www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (Özellikle birinin görüntüsünü beğendim bir yığın çıktı taşıyan sınıfa acele)
Suresh Venkat

47

Doron Zeilberger'i bu konuda atmaya mecbur hissediyorum:

Görüş 37 : Programlama kanıtlamaktan daha eğlencelidir ve daha da önemlisi, içgüdü ve anlayışlıysa, daha da önemlisi verir.

Fikirleri okuyun, mücevherlerle doludur (kasten kışkırtıcı olma eğilimindedir). Örneğin, "Bir şeyi anlamanın en iyi yolu, onu öğretmektir. Ama daha iyi bir şekilde insanlara öğretmek, onu bir bilgisayara öğretmektir".

Benim kişisel deneyimim, tamamen teorik çalışmalar yaparken bile, bazı hesaplama araçlarına ihtiyacınız olacak. Mathematica ile pek çok sıkıcı rutin cebirsel işlemden kaçınıyorum. Yarı pişmiş varsayımlarımı, Matlab veya Python'daki kaba küçük örnekleri zorlayarak test ediyorum. Saf kombinatorik olan bir makaleyi birlikte yazdım ve bu, neler olup bittiğini anlamak için kapsamlı bilgisayar denemeleri yapmaktan en fazla yararlanan iş. Euler problemleri anlamak için devasa sıkıcı hesaplamalar yaptı. Matematik yaparken bu süreci otomatikleştirmek için araçlarımızı kullanması için ona borçluyuz.

Bunun dışında, algoritmalar ve veri yapıları üzerinde çalışacaksanız, programlama verimlilik ve kullanılabilirlik konularında yeri doldurulamaz bir perspektif verecektir. Buradaki fikrim başkalarıyla biraz farklı. Fonksiyonel bir dil öğrenmeyi düşünüyorum, böylece doğru tipte provalar yazmanız zaman kaybıdır (Bence güçlü bir şekilde yazılmış bir dil tecrübesi olan kişilerin muhtemelen daha dikkatli bir şekilde yapılandırılmış provalar yazma eğiliminde olmalarının harika bir nokta olduğunu düşünüyorum; Bu alıştırmayı yapmak için zaman ayırmaya değmeyeceğini düşünüyorum). İşlevsel programlama, algoritma tasarımını ve çalışma zamanını gizler ve mantık ve anlambilim konularını vurgular (ve elbette, işlevsel programlama öğrenmenin muhtemelen bir zorunluluktur ve mantık / PL anlambilimi ile ilgileniyorsanız doğal olarak bir şekilde gelecektir). Benzer şekilde, Java ve C ++ 'nın OO detaylarına girmenin, OO' nun amacı modüler yeniden kullanılabilir kod yazmak olduğu için zamanınızı harcamanın en uygun yolu olmadığını düşünüyorum. Başkalarının kullanması için kod üretecekseniz, yol budur. Ancak, verimlilik ve çalışma süresi hakkında fikir sahibi olmak istemeniz durumunda, gerçekten verimli algoritmalar ve veri yapılarıyla ilgileniyorsanız, C'ye bakmanız için öneriyi yapıyorum. Makul bir soyutlama seviyesi sunarken yine de makineye yakın olmanızı sağlar. . Bu şekilde neyin hızlı ve neyin yavaş olduğuna, makul bir veri yapısının ne olduğuna dair bir fikir edinirsiniz. Ancak, verimlilik ve çalışma süresi hakkında fikir sahibi olmak istemeniz durumunda, gerçekten verimli algoritmalar ve veri yapılarıyla ilgileniyorsanız, C'ye bakmanız için öneriyi yapıyorum. Makul bir soyutlama seviyesi sunarken yine de makineye yakın olmanızı sağlar. . Bu şekilde neyin hızlı ve neyin yavaş olduğuna, makul bir veri yapısının ne olduğuna dair bir fikir edinirsiniz. Ancak, verimlilik ve çalışma süresi hakkında fikir sahibi olmak istemeniz durumunda, gerçekten verimli algoritmalar ve veri yapılarıyla ilgileniyorsanız, C'ye bakmanız için öneriyi yapıyorum. Makul bir soyutlama seviyesi sunarken yine de makineye yakın olmanızı sağlar. . Bu şekilde neyin hızlı ve neyin yavaş olduğuna, makul bir veri yapısının ne olduğuna dair bir fikir edinirsiniz.


10
"İşlevsel programlama, algoritma tasarımı ve çalışma süresi sorunlarını gizlemekte ve mantık ve anlambilim konularını vurgulamaktadır". Mücadele kelimeleri :)
Suresh Venkat 8:11

3
"İşlevsel programlama, algoritma tasarımı ve çalışma süresi sorunlarını gizlemekte ve mantık ve anlambilim konularını vurgulamaktadır." Bu nedenle, TCS'nin mantıksal ya da anlamsal tarafında çalışıyorsanız, iyi bir seçimdir. :)
Radu GRIGore, 8:11


3
@Sasho: Tüm sıradan teknikler hala işlevsel dillerde çalışıyor. Tek "sorun", işlevsel programlamanın, sıradan algoritmik analiz tekniklerinin kullanabileceği donanıma sahip olduğu bir programlama stilini ve veri yapısı tasarımını teşvik etmesidir. (Örneğin, fonksiyon kompozisyonunun büyük O değeri nedir? İşlem önemsizdir , ancak asimptotik karmaşıklık varsayımlarını tamamen ihlal eder - işlevsel bir girdi için basit bir sayısal ölçü ölçüsü yoktur.)
Neel Krishnaswami

3
@SashoNikolov: Ne zaman bir lisansüstü veri yapıları sınıfına ders versem, gerçekten herkesin işlevsel bir programlama tecrübesine sahip olduğunu varsaymak isterdim. Kalıcılığı açıklamak için 90 dakikalık üç ders vermek yerine, “Hey, veri yapılarınızın Zaten bu işi yaptığını fark ettiniz mi?” Diyebilirim.
Jeffε

33

Programlama olmadan oldukça başarılı bir teorik bilgisayar bilimcisi olabilirsiniz. Birkaç kişi için programlama oldukça zordur ve eğer onlardan biriyseniz ümitsiz kalmamalı ve alanları değiştirmemelisiniz.

Bununla birlikte, çoğu matematik ve bilgisayar bilimleri lisansüstü öğrencisi için, programlamayı öğrenmek özellikle zor değildir ve çok faydalı bir beceridir. Bir programlama dili öğrenmelisiniz ve bundan hoşlanıyorsanız, yeterli derecede yetkin olmak için yeterince pratik yapmaya çalışmalısınız. Ardından, nokta geldiğinde (ve olacaksa), bir program yazmanız için araştırmanızda yararlı olacağı konusunda, bunu yapabileceksiniz.

Eğer şimdi program yapmayı öğrenmiyorsanız, sonunda bir program yazmanız gerektiğinde, öğrenmeye vaktiniz olmayacaktır ve bu yüzden aslında onu yazmamanız ve sonuçta daha az etkili olmanız gerekebilir. Araştırma. Bunu yapmak için bir lisans öğrencisi veya bir lisans öğrencisi almak çok zor olmasa da, sorunu kendilerine açıklamak yerine, kendiniz yapmanın çok daha kolay ve daha az zaman harcadığı birçok zaman vardır.

Hangi dili öğrenmelisin? Nesneye yönelik bir dil öneririm, çünkü bunlar şu anda en çok kullanılan diller bunlar ve gelecekte bunun daha doğru olacağını düşünüyorum. Belki Python veya Java — ikisi de nesne yönelimli dillerdir ve pratikte C ++ 'dan daha az kullanıldığında, benim izlenimim, ikisinin de öğrenilmesi daha kolay olduğu düşüncesidir. (Caveat: C ++ 'u tanımıyorum, Bell Laboratuarlarında çalışmış olmasına rağmen, belki de bu konuda yanılıyorum.)


2
Gerçeği üçüncü paragrafında görüyorum :).
Gopi

1
“Bununla birlikte, çoğu insan için program yapmayı öğrenmek özellikle zor değil” - deneyimlerim buna katılmama neden oluyor, ancak çoğu kişi TCS araştırmacıları değil.
Max

2
Sage'in yükselişiyle, Python gibi güzel ve popüler bir dille çalışmak mümkünken, Mathematica / Maple / Matlab tarzı matematik kütüphanelerini anında kullanabilmek mümkün.
András Salamon

1
C ++, Lisp dilleri ailesi dışında gördüğüm genel amaçlı programlama dilinin en gelişmiş tip / metaprogramlama sistemine sahiptir. Bu yüzden, eğer tip teorisi, dil tasarımı veya derleyici teorisi veya daha genel olarak biçimsel anlambilimsel iseniz, buna aşina olmak isteyebilirsiniz. C ++ 'a ek olarak, deneysel Bilgisayar Bilimi alanında araştırma yapmak ya da sektörde programcı ya da yazılım mühendisi olarak iş bulmayı umut ediyorsanız, Java ve C # şarttır. Python liselerde öğretilmelidir: D
Antonio Valerio Miceli-Barone

4
@ AntonioValerioMiceli-Barone: En azından genel olarak tip teorisi, dil tasarımı, biçimsel anlambilim ve programlama dili teorisine (PLT) katılmıyorum: C ++ bu alanlar için öğrenilecek dil değil ; TT ve biçimsel anlambilim, neredeyse sadece fonksiyonel programlama ile ilgilidir, PL topluluğu ise daha çeşitlidir, ancak dilleri C ++ 'dan daha seçkin kılar. Haskell, en gelişmiş tip sisteme sahip "ana akım" dil ve ardından Scala (daha az gelişmiş, biraz daha genel). C ++ ilginç özelliklere sahip, ancak modern lezzet için çok düşük seviyede.
Blaisorblade

33

Gerçekten kimsenin görmediği başka bir cevap var. Programlama aslında ilginç teoriye yol açabilir. Karmadaki son gelişmelerin birçoğu (özellikle tablolama karma), teorik kaygılarla değil, teorik olarak en uygun algoritmaların pratikte o kadar iyi olmadığı gerçeğiyle motive edilir. Bu elbette kod yazamadığınız sürece bilmediğiniz bir şeydir.

Tam üstel zaman algoritmaları alanında bile, bir motivasyon gerçekten işe yarayabilecek algoritmalar üretiyor. SAT çözücüler bunun kanonik bir örneğidir.

Kısacası, kodlama yeteneği, en uygun teorik sonuçlara benzeyen eksikliklerin ve zayıflıkların farkına varmanızı sağlar ve bu da yeni teorik araştırma yönleri açar.


Cevabınız TCS'deki Ampirik sonuçlar hakkındaki soruya yardımcı olabilir .
Gopi

belki: ama bu konu çoktan bitti :)
Suresh Venkat

Gerçekten de tarihe bakmadım, son aldığım bültende "Önceki haftalardan en büyük isabetler" =) kısmına girdim.
Gopi

18

Üç nokta:

1) Deneysel Matematik denilen matematiğe bir yaklaşım vardır (ayrıca bkz. Wikipedia: // Bilgisayar destekli kanıt ), bu nesneler hakkında analitik kanıtlar bulmak için nesnelerin kalıplarını ve yapılarını araştırmak için bilgisayar programlarını kullanırsınız. Bu yaklaşım için nasıl programlanacağını daha iyi bilirsiniz. Çok teorik ifadeleri ispatlamak için kendinizi bu yaklaşımın ihtiyacında bulacağınızdan emin olabilirsiniz. Programlamaya karşı ertelemenin genellikle TCS araştırmalarında gerçekten yardımcı olmadığına inanıyorum.

2) Nasıl programlandığını öğrendiğinizde, yan ürünler olarak, TCS'de yararlı olan becerileri öğrenirsiniz. Her şeyden önce bir örnek: Kodlama geçmişi olan kişilerin ispatlarını daha fazla kontrol etme eğiliminde olduklarını öğrendim. Daha da iyisi, düşündükleri nesnelerin türlerini çok sık tanımlama eğilimindedir (ör .: " operatörlerini düşünelim.birL(X,Y)BL(Y,C)

3) "Programlamak" derken, " doğrusal programdan " veya " yarı final programdan " mı bahsediyorsunuz ? :)


2
Tanıdığım hiç kimse "doğrusal program" için "program", "yarı son program" için kullanmaz. Bunun yerine "doğrusal bir program inşa etmek / çözmek" derdiniz.
Peter Shor

2
@ PeterShor Point 3 ciddi değildi
Alessandro Cosentino

3
Ve tabii ki, sen gerektiğini ... yararlı beceriler hem de doğrusal programa öğrenmek ve programı yarı kesin etmek.
Peter Shor

3
2 puan için +1, aslında bir öğrenciyken küçük bir OCaml öğretildi, sadece bir yıl kullanmama rağmen, delillerimin türlerini kontrol etme alışkanlığımı kullandım.
Gopi

4
Dinamik olarak programlarım !
Jeffε

16

Bu soru için Gopi teşekkür ederim. Çok sayıda ilginç cevabı, daha önce bahsedilmemiş bir boyutta daha da genişletmek istiyorum.

Araştırma üniversitede yaptığımız tek şey değil: eğer akademide kalmak istiyorsanız, sonunda öğretmeniz gerekecek. Şanslıysanız, uzmanlık alanınızdan oldukça uzakta olan kursları öğretmeniz gerekir. Büyük olasılıkla size önemli bir programlama bileşeni olan dersler verilecektir. Bu, ılımlı bir programlama becerisinin bile büyük ölçüde yardımcı olduğu yerdir: nasıl programlandığını biliyorsanız, daha iyi bir öğretmen olacaksınız. Öncelikle ve en önemlisi, materyalle daha rahat olacaksınız, öğrenci sorularına daha iyi cevap verebileceksiniz ve bu öğrenme sürecini kendiniz deneyimlediğiniz için öğrencilerin programlamayı öğrenmedeki zorlukları anlayacaksınız. Ayrıca, daha iyi öğretim materyali üretebilirsiniz. Örneğin, programlama alıştırmalarını, öğrencilere vermeden önce kendiniz test edebilirsiniz,

Ek bir pragmatik boyut var: öğretim, yetenekli bir programcının sık sık otomatikleştirebileceği, öğrencilerin ders göndermek için kullanabilecekleri bir web sitesi yapmak ve otomatik olarak derecelendirilmesini sağlamak (kodların geçtiği otomatik testlerin sayısına göre) gibi çeşitli tekrarlayan görevleri içerir.


“Şanslıysanız, uzmanlık alanınızdan oldukça uzakta olan kursları öğretmek zorunda kalacaksınız.” Şanslı mı…?
Tsuyoshi Ito

3
@ Tsuyoshi: Kendinizi yeni bir konu alanına alışmaya zorlar. Kısa vadede, bu çok fazla iş anlamına gelir (bu, uzun vadede amorti olur, çünkü bu materyali bir kereden fazla öğretmeniz muhtemeldir). Aynı zamanda, entelektüel ufkunuzu önemli ölçüde genişletir.
Martin Berger

@TsuyoshiIto: Evet!
Jeffε

13

Programlama, çeşitli kavramlara ilişkin anlayışınızı geliştirmek için iyi bir yoldur, ancak aynı zamanda tehlikeli bir zaman dilimidir.

Programlamaya karşı tipik bir argüman , zamanınızı önemsiz ayrıntılarla geçirmenizi sağlar; Tipik bir argüman için programlama o düşündüğünden detaylar önemsizdir aslında önemli olduğunu fark yapan şeydir. Programlamada iyi olmak temelde önemsiz kısımlarla hızlı bir şekilde başa çıkabilmek demektir. İyi olmak uzun zaman alıyor.

Programlama dili öğrenmeye gelince: "hepsi" benim (yanak dili) cevabım.


2
Nihayet programlamaya karşı bir argüman :).
Gopi

1
@ Gopi, programlamanın çok eğlenceli olabileceğini ve edindiğiniz daha iyi bir anlayışın çok önemli olduğunu düşünüyorum. Diğer cevaplar, programlamanın nasıl anlaşıldığına dair harika örnekler sunar. Bu yüzden, sizi programlamayı öğrenmeye teşvik ediyorum ve eğer kuruluş hızlı bir şekilde ödeme yapmadıysa pes etmeyin.
Radu GRIGore

6
Teoremleri kanıtlamak aynı zamanda çeşitli kavramlar hakkındaki anlayışınızı geliştirmek için iyi bir yoldur, ancak aynı zamanda tehlikeli bir zaman alıcıdır.
Jeffε

@ Jɛ ff E, fikrim [sözde kod -> kağıda ispat, ispat -> ispat asistanı] ile değiştirilir.
Radu GRIGore

12

Partiye geç kaldım ve hepsi harika cevaplar, ama başka bir nedenim var:

Görselleştirme.

Evet, genellikle görselleştirilemeyen şeylerle çalışacaksınız, ancak çoğu zaman yapabilen şeylerle çalışacaksınız. Nasıl programlanacağını bilmek bu görev için vazgeçilmezdir ve görselleştirme size bir sorun hakkında çok fazla fikir verebilir.


3
Nasıl programlanacağını biliyorum ve görselleştirme konusunda kesinlikle umutsuzum. Ayrıca, çok fazla programlama yapmadan bir şeyleri görselleştirmenizi sağlayacak araçlar bulunduğundan şüpheleniyorum; yoksa, olması gerekir ve belki birkaç yıl içinde olur.
Peter Shor

@PeterShor: Çünkü C ++ kullanmıyorsunuz! (Sadece şaka)
Tsuyoshi Ito

1
@PeterShor: Belirli bir dile veya çevreye atıfta bulunmadım; MATLAB burada sayılır. Ancak nasıl programlanacağını bilmek size, aksi takdirde inanılmaz derecede rahatsız edici olacak görselleştirmeler getirebilir. Örneğin, iki boyutlu pozitif-kesin matrislerin alanı üç boyutludur ve ben bu alandaki bir yapı ailesini görselleştirmek istedim. Bir dönüşüm bulmalıydım ve sonra nesnelerimi gerçekten görmek için kodladım.
John Moeller

@John ... haklısın, başka bir şekilde yapabileceğini sanmıyorum.
Peter Shor

7

Sadece hızlı bir nokta: nasıl programlanacağını bilmek bana teori araştırmalarında ek bir araç sağlar. Çalışacağını düşündüğüm bir algoritmaya sahip olduğumda, yeterince kolaysa, kodlayabilir ve gerçekten çalışıp çalışmadığını kontrol edebilirim. Eğer fikrim pratikte işe yaramazsa, teoride çalışmak pek olası değildir ve bu yaklaşım beni yanlış bir şeyi ispatlamaya çalışan çok fazla zaman batırmaktan kurtarır.


Tsuyoshi Ito, cevabında da benzer bir tartışma yaptı (ikinci puan :)).
Gopi

Maalesef haklısın - özledim.
Lev Reyzin

5

Buradaki hiç kimse, TCS'yi inceleyen birinin neden programlama öğrenmesi gerektiğine dair pratik meseleleri ele almamıştır.

Bilgisayar Bilimleri bölümünde, TCS'de doktora yapmayı planlıyorsanız, bazı Teorik olmayan derslere girmeniz ve muhtemelen neredeyse kesinlikle çok yoğun bir şekilde yoğunlaşmanız gerekecektir. Bulunduğunuz programa bağlı olarak, yeterlik sınavlarını geçmek için Teori dışı konular hakkındaki bilgilere de ihtiyaç duyabilirsiniz.

Doktora derecenizi tamamladığınızda, TCS için birçok iş fırsatı akademi içerisindedir. Akademi'de çalışıyorsanız, öğretmeniz beklenir ve teoride daha fazla programlama yapacak bir giriş seviyesi CS sınıfı ders vermeniz beklenir. Lisans öğrencilerine bir teori dersi veriyor olsanız bile, Algoritmalar gibi, öğrencilerinizin programlama hakkında teoriden daha fazla şey bilmelerini bekleyebilirsiniz ve öğrencilerinizin bildiklerini bilmeden, anlayışlarındaki boşlukları kapatmanız zor olacaktır. . CS lisans programlarının programlama bilmeyen biri tarafından öğretildiği fikrine titredi!

Bu pratik kaygıları umursamıyorsanız, o zaman muhtemelen programlama hakkında hiçbir şey bilmeden araştırma yaparak alabilirsiniz. Tabii ki, TCS topluluğunda çok fazla şirketiniz var, ancak kilometre, çalıştığınız teorinin tam olarak hangi alanına girdiğinize bağlı olarak değişecektir. Örneğin, eğer saf hesaplama karmaşıklığı teorisi yapıyorsanız, kimsenin sahip olmadığı sınıflar üzerinde daha düşük sınırlar olduğunu kanıtlarsanız hiç duymadım, o zaman programlama sizin için faydasız olacak gibi görünüyor. Fakat daha algoritmik bir şey yapıyorsanız, iyi temiz çalışma kodu yazmanın başka hiçbir şey yapmazsanız sezginizi güçlendireceğini düşünüyorum.

C öğrenmeyi öneririm (C ++ değil). K & R'nin bir kopyasını alın ve arka arkaya okuyun. C, modern dillerin süslü özelliklerinin çoğuna sahip değildir, ancak bütünüyle öğrenmeniz gereken basit ama zarif sözdizimi ve anlambilimine sahiptir. Bununla birlikte, dili bütünüyle anladığınızda bile, C'ye zarif ve hatasız kodlar yazmak konusunda ustalaşmanız gerekir. Bununla birlikte, C'de kodlama konusunda ustalaşırsanız, karşılaştığınız herhangi bir programlama dilinde ustalaşabilirsiniz. Ayrıca, bu disiplin, donanımın nasıl düşündüğünü düşünmenize yardımcı olacaktır, ki bu algoritmalar tasarlanırken faydalı olacaktır.

İşaretçiler gibi fikirler algoritma tasarımı yapan herkes için çok önemlidir, ancak ne yazık ki, Java ve Python gibi diller onları sizden gizliyor, bu yüzden onları matematik geçmişi olan birine ilk dil olarak önermiyorum. OOP, algoritmalar tasarlayan biri için değil, büyük yazılım projeleri sürdürmek zorunda olan insanlar için daha önemlidir.


0

Kursunuzun başlangıcını beklememenizi öneririm, çünkü herhangi bir düzeyde bilgisayar bilimi, kursunuz boyunca karşılaşacağınız herhangi bir teoriyi başarmak / doğrulamak / çözmek için bir bilgisayar üzerinden algoritmalar uygulamak anlamına gelir.

İlk önce 10. sınıfta (lise) programlamam gerekiyordu ve zaten bir komut satırının nasıl kullanılacağını biliyordum ve bu gerçekten yardımcı oldu (bu size CS'de "temel" programlama becerilerinin nasıl değerlendirileceğini göstermektir).

Sahte kod ve algoritmalar, programlamak için öğrenmesi gereken ilk şeyler arasında olduğundan, arkadaşlarınızın şaşkınlığı oldukça iyi kuruludur.

Bununla birlikte, bir sonraki programlama dersinde tamamen kaybedilmeyeceksiniz çünkü daha geniş matematik becerilerinizi (kendi başınıza), işlevsel bir programlama dilini daha hızlı öğrenmeyi yakalamak için nesne yönelimli programlamayı atlamak için avantaj olarak kullanabilirsiniz.

  • İşlevsel programlama ÇOK matematiğe yöneliktir, matematik bilgisi için öğrenmesi daha zor kabul edilir, çok güçlü olarak kabul edilir ("basit", zarif ve "temiz" yöntemlerle zor sorunları çözmenin matematiksel yoludur).
  • Nesne yönlendirme, altta yatan algoritmaları ve uygulama ilkelerini anlamak istemediğiniz ve yalnızca mevcut nesneleri "yeniden kullanmak" istediğiniz zaman iyidir.

Bence Haskell'le (genellikle ilk dil değil) başa çıkabiliyorsunuz çünkü tamamen matematiksel, işlevsel ve temelde istediğiniz her şeyi yapabiliyor. Öğrenme Haskell sizi ayakta tutmak için daha fazla şey öğrenmenize gerek kalmayacak bir seviyeye koyacak ve hatta kursunuz üzerinde kontrol ve iktidar durumuna bile girecektir. İstatistikiyseniz, R öğrenmek bir artıdır, ancak Haskell kadar yakın değildir. Matematikçilerden matematiğe olan yakınlığı ve düşünme şeklini nasıl benimsediğine şaşırdıklarını belirten raporlar gördüm.

Ayrıca, ele almaya değer bir meydan okuma (ellerinizi bir programlama ortamına hızlı bir şekilde alıştırmak için) Linux kurmak ve kullanmak olacaktır (Ubuntu Linux yapacak). İnan bana, onunla oynayarak çok şey öğreneceksin ...

Bu tavsiyeler bilgisayar bilimlerindeki bir matematikçi için hızlı ve emin bir şekilde yetişmeyi bildiğim en iyi yol. Ayrıca, açık kaynak topluluğu çok canayakın ve yardımsever ve sıkıştıysanız, IRC herhangi bir konu hakkında uzmanlaşmış kanallardan konuşmanın en doğrudan yoludur (FreeNode'a bağlanın). Unutmayın: soru sormak, kendi kendinize, forumunuzda, bir arama motorunda veya sohbet odalarında olmanın tek yoludur.


4
Asıl soruya ne kadar cevap verdiğinizi bilmiyorum: "Nasıl" diye sormadım, ama "Ne için" diye sordum.
Gopi

0

Etkileşimli bir prova sisteminin C ++ uygulamasına bir örnek aşağıdaki yazıdır: Justin Thaler tarafından Devre Değerlendirmesi için Zaman İçin En Uygun Etkileşimli Provalar. O mevcuttur http://people.seas.harvard.edu/~jthaler/ . Genel amaçlı etkileşimli prova sistemlerinin pratik bir uygulamasını geliştirme hedefine doğru bir adım gibi görünüyor.

Benzer makaleler ve ilgili kaynak kodları yukarıda belirtilen web sitesinde yer almaktadır.


3
Bu yazının şu soru ile nasıl ilişkili olduğunu açıklar mısın? TCS için nasıl programlanacağını bilmek ne kadar önemlidir ?
scaaahu

Programlamadan faydalanan teorik bir sonuç örneği olsa bile , asıl soruya cevap vermez mi?
Jeremy,

Soru, bir karmaşıklık teorisyeninin kodlamayı bilmesi için bir ihtiyaç olup olmadığını soruyor. Yukarıda belirtilen yazı açıkça teorik kavramları tamamlamak için deneysel sonuçlar kullanır; bu kodlama gerektirir. Her durumda, teorik bilgisayar bilimlerinde merkezi bir kavramla yakından ilgili bir programlama projesi bulmam çok uzun sürdü. Umarım bu yayın benzer bir aramada birileri için yararlı olabilir.
lgidwani
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.