Okuryazar programlama neden ana akım değildir? [kapalı]


32

Okuryazar programlamanın iyi idealleri vardır. Neden bunun ana akım olmadığını düşünüyorsunuz? Çünkü teslim edilemedi mi?


2
Çünkü bunun için geliştirilen araçlar hala oldukça zayıf. Microsoft muhtemelen bu konuda lider olma şansına sahiptir.
Meslek

3
Yeni bir soruna yaklaşırken, sıklıkla kendi 'Edebiyat Programcılığım' kısayolunu kalem ve kağıt kullanarak kullanırım. İşlevsel olarak adlandırılacak şeyleri tanımlamak için dil anlambilimine aldırmamamı ve insan dilini karıştırmamı
sağlıyor

1
Knuth bile artık bu kavramdan mahkum değil: “Ve TEX82'yi geliştirirken kullandığım eski“ okuma yazma programlama ”kavramını bırakıyoruz çünkü belgeler çok acı verici oldu.” tug.org/TUGboat/tb31-2/tb98knut.pdf .
h0b0

6
TeX'e ve felsefesine aşina olmayanlar için, Knuth alıntılarının büyük olasılıkla ironik bir şekilde ifade edildiği belirtilmelidir.

3
@ h0b0 & user1249: Knuth'un yazdığı makalenin tamamı ironi, sadece bunu okuyarak öğrenebilirsin. Ayrıca Steve Jobs, web, Çevik, refactoring, OOP, AOP ve diğer birçok şeyle alay ediyor. Bu bir şaka!
Andres F.

Yanıtlar:


35

İlk önce Knuth'un yazıları kitabında gördüm ve düzgün göründüğünü düşündüm. Sonra programda neler olup bittiğini anlamak için edebiyat programlama ekranını kullanmaya çalıştım ve göründüğünden daha zor buldum. Program listelerinden geçmeye çok alıştığım için olabilirdi, ama kafa karıştırıcı görünüyordu.

Sonra kaynak koduna baktım, ve o zaman beni oradan kapattı. Program metni tamamen yeni bir şekilde yazılmalı, program metni ile derleyicinin gördükleri arasında daha az yazışmalar görüldü ve bunun için hiçbir fayda görmedim.

Ayrıca, insanlar aslında Y yaparken kodun X yaptığı konusunda uzun ve inandırıcı argümanlar yazabilirler ve yanıltıcı yorumlardaki payıma katılıyorum. Oldukça erken ne yaptığını görmek için kodu okumak için bir düşkünlük geliştirdim. Okuryazar programlama bunun antitezidir.


4
Okuryazar programlamanın yanı sıra genel olarak yorumlar da kodunuzun ne yaptığıyla ilgili değildir . Bunu kodun kendisinden okuyabilirsiniz. Her şey neden ve nasıl olduğu ile ilgilidir ve bu temel bilgiler uygun bir okuma yazma programı olmadan neredeyse her zaman eksiktir. “ Neden? ” Kısmının oldukça sık detaylı ve karmaşık bir matematik, bazen grafikler ve tablolar, bazen de diyagramlar içerdiğini söylemeye gerek yok . Bu tür yorumları okunaklı bir şekilde sürdürmek için okuryazar programlama araçları gereklidir.
SK-mantık

1
@ SK-mantık fuarı, ancak David Thornley'in yaptığı nokta, WHY'nin bile yanıltıcı bir yalan olduğu sonucuna varmasıdır (aslında kavraması daha da zor olan).
MrFox

1
+1 Knuth, "ileri" bir dilde çalışırken programlama kodu (tematik) vahşi batı günlerinde, makine kodunu kullanmak yerine neredeyse metalin üstüne "C" yazmak anlamına geliyordu. Hafıza çok sıkı değişkenlerdi ve diğer isimler genellikle sadece tek harflerdi, genellikle kapsamdan kapsama yeniden kullanıldı. Anahtar teslimi bir kişinin her biri kendi eksantrik tarzında olan bir kişi tarafından yazılan ve sürdürülen programların büyük çoğunluğu. Bir kod üssünü devralmak zorunda kalmak okumaktan daha şifre çözücüydü. Yardımcı olacak kaynak kontrolü vb. Yoktu.
TechZen

