Nasıl çalıştığına dair bir fikriniz olmadığında bir şeyi nasıl kodlarsınız? [kapalı]


14

Yakın zamanda C öğrendim ve bilgimi sağlamlaştırmak için bir proje başlatmak istiyorum. Vim gibi çok basit bir metin editörü yapmaya karar verdim. Karşılaştığım sorun, bir metin düzenleyicinin nasıl çalıştığına dair gerçekten hiçbir fikrim yok ve bunu öğrenmek için Google'a ne yapacağımı bilmiyorum.

Bu konuda google vim GitHub repo yol açtı, bu benim için işe yaramaz çünkü kod tabanı çok büyük ve kod beni karıştırıyor. Ayrıca C'de bir çeşit vim gibi çalışan bir metin editörü yapmak için eğiticiler buldum.

Öğreticileri takip etmeyi düşünmeme rağmen, hile gibi geliyor. Vim geliştiricileri, belirli öğreticiler olmadan vim'in nasıl kodlanacağını nasıl anladılar? Yoksa daha basit metin editörlerinden mi başlamışlardı? Bunu sadece dil bilgisinden ve belgelerinden nasıl anladılar?

Doğrudan bir öğreticiyi takip etmeden bu metin düzenleyicisini yazmaya başlamak için tam olarak ihtiyacım olan şey nedir? Düşünmeyi sevdiğim bir başka örnek de: Dennis Ritchie ve Ken Thompson Unix'i nasıl kodladı? Nasıl işletim sisteminin işlevi hakkında bir fikrim var, ama nasıl koda koymak için hiçbir fikrim yok. Kaçırdığım şey nedir? Bu dil bilgisini gerçek, pratik kullanıma nasıl aktarabilirim?


14
Kendinizi uzun geçmişlere ve sıra dışı insanlara sahip projelerle karşılaştırıyorsunuz. Unix, sistem düzeyinde programlama konusunda uzun yıllara dayanan deneyime sahip bir araştırma grubundan kaynaklanmıştır ve daha karmaşık Multics OS ile olan deneyimden faydalanmıştır. Vim, ed. Bu programlar aniden ortaya çıkmadı, yüzlerce insan tarafından inşa edilen bir evrimdi. Bu yüzden, tüm bu tarihi atlamayı zor bulduğunuzda hayal kırıklığına uğramayın. Hiç kimse yapamaz. Bunun yerine, sadece kavramanız dahilinde, ancak yine de zorlayıcı olan, anlayışınızın kenarında olan projeler yapmaya çalışın.
amon

8
Ksilofonda bazı melodileri çalmayı öğrendiniz ve şimdi büyük bir uluslararası orkestrada çalmak mı istiyorsunuz? Hadi, çok bekliyorsun. Programlama bir enstrüman çalmak gibidir - küçük, basit melodilerle başlarsınız ve birkaç yıl çalıştıktan sonra bir senfoni çalmayı öğrenirsiniz.
Doc Brown

3
Kabul. Birçok yeni başlayanın zor şekilde öğrendiği bir şeyi öğrenmeniz için bir şans olarak alın. Biraz başla . Ve vim kodunu da okuyun. Mevcut kodu okuyarak çok şey öğrenebilirsiniz.
Laiv

17
Temel probleminiz düşüncelerinizde netlik olmamasıdır. "Vim gibi basit bir metin editörü" diyorsunuz ve hemen ardından kod tabanının çok büyük ve kafa karıştırıcı olduğunu belirterek bunu takip ediyorsunuz. Bu, vim'e çok benzeyen hiçbir şeyin basit olmadığını gösteren güçlü bir sinyal olmalıdır . Deneyimli programcılar bile, düştüğünüz zihinsel tuzağa düşer. Henüz anlamadığınız şeyler basit değildir . Onlar karmaşık . Bilgisayar programlama zihinsel mantığı gerçeğe dönüştürüyor; programlama hakkında daha net düşünerek başlayın.
Eric Lippert

4
Ayrıca, "hile" konusunda endişelenmeyi bırakın. Bu bir oyun değil. Hedefleriniz var ve bunlar iyi hedefler. Bu hedeflere ulaşmak için yapmanız gerekeni yapın . Profesyonel bilgisayar programcılarının bir şeyin nasıl çalıştığını öğrenmek istediklerinde kaynağa bakmadıklarını mı düşünüyorsunuz? Yazmadığınız kaynaktan nasıl öğreneceğinizi öğrenmek en önemli programlama becerilerinden biridir, bu yüzden pratik yapmaya başlayın.
Eric Lippert

