Teknemi (programlama) derinlemesine anlamak için ustalaşmam gereken programlama kavramları nelerdir? [kapalı]


13

Önem sırasına göre, eğer mümkünse ve mümkün olmayabilirse, nasıl programlanacağını bilmenin en önemli temelleri nelerdir. Algoritmalar, yineleme, özyineleme vb.

Notu koyduğum yer vs. sorumun yattığı yer. Kısa bir süre önce, 9 programcının 9'u soluk tutamayacağını söyleyen bir İnternet yayını okudum !

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

Programlama sırasında gerçekte ne yapmaya çalıştığım konusunda derin bir bilgi sahibi olmak ve elimdeki temel araçların kapsamlı bir şekilde anlaşılmasını istiyorum. Temelde rüzgarın tüm renkleri ile boyamak istiyorum.


3
Jeff Atwood'un gönderisi gerçekten derin programlama bilgisi değil ... Pek çok insanın programlama hakkında bazı temel, temel kavrayışlardan yoksun olması ve bu temel kavrayışların eksikliğinin önemli programlama becerileri geliştirmelerini nasıl engellediğiyle ilgili.
Robert Harvey

2
Bu sorunun neden kapandığını anlamıyorum. Bu 5 kez yıldızlı bir soru ve birçok yararlı yanıtı olan bir soru. Bu, rastlamak istediğim türden bir bilgidir - basit bir cevabın olmaması, bilginin iyi bir değer olmadığı anlamına gelmez, belki de programmers.stackexchange.com'un soruları kapatma kriterlerini yeniden değerlendirmesi gerekir.
Rocklan

@LachlanB Tekrar açmak için oy verdim ... Başarılı olmak için 4 oy daha gerekiyor
Michael Brown

Bunun iyi bir soru olduğunu düşünüyorum, ancak makul bir cevap bu sitenin biçimi için çok uzun olacaktır. Herhangi bir iyi üniversite müfredatı bu kavramları kapsayacaktır ve böyle bir müfredatın birkaç yıllık özel çalışma ve uygulama gerektirmesi, ardından gerçek projeler üzerinde çalışılan ek yıllar, cevabın neden buraya sığamayacağını açıklığa kavuşturmalıdır.
Giorgio

Yanıtlar:


18

Bu liste bir başlangıç ​​... büyük bir soru soruyorsun!

  • Müşterilerin ne istediğini netleştirme ve yazma ("gereksinimler"). Bu kendi içinde bir sanattır. Bunu yapabiliyorsanız, programlama işiniz çok daha iyi olacaktır.
  • Tahmin ve proje planı. İnsanlar sizden bir tahmin isteyecektir, hazırlıklı olun.
  • Diğer kişilerin kodlarını yapıcı bir şekilde inceleme.
  • Tasarım desenleri. Bu büyük bir tane. Ama onları aşırı uğruna kullanmayın.
  • Hata, sorun ve özellik istekleri arasındaki farkı öğrenin
  • Çerçeveler / kütüphaneler ile güncel kalın. Onları kullanmak zorunda değilsiniz, ancak ne yaptıklarını ve profesyonellerinin / conlarının ne olduğunu bilmeniz gerekir. Bir şey çok zor görünüyorsa, muhtemelen (umarım) bir şeyler yapmanın çok daha kolay bir yolu vardır.
  • Bir akış şemasındaki karmaşık algoritmaları belgelemek veya sadece İngilizce yazmak. Birinin kodunuzu tersine çevirmek için 2 gün geçirmesini beklemeyin.
  • Kod yapınızı başkalarının anlayabilmesi için nasıl düzenleyebilirsiniz
  • Kodunuza nasıl yorum yapılır?
  • Birim testleri nasıl yazılır
  • Kaputun altında neler olduğunu bilin. Örneğin, bir web servisini aramak - aslında ne yapıyor?
  • Sınıflara mantık nasıl soyutlanır.
  • Kodu yeniden düzenleme
  • Birkaç programlama dilinin özünü öğrenin. Diğer bölgelerden neler öğrenebileceğinize şaşıracaksınız
  • Diğer programcılara ne yazacaklarını nasıl söyleyebilirim.
  • Ne yaptığınızı ve nedenini yönetime nasıl açıklayabilirsiniz.
  • Peter'ın dediği gibi, nasıl hata ayıklanır. Söylediği her şeye katılıyorum, gerçek programcılar hata ayıkla, sadece tahmin değil.
  • Manyaklarla nasıl çalışılır. Orada bir sürü var.
  • YAPILANLAR NASIL YAPILIR. İşleri yapamazsanız dünyadaki tüm teori size yardımcı olmaz.