1
Knuth bugün 30 yıl önce yola bakıyordu. Programların daha da büyüyeceğini, daha karmaşık olacağını, değişen üyelere sahip ekipler tarafından yazılacağını, yıllarca ya da on yıllarca süreceğini ve girdi, değerlendirme ve nihayetinde programcı olmayanların kabul etmesini gerektirdiğini biliyordu. Okuryazar programlama, bunların hepsini ele almak için bir fikirdi. Bugün iş mantığı ve BDD diye adlandırdığımız şeyden kurtuluyordu. Temel fikir, programcıların ne yapacaklarını ve programcı olmayanların izleyebileceklerini bilmeleridir. Belirtildiği gibi, fikir başarısız oldu çünkü "okur yazar" metin ile kod arasındaki bağlantıyı zorlayacak hiçbir mekanizma yoktu.
TechZen

BTW: Bu yüzden Objective-C gibi "kendi kendini belgeleyen" dilleri seviyorum. İlk başta kod, saçma sapan uzun yöntem adlarıyla karışık bir yol arar, ancak dili veya API'yi bilmeyen bir programcı bile kodun ne yaptığını çabucak çözebilir. Hepsinden iyisi, kodu ve otomatik olarak senkronizasyondaki "yorumlar" değişikliğini değiştirin. Tabii ki, bu yüzden Objective-C yerleşik otomatik tamamlama ile yazılmış. O olmadan, Objective-C yazmak oldukça cehennem gibi.
TechZen

13

Ben suçlamaz ağ etkisi . Diğer kişilerin kodunuzu ve belgelerinizi düzenlemesi için onu anlayabilmeleri gerekir.

Bu, insanları cweb / noweb gibi bir şeyden uzaklaştırıyor, çünkü onları kullanmak, TeX'i ve proje için kullandığınız programlama dilinin üstündeki programa özel sözdizimini öğrenmenizi gerektiriyor. Bu, özellikle de ilk başta TeX için bu kadar büyük bir çizim olan matematik dizilimine ihtiyaç duymamaları halinde çok büyük bir zaman kaybı olarak görülebilir. (Ve pek çok uygulama programcısı için buna gerçekten ihtiyaç duymazlar.) Bunun yerine Visual Studio'nun XML yorumları gibi bir şey tercih ediyorlar, çünkü bu zaten popüler ve iyi kurulmuş.

Okuryazar programlamanın başladığını gördüğüm yerler, programcıların çoğunun matematik, CS ya da istatistik konularında önemli bir eğitime (doktora) sahip oldukları ve bu nedenle LaTeX ile ilgili aileleri olduğu yerde, bilimsel / istatistiksel hesaplama alanındadır. Yazdıkları belgelerin TeX'te en iyi yazılmış birçok karmaşık formülü içermesi daha muhtemeldir ve bunların R'de programlanması daha muhtemeldir. SWeave'ı bilen R programcılarının oranı kesinlikle çok daha yüksektir. cweb'i bilen C programcılarının oranı.


2
Bu cevap tüm okuryazar programlama araçlarının LaTeX kullandığını varsaymaktadır. Bu doğru mu? Bunu gerektiren kavram hakkında hiçbir şey görünmüyor.
AShelly

@AShelly: Bu gerekli değil - biliyorum şu anda en azından HTML kullanmanıza izin veriyor. Fakat pratikte, HTML dökümantasyonu yazan insanlar, okuma yazma programlama araçları yerine javadoc ve benzerlerini kullanacak.
Larry Wang

1
@AShelly, işe okur programlama için şunları yapmanız gerekiyor oluşturmak basılacak belgeyi. Biçimi metin tabanlı olduğunda bu çok daha kolaydır, ve bildiğim için en güçlü metin tabanlı belge biçimlendirici olan TeX ve TeX LaTeX kullanıyor çalışmak için en kolay yolu.