Yanıtlar:


17

Bu ilk programlama projenizse, basit bir metin düzenleyici bile çok karmaşık olabilir. Vim veya OS gibi bir şey tamamen söz konusu değil.

Soruna Yaklaşım

Genel olarak, başlangıç ​​yöntemi çoğu proje için kabaca benzerdir:

  • Gereksinimlerinizi karşılıyorsunuz Yazılım tam olarak ne yapacak?
  • Çok az gereksinimle başlıyorsunuz ve daha sonra işlevselliği yavaş yavaş ekliyorsunuz.
  • Mevcut gereksinimlerinizin yarattığı sorunları alt sorunlara ayırıyorsunuz.
  • Nasıl uygulayacağınızı bildiğiniz bir şey olana kadar alt sorunlarınızı ayrıştırabilirsiniz.

Misal

Metin editörü örneğini ele alalım.

  • Ekranda bir metin dosyasının bir bölümünü görüntülemek, karakter eklemek ve kaldırmak ve geçerli sürümü kaydetmek istiyorsunuz.

  • Sadece bir dosyayı okumak ve içeriğini görüntülemekle başlayın.

  • Aşağıdaki alt sorunları (diğerlerinin yanı sıra) tanımlayacaksınız:

    • Görüntülenecek dosya adını nasıl bilebilirim?
    • Bir dosya adı verildiğinde, dosya içeriğini nasıl edinebilirim?
    • Bir dosyanın içeriği verildiğinde, bunları nasıl görüntülerim?

Gereksiniminizin (dosyayı yükle ve görüntüle) tamamlandığı bir noktaya ulaştığınızda, yalnızca ekrana sığacak, dosyanızda gezinecek vb. Bir bölümün nasıl görüntüleneceğini düşünmeye başlayabilirsiniz.

Sonraki adım

Zamanla, gittikçe daha karmaşık problemleri ele alırken, sorunlarınızı çözmek için uygun yollar bulmanın giderek zorlaştığını anlayacaksınız. Kod değiştirmenin zaman içinde sıkıcı olabileceğini de fark edeceksiniz.

Bu noktada, bazı temel mimari ve tasarım kavramlarını öğrenme zamanı.


Hey adam tavsiye için teşekkürler! Sanırım bu yaklaşımı benim alacağım. Fikrimi değiştirmek söz konusu olduğunda biraz inatçıyım, ancak önerdiğinizden, nasıl bir dosya görüntüleyici yapacağımı görmeye çalışacağımı düşünüyorum. Belki de dosya meta verilerini bir şekilde göstermenin bir yolunu ekleyebilir misiniz? Muhtemelen bunu kendim anlayabilirim. Çok teşekkürler!
Faithlesss

2
Buna eklemek için, "bunları nasıl görüntüleyebilirim", muhtemelen ekrandaki belirli bir konuma (bir komut satırı düzenleyicisinden bahsediyorsak) belirli bir karakteri yazmak için daha da bölünebilir; kolayca çevrimiçi bir cevap bulmak.
Dukeling

2
"basit bir metin düzenleyici bile çok karmaşık olabilir" metin editörleri şaşırtıcı derecede karmaşıktır. 20 MB'lık bir dosyayı düzenlediğinizi düşünün. Arabelleğe almayı gerektirecek kadar büyük, ancak modern bir bilgisayara vergilendirilecek kadar büyük değil. İçinde gezinebilmeniz, metin ekleyebilmeniz ve kaldırabilmeniz, metnin gerçek zamanlı olarak kendini yeniden düzenlemesini, arkasındaki model değiştikçe kaydırma çubuğu işaretleyicisini gerçek zamanlı olarak güncellemeniz gerekir. Herhangi bir biçimlendirmeniz varsa, bu daha da karmaşık hale gelir.

15

Yapmazsın.

Bir şeyi nasıl yapacağınıza dair belirsiz bir fikriniz bile yoksa, mevcut becerilerinizin ötesinde olduğunun bir işaretidir. Çünkü nasıl başlayacağınız hakkında bir fikriniz yoksa, uygulamanın en zor kısmı söz konusu olduğunda kesinlikle hiçbir fikriniz olmayacaktır.


O halde başlamak için iyi bir proje ne olurdu? Zaten kendi adam asmaca oyunumu (terminalde) ve tic tac toe oyununu yaptım. Devam etmenin bir yolunu göremiyorum, bu yüzden bir metin editörünün iyi bir fikir olacağını düşündüm.
Faithlesss

3
@faithlesss - dosyaları okuyan ve yazan bir şey temel bir ara adım gibi görünüyor.
Telastyn