Benzer satırlar boyunca (benzer içerikle) başka bir soruya cevap verdim:

ipuçları, kılavuzlar, profesyonel kod oluşturmak için hatırlanması gereken noktalar?


1
+1: ÖĞRENCİ YAP! Birkaç yıl önce bunun bir mühendisin belirleyici özelliği olduğunu söyleyen bir rant yayınladım - işlerini hallediyorlar. Bazen hoş değil ve bazen geri dönüp tekrar yapmanız gerekecek, ancak günün sonunda işleri halledeceksiniz!
Peter Rowell

@PeterRowell: bunu ilginç bir okuma olarak bulabilirsiniz: brandonsavage.net/when-to-write-bad-code
Marjan Venema

Maalesef soru gerçekten sitenin Soru-Cevap felsefesine ve biçimine uyan bir soru değil, ancak bu yanıtınızın değerini en aza indirmiyor. Genişletmek ve her nokta için biraz açıklama eklemek isterseniz, topluluk blogumuz için harika bir blog gönderisi yapar .
yannis

@MarjanVenema: Evet, ona tamamen katılıyorum. 80'lerde, kodlamaya başlamadan önce onaylanacak yeni bir editör için bir özellik yazmakla görevlendirildim. Anlamadığım bir şeyi nasıl tanımlayacağımı anlamaya çalışmak için bir haftadan fazla bir süre o lanet boş ekrana baktım. Yöneticim ilerlememdeki eksikliğiyle ilgili memnuniyetsizliğini dile getirdi. 3 günlük bir hafta sonunda masasının üzerinde bir taslak vardı. Ne olduğunu sordu ve haftasonu editör yazdığımı ve daha sonra çalıştığım şeyin bir spesifikasyonunu yazdığımı söyledim. Bazı kodları yeniden yazmak, ancak çoğunlukla refactor / cleanup oldu.
Peter Rowell

1
@YannisRizos - Bu konuda bir blog yazmakla ilgilenirim. Bana herhangi bir yönerge içeren bir e-posta göndermek ister misiniz yoksa bir şeyler yazmalıyım?
Rocklan

22

" Vb. " Başlığı altında zamanınızın% 50'sini veya daha fazlasını kolayca alabilen bir şey gelir.

Hata ayıklamayı öğrenin.

Bu Bilimsel Yöntemi öğrenmek demektir . Ben demek gerçekten öğreniyor. Ve sonra acımasız dürüstlükle uyguluyorum . Bildiklerinizin doğru olduğunu, bildiklerinizin doğru olmadığını ve bilmediğiniz şeyleri tam olarak nasıl ifade edeceğinizi öğrenin . Eğer Sloppily yanlış kategoriye bir öğe atamak istediğiniz zaman, sadece hayatınızı yaptık çok zor.

"Biliyorum" yerine "Sanırım" demeyi öğrenin. Sadece bir şeyi doğru (ya da yanlış) “düşündüğünüzde” “biliyorum” der ve sonra bunu kanıtlarsınız!

Birçok hata önemsiz, ancak kodun ne olması gerektiğini "bildiğiniz" için zor olabilirler. Açıklamak için bir freind bulun. Onlardan bir "uzman salak" olmalarını isteyin: kodunuzu bilmeyen, ancak tanıdığınız bir kişi BS geçmişini patlatamaz. Onları tarif eden bir şeyin ortasında aniden durup der ki "ve böylece ... görüyorsun ... görüyorsun ... sh * t. Teşekkürler."

Önemsiz hatalar bir teknik cephaneliği gerektirir. Çoğu zamanlama ile ilgili olmayan hataları hızlı bir şekilde vurgulayabilen bir klasik Alaska'daki Wolf Fence'dir. Alaska'da bir yerde bir kurt var; devleti yarıya indiren bir çit inşa et. Kurt hangi tarafta? O tarafı ikiye kesin. Köpürtün, durulayın, tekrarlayın. Bunu kodda iyi seçilmiş yerlerde 20 kez yapmak, hatanın (kurt) olabileceği alanı 1/1048576'ya düşürür. O kurdu öldür.