@AShelly org-modeokuma yazma desteği için desteğine bakmak isteyebilirsiniz . Oldukça kullanışlıdır ve anlamak ( yönetmekten bahsetmiyorum ) yalnızca WEB veya NOWEB'den çok daha kolay buluyorum . Kodun önemli bir yönü okunabilirliktir ve bu okunabilirdir. (cf github.com/vermiculus/stack-mode )
Sean Allred

12

Okurken 90'lı yılların sonunda Edebiyat Programcılığı kavramı beni çok etkiledi ve Knuth'un programlama yaklaşımına ve dizgi çalışmalarına hala merak duyuyorum. Hiçbir şey ama en iyisi yapacak.

Knuth'un tasarladığı Literatür Programlama sistemi hemen göze çarpmadan çok daha fazlasını yaptı, yani temel programlama dilinde Knuths kaynak belgesinde üretilen kod oluşturma aracının standart Pascal adlı birçok eksikliğinin üstesinden geldi.

Standard Pascal’ı denememiş yeterince şanslı olanlar için, işte dikkat çeken bazı noktalar.

  • Tek geçişli bir derleyiciye sahip olmayı kolaylaştırmak için, dil belirtimi tüm bildirimlerin belirli bir sırada gelmesi gerektiğini söyledi. Wikipedia sayfasından: "Her prosedür veya fonksiyon, hepsinin bu sırada olması gereken kendi etiket etiketleri, sabitler, türler, değişkenler ve diğer prosedürler ve fonksiyonlara ilişkin beyannamelere sahip olabilir." Bu yapabildin demek değil kaynak dosyada mantıksal birlikte grup eşyalarını.
  • Dize kullanımı düz C'den daha sıkıcıydı.
  • Tanımlayıcılar isteğe bağlı uzunlukta olamaz.
  • Artık hatırlayamadığım birçok şey var.

Tüm bunlar temel olarak Knuth'un daha iyi bir programlama diline ihtiyacı olduğu anlamına geliyordu (bu yüzden bir tane icat etti) ve Pascal'ı anadil dili olarak kullandı.

Çoğu modern dil bu işleri çok çaba sarf etmeden yapabilir, bu nedenle Edebiyat Programcılığının çözeceği büyük bir bölümü çıkarmaktır.

Ayrıca modern diller, kodun kendisine konulacak daha fazla düşünceye izin verecek şekilde daha etkileyicidir.

Peki geriye ne kaldı? Kaynak kodundan bir TİP dokümantasyon formu üretebilme ve bu TAT bugün mevcut.

Sadece JavaDoc'u düşünün - Java çalışma zamanı API'si, belki de bugün mevcut olan en büyük Literatür Programlaması parçasıdır (kod aslında sunulmadığı dışında, ancak Java başlangıçtan beri açıktıysa OLABİLİRDİR). Örneğin http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Benzer sistemler. NET ve diğer genel programlar için var olduğuna inanıyorum.


To make it possible to have a single-pass compiler, all declarations had to come in a certain order. Bunun gibi bir bildirim emri derleyici tasarımını kesinlikle basitleştirir , ancak tek geçişli derlemeyi etkinleştirmez / engellemez. Örneğin, Delphi'nin bu sipariş kısıtlaması yoktur, ancak yine de kesinlikle tek geçişli bir Pascal derleyicisidir.
Mason Wheeler

Kabul. Turbo Pascal da bu kısıtlamaya sahip değildi. Bununla birlikte, bu kısıtlamanın baştan beri Pascal tanımında olduğunu unutmayın.