9
Bir dosya görüntüleyicisi sonra iyi bir proje gibi mesela bir çağrı cihazı olabilir less, moreya da viewprogramlara. Değişken düzenleme arabelleklerinin karmaşıklığı olmadan editörlerin bazı yönlerini paylaşırlar.
amon

@Telastyn seni yakaladım. O zaman bir dosya görüntüleyici yapmaya, muhtemelen temel metin formatlarını okuyabilen basit bir biçime bakmaya ve sonra bir json veya csv dosyası gibi bir şeyin nasıl okunacağına karar vermeye devam edeceksiniz? Ayrıştırmak o kadar zor olmamalı, sadece gerçekten sanırım string.h belgelerine bakmak zorunda. Tavsiye için teşekkürler!
Faithlesss

2
@Faithlesss Ayrıca , metin editörü programlarının öncüsü olan bir satır editörünün özelliklerine de göz atın
Bergi

2

Sen nasıl karar vermeniz gerekir Eğer istediğiniz senin işine metin editörü.

Bu, başlangıçtan bitişe kadar kendi projelerinizi geliştirmenin en ağırlaştırıcı ve ödüllendirici deneyimlerinden biridir. Kimse size inşa etmek için gereksinimler göndermiyor. Kendi gereksinimlerinizi geliştirmeniz gerekir.

Bu, ilk kod satırınızı yazmadan önce çok fazla tasarım çalışması yapmanız gerektiği anlamına gelir. Arayüzün neye benzediğine karar vermeniz gerekecek. Hangi işlevselliği dahil edeceğinize karar vermeniz gerekir. Yukarıdaki soruların her ikisi de yapabileceğinizi hissettirecektir. "İdeal" durumu (arayüzün nasıl çalışmasını istersiniz) düşünüyorsanız, ancak kodlama yeteneğine sahip değilseniz, alternatif yaklaşımlara bakmaya başlamanız gerekir: Bunu nasıl çalıştırabilirim? Bu, daha fazla bilgi edinmek isteyebileceğiniz kodlama yaklaşımlarına odaklanmanıza yardımcı olur.

Diğerlerinin söylediği gibi, vim'i kopyalamaya çalışmak büyük ve karmaşık bir kod tabanı olduğundan en iyi yaklaşım olmayabilir. Ayrıca, mütevazi düşünceme göre, bir geliştirici olarak yuvarlanmanıza yardımcı olan tasarım çalışmasını da inkar ediyorsunuz.

Bu, ilk kod satırınızı yazmadan önce uygulamanın tamamının baştan sona tasarlanması gerektiği anlamına gelmez. Daha fazla bilgi edindikçe gereksinimlerin zamanla değişmesi uygundur. Kendi uygulamanızı test edip / kullanana kadar aklınıza gelmeyen yeni özellikler eklemeniz ve "Olsaydı iyi olmaz ..." diye düşünün. Basit başlamak basittir.


1

Hiçbir programlama deneyimi olmadan sıfırdan tam özellikli bir metin editörü yazmak aptalca: Çok şey öğrenmeden önce cesaretiniz kırılacak ve vazgeçeceksiniz.

Birkaç alternatif akla geliyor:

  • Bildiğiniz bazı ürünlerin kodlarını inceleyin. Yeterli iseniz vim, buna bakın ve verileri temsil etme veya tek bir karakteri ( fkomut) arama gibi küçük ve yalıtılmış bir şeyi anlamaya çalışın .
  • Çok basit bir programın kodunu inceleyin ve oradan yukarı doğru çalışın: catkomut sonra wcsonra grepsonra sed.
  • Editörün sadece tek bir özelliğini yapan bir program yazmaya çalışın. Bir dosyanın her satırındaki (geri yazmadan) ikinci karakteri silebilir veya bir dosyanın yalnızca 50 - 70 arasındaki satırlarını görüntüleyebilirsiniz.

1
Ortak kalıplar hakkında biraz bilgi sahibi olmadan, vim gibi büyük bir projenin küçük bir parçasını bile anlamsız hale getireceğimizi düşünüyorum. Yine de çok küçük açık kaynak projelerine bakmak iyi bir fikirdir. Böyle bir programda hedefli bir değişiklik yapmaya çalışmanın öğrenmenin harika bir yolu olacağını da ekleyeceğim . Avantajı: gerçek dünya programlarında kullanılan bazı kalıpları öğreneceksiniz. Dezavantajı: Bir anti-patern de öğrenebilirsiniz.
Doubleyou
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.