İpucu: el dalgalarını arayın - fiziksel , zihinsel veya başka herhangi bir tür. Siz (veya iş arkadaşınız) kodun bir kısmına verilen dikkati çeker / saptırır / en aza indirir indirmez, tamamen kuduz gidin . Çünkü d * mn şeyi aramak için saat / gün geçirdiyseniz ve hala bulamıyorsanız bile, hatanın bildiğiniz alan olamaz, bu hata için en yüksek olasılıklı konumdur. Kimse “hoşçakal” alamaz , hiç kimse (makine, işletim sistemi, derleyici veya siz dahil ) herhangi bir “gerekli saygı” alamaz. Bir hata var. Dönemi. Cümlenin sonu. Şimdi git d * mn şeyi öldür.

Kendi kendine bir konu olarak hata ayıklamayı öğreten hiçbir okul bilmiyorum. IMNSHO, bu onların (üniversiteler / profesörler) size bir programcı olmayı öğretmediklerinin en göze çarpan delil parçası olabilir, bunun yerine, onlar gibi ... Sert? Belki. Doğru? Kendi kararını ver. Şimdi kanıtla.


Kent Beck tarafından açıklanan ve hata ayıklama için test ve yeniden düzenleme kullanan bir teknik olan Saff Squeeze ile ilgilenebilirsiniz : Hit 'em High, Hit' em Low : Regresyon Testi ve Three Rivers Institute tarafından Kent Beck tarafından Saff Squeeze (Özet: Kime bir arızayı etkin bir şekilde izole edin, sistem düzeyinde bir testle başlayın ve arızayı gösteren mümkün olan en küçük teste sahip oluncaya kadar aşamalı olarak satır içi ve budama yapın.) Testleri ve IDE'leri Yeniden Düzenleme yeteneklerini kullanarak Kurt Çitinize çok benziyor.
Jörg W Mittag

1
Harika cevap - herkes kod yazabilir, gerçek programcılar hata ayıklama.
Rocklan

@ JörgWMittag: Otomatik regresyon testinin büyük bir hayranıyım. İlk olarak 80'lerin ortalarında bir arama motoru projesinde kullandım ve masum görünümlü bir kod parçasına "küçük" bir değişiklik olduğu ortaya çıkan şeylerden sonra şok oldum (şok!). (Not: Bu 200.000'den fazla C SL'si idi ve bellek yönetimi sorunları varlığımızın sıkıntısıydı.)
Peter Rowell

3

Korkarım ki, özellikle öncelikli bir liste istediğiniz göz önüne alındığında, herkesin kesin veya yetkili olarak cevap vermesi oldukça büyük bir soru. Orada çok sayıda programcı var ve çok farklı şeyler üzerinde çalışıyorlar - elbette, temeller aynı kalıyor, ancak hafızanızda aktif kalmanız için ihtiyacınız olan şey gerçekten farklı olabilir ve gerçekten de güzel kalabileceğiniz birçok görev var daha derine inmeden yüksek düzeyde.

Görünüşe göre, sadece bir ticaret krikosu değil, daha iyi bir geliştirici olmaktan gerçekten endişe duyuyorsunuz. Bunu takdire şayan buluyorum ve nasıl programlanacağımı öğrenmeme yardımcı olan bazı şeyleri paylaşabilirim.

Hemen hemen tüm programlama algoritmalara ve veri yapılarına dayanır. Bunlar da daha büyük sorunun örnekleridir - gerçek dünyadaki şeyleri ve süreçleri bir bilgisayarın anlayabileceği şekilde bir temsile nasıl modelleyebiliriz. Yeni başlıyorsanız, veri yapılarını ve algoritmaları uygulamaya alışmak için daha üst düzey bir programlama dili (Java, Python gibi) kullanmak yararlı olabilir.