1
Hayır, Knuth uzun zaman önce CWEB'ye geçti, Pascal eksikliklerini düzeltmekle ilgili değil. Hayır, JavaDoc'un Knuth'un "okuryazar programlama" ile hiçbir ilgisi yok - kodunu nasıl yarattığını temelden değiştirmekten bahsediyor ve onun veya başkasının üstesinden gelmesinin mümkün olmayacağını iddia ettiği karmaşıklığı ele almasına izin verdiğini iddia ediyor.
Ron Burk

@RonBurk CWEB sadece daha iyi bir "assembly dili" derler. Bu, özgün tasarım kararlarını geçersiz kılmaz.
Thorbjørn Ravn Andersen

5

90'lı yıllarda okuryazar programlamaya bayılırken keşfettiğim bir şey, Tam Olarak Doğru Olanı yapmak isteyen ve kendi okuryazar programlama sistemlerini yazmayı içeren çok tutkulu insanları cezbetmesiydi, çünkü hiçbiri kendileri için yeterince iyi değildi. noweb herkes için yeterince iyi bir en az ortak payda sağlayarak bunu kesmek için iyi bir girişimdi, ancak o zaman bile LP zamanımın çoğunu güzel bir yazıcı geliştirmek için harcadım ...

Başka bir konu, bunun gerçekten anti-çevik olmasıdır. Bazı açılardan, yavaşlamak iyi bir şey çünkü sizi daha ön düşünmeye ve ilk kez doğru şeyler yapmaya zorluyor. Diğer taraftan, ilerledikçe titizlikle belgelemek, kodunuzu yeniden düzenlemenin önünde büyük bir engel olduğu anlamına gelir. LP kodunu eklemeden önce kodunuzun sertleşmesini beklerseniz, sizi izlerinizde durdurabilecek çok günlük bir dokümantasyon görevi görürsünüz.


Deneyimden sonra, LP'nin tatlı noktalarının hepimiz için geçerli kodun hemen yanındaki tasarım kararlarını ve mimari detayları belgeleyebileceğini öğrendim . LP'nin refaktör için daha zor olmasına katılıyorum. Anladığım kadarıyla Knuth ilk tasarımını kağıt üzerinde yaptı ve yalnızca gerçek uygulamaya başladığında tatmin oldu. Bu büyük olasılıkla benim için uygun bulduğum aynı durum.
Thorbjørn Ravn Andersen

3

Alçakgönüllü görüşüme göre, birçok şirketin Okuryazar Programlamanın amaçlarına zıt bir kültüre sahip: daha hızlı sonuçlar istiyorlar (yalnızca uygulama üretimde iken kalite hakkında ağlıyorlar). Kendi tecrübelerime göre, patronlarım daha hızlı sonuçların "istediğim günden sonra çalıştırılabilir bir program" anlamına gelmediğini anlamayı reddetti. Onlar için, eğer bir geliştirici klavyesini yazmakla meşgul değilse, çalışmıyor demektir, "tasarım anlamında zamanını boşa harcıyor". Evet, biliyorum patronum bir göt deliği.


O zaman Literatür Programlama ile, başka bir yazılım yerine Sci-Fi Book yazmakla meşgul olduğunuzu düşünebilirler! : D
Mehdi

Bunun gibi şirketler, iyi bir yazılımın çok uzun yaşadığını ve kaynağın ne kadar değerli olduğunu belgelemek anlamıyor.
Thorbjørn Ravn Andersen

2

Kodlayıcılar İngilizce değil kod yazarlar.

Kodlayıcılar dokümantasyon yazmayı sevmez, çünkü kodun çalıştırılmasına yardımcı olmaz.

Kodlayıcılar dokümantasyon yazma konusunda iyi değil çünkü fikirlerini ifade etmek için zayıf bir ortam.

Okuryazar programlama, dokümantasyonun kodun daha sonradan düşündüğü bir sonraki seviyeye götürülmesi fikri gibi görünüyor. Belki işe yarayabilir, ama çoğu kodlayıcı iğrenç dokümantasyona benziyor.


29
Tanımladığınız noktalara uyan kodlayıcılar, benimle çalışmak istediğim kodlayıcılar değil.
Paul Nathan,

1
@ Paul, verildi. Ama bu gerçekten orada ne var. Fakat bana öyle geliyor ki, daha fazla dokümantasyonun mutlaka daha iyi olması gerekmez.
Winston Ewert

1
Muhtemelen en iyisi
mlvljr

6
deneyimli programcılar dokümantasyon yazmak zorunda olduklarını biliyorlar çünkü “NEDEN böyle yaptım” işte böyle.

1
@ Thorbjørn Ravn Andersen, evet bu doğru. Ancak okuryazar programlama, (anladığım gibi), kodunuzla belgeler yerine belgelerinizle kod yazmanızı önerir. Bu kadar belge gerçekten yardımcı oldu mu?
Winston Ewert

2

Prensip olarak, insanlar çok salaktır. Genç insanlar tarafından bu basit tekniğin doğası hakkında ifade edilen sonsuz bir tahmin ve yanlış anlama akışı olan açık bir tanıklık.

İnsanlar LP'yi şu şekilde alır: (a) bir dokümantasyon yöntemi (b) bazı özel beceriler veya yetenekler gerektiren bazı cilalanmış yazılar yazma yöntemi (c) kendi fikirleriyle Leo programlama editörünün yaratıcısı olarak hiçbir ipucu yok. vb. vb.

Bununla birlikte, LP basit bir şekilde: (1) programların bir (= herhangi bir) insan dilinde bir kod ve öbekler karışımı halinde yazılması, ikincisi diğer kod öbekleri ve / veya içerilen öbeklerin kısaltmasıdır. Bu, sayısız programlama ders kitabının yazarlarının yaptığı tam olarak budur. (2) İnsandaki cümleleri genişleten basit bir önişlemcidir. yorumlayıcı). Aksi halde, "okuryazar kaynak" ı güzel, iyi biçimlendirilmiş okunabilir bir metne dönüştürmek için biçimlendirme sembollerini içermek üzere, yazılı metni başka bir küçük yardımcı programla genişletebilirsiniz.

Gençler bu son derece basit bir fikri asla denemezler - ve asla denememeleri veya yapmamaları gibi sahte sebepleri hayal ederler veya hayal ederler.

Temel olarak, bir insan dilinde yazılmış "sahte kodda" programlama ve ardından basit bir önişlemci yardımcı programı ile genişletme ana fikri, program akışınızın kod katlanması veya bölünmesi gibi İşlevlere / alt programlara girerek, ayrıntılarda kendinizi kaybetmemeniz için gerekli, ancak makinenin çalışması için tamamen gereksizdir.


3
Önemli bir parçayı kaçırıyorsunuz: (3) herhangi bir dilde bir kodu, bir derleyicinin uğraşmak zorunda olduğu sırayla değil, en okunaklı ve doğal sıraya göre yeniden sıralamanın bir yolu. Uygulama ayrıntılarını dipnotlarda veya kod anahattından uzak bir yerde saklamayı içerir.
SK-mantık

1

Bunu okur programlama 2 yönü vardır do dilek ana programlama dahil edildi - gömülü görüntüleri (örn tasarım diyagramları) Önceki ve alternatif girişimleri (ve işaretçiler örneğin "ben bu başka bir yol denedi çünkü bu gibi nedenidir ve işe yaramadı çünkü ... "). Bu özelliklerin her ikisi de doktor yorumları ve URI'lerle ele alınabilir.


1

Çünkü programların mantığı konuştuğumuz gibi çalışmıyor. Bir program iyi tanımlanmış bir akışa, koşullara ve döngülere sahiptir.

Çok kodladıktan sonra bu terimlerle DÜŞÜNÜYORUM. Beynim sorunları çalıştırılabilir kodun hedef alanına dönüştürüyor. Üstelik, programları okuryazar yapmak için fazladan bir dönüşüm adımı yapmak zorunda kalmak yerine, bunu genellikle programlama dilinde yazmam çok daha etkili.