Belli bir noktada, veri yapıları ve algoritmalarla oynadıktan sonra, bu kemirici soruyu almaya başlayabilirsiniz "ama bilgisayara ne yapması gerektiğini, bilgisayardan bunu gerçekten yapmasını nasıl söyleyebiliriz?" Daha sonra bir bilgisayarın gerçekte nasıl hesaplandığına bakabilirsiniz - talimatları yürütmek için bellek ve CPU'nun birlikte nasıl çalıştığı, işletim sistemlerinin donanımı nasıl özetlediği, böylece belirli bir düşük seviyeye kodlama yapmadan bir dosya açan bir program yazabilmeniz için sabit sürücü arabirimi.

Bu muhtemelen başlamak için iyi bir noktadır - algoritmaların ve veri yapılarının gerçek dünyadaki problemleri nasıl modellediğini ve bir bilgisayarın aslında hesaplamayı nasıl gerçekleştirdiğini. İkincisini bilmek, OO ve komut dosyası dillerinden çok daha az duman ve ayna kullanan C gibi alt düzey dillerin öğrenilmesinde çok yararlıdır :)


2

YAGNI : "Her zaman onlara gerçekten ihtiyacınız olduğunda uygulayın, asla onlara ihtiyacınız olduğunu asla öngörmediğinizde."

Benim tecrübeme göre, "programcılar" gelecekte birçok vaka öngörmek ve onları tahmin etmek için kod ekleyerek kodu "geliştirmek" için yaygındır! Çoğu durumda, ekledikleri kod sadece kodu şişirir ve koda karmaşıklık katar.


1

Programcı olmakla ilgili bilinmesi gereken en önemli şey, kod yazmanın bir eziyet olmasıdır ve üretmek için ödendiğiniz şeyi üretmeye yönelik işçinin "mavi yakalı" bir tutumu, sizi ezoterik öğrenmelerden daha da ileriye götürecektir.

Bölgeye girmeyi öğrenin. Bununla, sadece görevinize odaklandığınızda zihinsel durumu kastediyorum ve kafanızda birçok şeyi ve bunların bir anda nasıl birlikte çalıştığını başlatabilirsiniz. İstediğiniz zaman bölgeye girme alışkanlığınız olduğunda, geri kalanı için endişelenmeye başlayın. Sen bir şey gibi vurma bir tür kod gibi kod dışarı kadar, gerisi neredeyse işe yaramaz.

DÜZENLE:

Eğer buna inanmıyorsanız ve beni aşağı ittiyseniz, 20 yıl boyunca yapmaya kararlı olup olmadığınızı bilmediğinize inanıyorum. Bunu biliyorum çünkü bunu kabul ediyorum. ;)


0

Bu soruyla bir şekilde ilgili yeni bir soru ve Yanıt , aynı sorunu farklı bir açıdan tartışan Bu blog'a bir bağlantı vardı .

Muhtemelen herhangi bir geliştirici için en önemli kavram "alçakgönüllülük" .... Kabul ettikten sonra hepsini bilmiyorsun, çözümleri keşfetmeye açıksın. Programlama üzerine blog yazan insanların çoğu en yüksek yüzdelikte ve sorun henüz narsisistik eğilimlerini kontrol etmek için henüz .... bu yüzden blog blog ..... Bu blogcular tanımlamak öğrenmek gerekir ve sıraları görmezden gel

Bağlantılı blog gerçekten bir ranttan başka bir şey değildir - Her sektörde yeni mezunların yararsız olduklarından şikayet ediyor, yararlı ve üretken olmaları yıllar alıyor. Belki de sorun, bu kendini ilan eden gurunun aslında çok fazla şey beklemesi ve bir kez FizzBuzz'ı çözemeyeceklerini unutmuş olmasıdır. Herkes ilk 10 yüzde içinde olamaz, tanımı gereği, programcıların yarısı ortalamanın altında ...


Ben insanların çok rant katılıyorum, ama yukarıda bağlantılı mesajların amacı FizzBuzz çözmek için nasıl bilmiyor insanlar programlama işlerine başvurmak olduğunu düşünüyorum , bu sadece bir acemi olmak ve sarmak gerekir farklı kafanızı programlama deyimleri etrafında. Bununla birlikte, alçakgönüllülük konusunda size katılıyorum ve birçok insan bunun ne olduğunu bilmiyor gibi görünüyor.
RuslanD
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.