Aslında, programlarımın zaten okuryazar olduğuna inanıyorum ... konuşan tanımlayıcılar, iyi işlev adları, birkaç ay sonra hemen kendimi anlayamayacağım bazı korsanlıklar yaptığım yorumlar.

Sonuç olarak: Java kodum, her "okuryazar" programlamanın istediği gibi kendi başına okuryazardır.


2
Bir Java kodu okuryazar olamaz. "Konuşan tanımlayıcılarınız", neden bu belirli algoritmayı diğerinden tercih ettiğinizi, limitlerin neler olduğunu, performans profili beklentilerinizin ne olduğunu vb. Asla açıklamayacak. ingilizce metin Ancak bunların tümü bir kodda ifade edilemez ve basit yorumların içine çirkin gözükmez.
SK-mantık

1

Diğer yollarla programlamaya başladım - derleyicinin istediği gibi değil, aklıma uygun bir şekilde düzenlenmiş bir kodun olmasını hayal ettim. Leo'yu bu amaç için neredeyse ideal buldum . Ayrıca, dışarıda değiştirilen dosyaların kaydını tutmayı da destekler. Bu dosyalar herhangi bir özel işaretlemeye sahip olmak zorunda değildir, bu yüzden takımdaki diğer kişilerin bilmesine gerek kalmadan Leo'yu kendim için kullanabilirim. Bu özellik - "@shadow ağaçları" - hala ümit verici olmasına rağmen, daha fazla göz küresine ihtiyaç duyuyor, çok umut verici. Ve ayrıca "ah hayır, büyük bir dosyadaki her şey" sorununu da hem ağacı çerçevesine düzenleyerek hem de harici dosyaları destekleyerek düzeltir.

Benim için, adının aksine, "okuryazar programlama" hiç belgelerle ilgili değil. Daha önce olduğundan daha fazla dokümantasyon yok. Bu, kaybolmama yardımcı olan bir yapıya sahip olmakla ilgilidir . Özellikle JSP dosyalarının yönetimini yönetirken yemin ederim (ve Leo'nun orijinal olarak Python'a yönelik olmasına rağmen ve JSP dilini desteklemiyor olmasına rağmen - dosyayı el ile Leo ağacına bölmeliyim!).


0

Kod üzerine bir tez yazılabilecek değerli bir öğretim aracı olarak görüyorum ve daha sonra çalışma kodlarının parçaları okurlara kodun nasıl, neyin ve niçin olduğunu öğretmek için araya giriyor.

Tamamen eğitici bir ortam dışında, sadece Knuth'un en iyi nasıl kullanılacağını gerçekten anladığını düşünüyorum.


-4

Tüm dünyaların en kötüsü - çok spesifik olmayan bir dilde oldukça doğru, oldukça spesifik bir bilgisayar programı yazmalısınız: ingilizce. Bu yüzden tam olarak doğru cümleleri kullanarak dikkatlice yazmak zorundasınız - bu yüzden de sadece kod yazmak olabilir.


3
Kodunuzu ingilizce olarak tekrar etmemelisiniz. Yorumlar, kodun orada olmasının nedenini açıklamalıdır, ne yaptığını değil. Çoğu zaman okuryazar yorumlarımda grafikleri, diyagramları ve grafikleri doldururum ve kodun gerçekten anlaşılmasına yardımcı olur.
SK-mantık

Eğer yorumlar kodun ne yaptığını söylemezse, o zaman okuryazarlık nasıl programlanır - yorumlu düzenli programlama. Okuryazar programlamanın bütününün programı dokümanlardaki programlarla tanımlamak ve sistemin dokümantasyondan kod üretmesini sağlamak olduğunu düşündüm.
Martin Beckett

3
"TeX, program" okumayı deneyin. Kod, yorumlarda asla tekrar edilmez. Yorumlar, kodun neden bu şekilde yazıldığını ve mimariyi açıklar.
SK-mantık

3
@ MartinBeckett Tanımladığınız şey LP değil.
Andres F.
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.