Lütfen, teknik konularda kalın, davranış, kültürel, kariyer veya politik konulardan kaçının.
Hata derleyicide veya çalışma zamanı kitaplıklarında değil kodunuzdadır.
Olası bir hata görüyorsanız, programınızı doğru şekilde oluşturup dağıttığınızı kontrol edin. (Özellikle karmaşık bir IDE veya dağınık ayrıntıları sizden gizlemeye çalışan bir çerçeve kullanıyorsanız ... veya yapınız çok sayıda manuel adım içeriyorsa).
Eşzamanlı/çok iş parçacıklı programların yazılması zor ve düzgün test edilmesi daha zordur. Eşzamanlılık kütüphaneleri ve çerçevelerine olabildiğince yetki vermek en iyisidir.
Belgeleri yazmak, programcı olarak işinizin bir parçasıdır. Bunu "başkası" için bırakmayın.
DÜZENLEMEK
Evet, 1 numaram abartılı. En iyi tasarlanmış uygulama platformları bile hata payına sahiptir ve daha az iyi tasarlanmış olanlardan bazıları bunlarla doludur. Ancak yine de, önce kodunuzdan her zaman şüphelenmelisiniz ve yalnızca derleyici/kütüphane hatalarını varsa suçlamaya başlamalısınız. Kodunuzun hatalı olmadığını gösteren açık kanıtlar.
C/C++ geliştirme yaptığım günlerde, sözde optimize edici "hataların" bana/dilin belirttiği şeylerin tanımsız sonuçlara sahip olduğu şeyleri yapan başka bir programcı nedeniyle ortaya çıktığı vakaları hatırlıyorum. Bu, Java gibi sözde güvenli diller için bile geçerlidir; Örneğin. Java bellek modeline uzunca bir göz atın) (JLS bölüm 17).
Kayan nokta hesaplamaları değil hassastır.
Öğrenmeyi bırakma.
Kodunuzun kalitesini ve sürdürülebilirliğini artırmak için yapabileceğiniz 1 numaralı şeyin DUPLICATION'I AZALTIN.
Sorun Giderme ve Hata Ayıklama Becerileri
Aldığım programlama derslerinin hiçbirinde bu konuya neredeyse hiç zaman harcamıyorlar ve tecrübelerime göre, bir programcının ne kadar üretken olduğunun en büyük belirleyicilerinden biri. Beğenin ya da beğenmeyin, uygulamanızın bakım aşamasında yeni geliştirme aşamasından çok daha fazla zaman harcarsınız.
Sorunu herhangi bir şekilde bulmak için herhangi bir strateji olmadan rastgele değiştirerek hata ayıklayan birçok programcı ile çalıştım. Bu konuşmayı onlarca kez yaptım.
Diğer Programcı: Bence düzeltip düzeltmediğini görmeye çalışmalıyız.
Ben: Tamam, bunu düzelttiğini varsayarak. Bu size sorunun kaynağının nerede olduğu hakkında ne söylüyor?
Diğer Programcı: Bilmiyorum, ama bir şey denemeliyiz .
Temeller. Şu anda programcılar kavramları değil teknolojileri öğreniyor. Yanlış.
Her programcı varsayımları her zaman koda koyduğunu bilmelidir, örn. "bu sayı pozitif ve sonlu olacak", "bu kod sunucuya her zaman göz açıp kapayıncaya kadar bağlanabilecektir".
Ve bu varsayımların ne zaman bozulacağını hazırlaması gerektiğini bilmelidir.
Her programcı test hakkında bilgi sahibi olmalıdır.
Öğrenmek kavramlar. Sözdizimini Google yapabilirsiniz.
Eleştirel ve mantıklı düşünme. onsuz iyi bir şey yapamazsın.
Birim Testi. Bu, kodun nasıl kullanılacağına ilişkin varsayımlarınızı kodlamanın harika bir yoludur.
Büyük O gösterimi ve sonuçları.
Bazı faydalı referanslar
Alan bilgisi. Spesifikasyon asla% 100 değildir; birlikte geliştirdiğiniz gerçek alan adını bilmek DAİMA ürünün kalitesini artıracaktır.
Düşündüğünden daha zor.
Her ne kadar normal kullanıldığında çalışan bir şeyleri bir araya getirmek kolay olsa da, hatalı giriş, tüm Edge ve köşe vakaları, olası arıza modları vb. İle başa çıkmak zaman alıcıdır ve muhtemelen işin en zor kısmı olacaktır.
O zaman uygulamayı da iyi göstermelisin.
Tabii ki işaretçiler. :)
Veriler koddan daha önemlidir.
Verileriniz akıllıysa, kod aptal olabilir.
Aptal kodun anlaşılması kolaydır. Akıllı veriler de öyle.
Neredeyse sahip olduğum her algoritmik keder, verilerin yanlış yerde olması veya gerçek anlamının kötüye kullanılması nedeniyle olmuştur. Verileriniz bir anlam taşıyorsa bu anlamı tür sistemine girin.
Kod Tamamlandı 2 - örtmek için örtün
İş için en uygun dil ve çevre. Ve bu her zaman favoriniz değil.
Böl ve fethet. Programlamadan hata ayıklamaya kadar her türlü pratik sorunu çözmenin en iyi yolu genellikle budur.
Gerçek beceri, karmaşık bir tasarımın hiç çalışmamasına değil, basit bir tasarımı iyi uygulama yeteneğine de yansır.
Bu beceri, sırların ustalığında değil, temellere daha fazla hakimiyetten gelir. Yüksek kalibreli bir programcı, başkalarının yapamayacağını kodlama yetenekleriyle tanımlanmaz (daha yüksek seviyeli fonksiyonlar kullanarak, gelişmiş fonksiyonel programlama, sahip olduğunuz) ama daha çok sıradan kodlamayı hassaslaştırma becerilerinde. Sınıflar arasında uygun işlev ayrışmasının seçilmesi; sağlamlık içinde bina; savunma programlama tekniklerini kullanarak; ve daha fazla kendi kendine belgelemeye yol açan desen ve isimler kullanarak, bunlar yüksek kalibreli programlamanın ekmeği ve tereyağıdır.
Sizin veya bir başkasının ayda bir veya bir hafta içinde geri gelebileceği ve bu kodun nasıl kullanılacağını, değiştirilebileceğini, geliştirilebileceğini veya genişletilebileceğini iyi bir kod yazmak çok önemlidir. Size zaman ve zihinsel çaba kazandırır. Daha önce karşılaşacağınız barikatları kaldırarak üretkenlik çarklarını yağlar (belki de düşünce treninizi kesintiye uğratır veya belki de diğer çalışmalardan saatler veya günlerce çaba harcar vb.) Zor sorunlara konsantre olmanızı kolaylaştırır. ve bazen zor problemleri ortadan kaldırır.
Tek kelimeyle: zarafet. Her sınıf, her yöntem, her koşul, her blok, her değişken adı: zarafet için gayret edin.
Kullanıcıyı asla daha temiz bir kullanıcı deneyimi veya daha iyi belgelerle düzeltilebilecek şeyleri suçlamayın. Çoğu zaman, programcılar otomatik olarak kullanıcının sorun genel bir deneyim veya iletişim eksikliği olduğunda doğru bir şey yapamayan bir aptal olduğunu varsayar. Programların kullanılması amaçlanmıştır ve kullanıcıya hor davranmak, ilk etapta programlama noktasını kaçırmaktır.
Her programcı hata ayıklayıcıyı nasıl kullanacağını ve nasıl kullanacağını bilmelidir iyi.
Google nasıl kullanılır?
Veri yapıları
Kısa devre değerlendirmesi, boolean operatörleri hakkında size öğrettikleri ilk şeylerden biri olduğunu düşündü.
Kullanıcı hataları değildir; bunlar kullanılabilirlik hatalarıdır:
rm
'a bakın, hangi yine de çöp kutusuyla çalışmaz.rm
, tekrar.Özellikle GNU Araçlar veya GNOME'u seçmemekle birlikte, bunlar en kolay örneklerdir.
Bir özelliğin uygulanması için ne kadar zaman alacağını doğru bir şekilde tahmin etme. Daha da önemlisi, bu tahmini gönderdiğinizde saçmalık olmadığınızı nasıl ifade edersiniz.
Kodlama stili önemlidir:
... ve iyi tasarım önemlidir.
İdeal olarak, programcı ilk kod incelemesinden önce (veya sırasında) bunları öğrenir. En kötü durumda, programcı patron ona aceleyle korkunç bir kodda önemsiz değişiklikler yapmasını söylediğinde öğrenir.
Burada ticari yazılımlardan bahsetmişken ... Açıkçası bir DOD güvenlik sistemi veya bir riskten korunma fonu miktarı için geçerli olmayabilir.
Orada -
1) = OO (nesne yönelimi)) ötesinde diğer programlama paradigmaları
Bilgisayar gerçekten nasıl çalışır, dil temelleri, algoritmalar/veri yapıları, algoritma analizi ve karmaşıklık teorisinin bir ölçüsüdür.
Bundan bahsedilmediğine inanamıyorum
Değerli her programcı tuz üretmek gerekir dünyaya hazır yazılım .
Bununla, tüm dizeleri dışsallaştırma gibi temel uluslararasılaştırma ilkelerini takip etmek kastediyorum.
Ürün çevrildiğinde kaç kez kodlanmış İngilizce dizeleri veya kesilmiş dizelerle vb. İletişim kutuları gördüğüme inanamıyorum.
Birim testi gümüş bir kurşun değildir. Yine de hataları tanıtabilir, yanlış testler yazabilirsiniz ve yaptığınız tek test şekli olmamalıdır.
Bilgisayarlar anlambilimi anlamıyor. Varsayalım:
var ferrari = new Ferrari();
ferrari.DriveTo(Places.Seattle);
Bilgisayar için farklı tür adları da kullanmış olabilirsiniz:
var mxEEcceqs = new safHBBdueWE();
mxEEcceqs.HYBbQAW(n3dNm.pDojeW);
Bir şeyleri adlandırmak çok önemlidir, ancak sadece "Ferrari" türünüzü veya "DriveTo" yöntemini adlandırdığınız için bilgisayarın ne demek istediğini bildiğini varsaymak gibi bir hata yapmayın.
Yürütme sırası.
Programcılarla, kod görmemiş veya dokunmamış insanlarla veya taklit programcılarla * konuşurken, şaşırmadıkları şey, yürütme sırasıdır. Kontrol yapılarını alamayan biriyle tanışırsanız, önce bu fikri başlarına alın. Bundan sonra daha hızlı öğrendiklerini göreceksiniz.
* evet, programcı olarak iş bulabilen insanlar, ama onlara en basit teknik soruyu sorduğunuzda, beyin osuruğuna giderler. Sanırım hepimiz bunlardan biriyle tanıştık.
Her programcı Bilgisayar Bilimi'nde (bilim, tasarım desenleri, algoritmalar, nesneler, vb.) “Bilimi” bilmelidir, eğer bu konuda ustalaşırsanız, herhangi bir dili kullanarak programlayabilirsiniz, bu sadece sözdizimine alışmak meselesidir.
Lexing ve ayrıştırma nedir, sadece belirsiz bir bakış iyidir. Daha da iyisi, en az bir ayrıştırıcı jeneratör çerçevesine aşinalık.
Gördüğüm en korkunç WTF'lerin çoğu, insanların özel ayrıştırma rutinleri. Başlangıçta kodlamak korkunç, korumak daha kötü.
Bir programcı, yazdıkları ifadelerin nasıl değerlendirildiğini bilmelidir. a(line.of(code) is aSequenceOf(evaluations))
ve değerlendirmenin her adımından sonra bu satırın neye benzediğini anlamıyorsanız, dil özelliklerinden yararlanabilmeniz için programcı olarak son derece kısıtlı olacaksınız.
Sadece temel şeylerden bahsetmiyorum
if (bool == false):
return true
else:
return false
tabii ki return !bool
ile değiştirilebilir.
Ayrıca, dilinizi böyle bir şey bulabileceğiniz noktaya anlama yeteneğinden de bahsediyorum:
string[] thingsToOutput;
for(int i = 0; i <= thingsToOutput.Length; print(thingsToOutput[i++]));
Böyle bir ifadeyi ilk gördüğümde aklımı biraz havaya uçurdu; Bana öyle gelmemişti ki for döngüsünü bu şekilde kaldırabilirdim. Bu ifadeyi yazan kişi, mevcut olanakları daha iyi anladı - benden daha fazla açık kapı gördüler, bu da onlara kod tasarlama yeteneklerinde daha fazla özgürlük ve güç verdi.
Şimdi, iyi kodunun bir sorun olup olmadığı - bu kapılardan herhangi biri açılmalı açılsın - bu tartışmaya açık. Bu kalır büyük güç ile büyük sorumluluk gelir.
Bu sorunun cevabını bilmek sizi programcı yapmaz
Yazılım Lisanslama Temelleri
Kapalı kaynak dostu Apache ve viral olmayan MS-PL/MS-RL ile karşılaştırıldığında "viral" copyleft lisansı (GPL) arasındaki fark.
LGPL ne zaman kullanılmalı, ne zaman kullanılmamalıdır.
Lisans uyumluluğu. Örneğin, modern bir Apache lisanslı kitaplığı bir GPLv3 koduna bağlayabilirsiniz, ancak GPL 1 veya 2'ye bağlayamazsınız.
Kaynak kodun tamamına sahipseniz, kodu istediğiniz kadar çok (veya az) lisans altında yayınlayabilirsiniz.
S.O.'ya not topluluğu:
Lütfen uygun gördüğünüz gibi bu cevabı düzenlemekten çekinmeyin ... temel olarak aşağıdaki yorumlar bölümü için uygun olmayan bilgiler içindir.
Kriptografi. Kendi şifreleme algoritmanızı yazmanız gerekmez, ancak şifreleme, mesaj kimlik doğrulaması ve PKI'nın nasıl çalıştığı hakkında temel bir anlayışa sahip olmanız gerekir. Bu alanda kör deneme ve yanılma ile çok uzun süre mücadele ettim. Son zamanlarda "Kriptografi Mühendisliği" (Ferguson, Schneier, Kohno tarafından) kitabını aldım ve gerçek bir göz açıcı oldu.
Windows/Linux/Android/iOS vb. Kodlarsanız, işletim sistemini öğrenerek başlayın. Web gibi başka bir şeyi hedeflerseniz aynı şey oraya gider.
insanlar için kod yaz!
artık sihirli sayı yok!
tüm kodu tek bir satıra yazma!
Hata olabilecek bir şey diye bir şey yoktur.
"Merhaba dünya" tam bir uygulama değildir, çünkü çıktı aslında "Merhaba dünya" olduğu kanıtlanmış/programlı bir iddia yoktur. Birim test edilinceye kadar kod tam değil.
Bunlardan bazıları zaten gönderildi, ama işte benim listem:
Kodunuzu, testlerinizi ve yazılım paketinizi nasıl dağıtacağınızı öğrenin.
Endüstride gördüğüm geliştiricilerin en kötü alışkanlıklarından biri, yazılımınızı diğer insanların ellerine nasıl koyacağınıza dair yaygın bir cehalettir, işte bazı kötü işaretler:
Yeni geliştirme ortamı-itus:
Sürüm-itus:
İkili okunur-itus:
Çok çekirdekli-itus:
Sabit kodlanmış-özellikli itus:
Basitlik, Netlik, Genellik. http://www.math.harvard.edu/computing/programming/rules.html
"En etkili hata ayıklama aracı, dikkatli bir şekilde düşünülmüş ve mantıklı bir şekilde yerleştirilmiş basılı ifadelerdir." BWK
Seçtiğiniz platformda güvenliğin nasıl çalıştığını daha iyi bilirsiniz.
İş için doğru aracı kullanın.
Programcı önemli bir unsurdur ve dil ve araçlar soruna göre seçilmelidir. Yeni diller ve projelerden korkmayın.
Programlamada ağlamak yok!
Bir FizzBuzz programı nasıl yazılır.
Bir uygulamayı dağıtmanız veya bir web sitesini şirketinizin sınırları dışında üretime sokmanız gerektiğinde, düşündüğünüz her şeyin önemi yoktur.
Kod sadece yapması gerekeni yaparsa güzeldir.
Kodu sabitlemek, başlangıçta aynı kodu yazmaktan daha fazla zeka gerektirir.
Bu nedenle, akıllılığınızın sınırına kod yazarsanız, tanım gereği, kırıldığında düzeltmek için yeterince akıllı değilsiniz.
Önce veri yapılarınızı yazın - bu, veritabanı şemalarından dönen/serileştirme mekanizmalarına kadar her şey anlamına gelir.
Çoğu proje, verileri A noktasından B noktasına C biçiminde depolamak ve taşımakla ilgilidir.
Her şey söylendiğinde ve yapıldığında kodunuzun yaklaşık% 90'ı biçimlendirme yapmak için mantıksal olacaktır, ancak gerçek katil sadece verilerinize erişmek ve yazmak için bir biçime sahiptir. Veri erişimi için bir API'ye sahip olduğunuzda, istediğiniz şekilde biçimlendirmeyle oynayabilirsiniz, ancak bir depolama API'sı ile üretime başladığınızda, onu vidaladığınızı fark etmek gerçekten acıtabilir.
Steve Yegge'in 5 temel telefon ekranı sorusunda, görüşmecilerin aşağıdakiler hakkında temel bilgilere sahip olduğundan emin olmaya çalışıyor:
http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions
Bunu yazdığı sırada Amazon'daydı, ancak şimdi Google'da çalışıyor (ve muhtemelen röportajlar yapıyor). Bu sadece ekranı geçmenizi sağlar. Aradığı şeyi şöyle tarif etti:
burada aradığım şey, bu alanlardan birinde tam bir boşluk. Biraz mücadele edip çözdüklerinde sorun yok. Bazı küçük ipuçlarına veya isteme ihtiyacınız varsa sorun değil. Paslı mı yoksa yavaş mı olduklarını umursamıyorum. Aradığınız şey, söz konusu alan hakkında tamamen clueless veya korkunç bir şekilde karışan adaylardır.
Dokümantasyon çok önemlidir. Daha çok sıfırdan bir şey inşa ediyorsanız. Herhangi bir kod yazmadan önce fikirlerinizi belgelemenize yardımcı olur.
Bunu zor yoldan öğrendim.
Henüz yorum yapamam, ama "Test ve hata ayıklama becerileri" konusunda, bu küçük gem Ned Batchelder tarafından okunması gereken bir. (O zaman kazanın, hata ayıklama ve iddialar hakkında söylediklerinin çoğu dikkate değerdir.)
Her programcı, bildiği tek şeyin hiçbir şey bilmediğini bilmelidir. Öğrenilecek çok şey var.
Her programcı FindNextSelected ve FindPreviousSelected eylemlerini (visual studio) klavye tuşlarına (tercihen F4 ve F2) bağlamalıdır. Bundan iki şey alıyorsunuz:
Koşullu gruplama dahil temel düzenli ifade sözdizimini bilir. Kütüphaneye özel regex komut eklentilerini kullanmaktan uzak durun veya en azından bu bölümleri yorumlayın/etkileyin.
Nasıl yapılır.
... 15 karaktere ihtiyacım var ne demek?
Sürdürülebilirliği göz önünde bulunduran program.
Basit düzenli ifadelerin, insanların manipüle edilmesi günler alacağını düşündüğü verileri kaç kez dönüştürdüğünü söyleyemem. Her programcı araç kutusunda bulunmalıdır.
Tabii, xkcd'yi unutamayız:
Her programcı bir işlemcinin nasıl çalıştığını bilmelidir.
Bir şey Master olun, ama Farkında olun - Her şey !!!!
Burada çok iyi bazı öneriler var, ama hiç kimse Ulrich Drepper'ın mükemmel makale serisinden bahsetmediğine şaşırdım: Her programcının bellek hakkında ne bilmesi gerekir .
Tüm sorunlar bilgisayar biliminde başka bir dolaylılık düzeyi ile çözülebilir.
Kodunuzu tasarlayın ve yöneticiniz RAD stil yaklaşımı kullanmak istiyorsa mümkün olduğunca fazla ayrıntı deneyin ve daha fazla işlevsellik eklendiğinde mevcut kodun daha önce yeniden yazılabilir olup olmadığını düşünün. sadece daha fazla kod kazık ve bir ev yerine bir highrise ile sonuçlanır.
her programcının yazılım mühendisliğinde sağlam bir topraklaması ve ayrıca sistem analizi/tasarımı ve bilgi sistemleri kavramları olmalıdır. bu şekilde sistem analizine/tasarımına ve/veya bilgi mimarisine önemli ölçüde katkıda bulunmaları istenirse, bilgi + opionion pozisyonunda olacaklardır; normalde bunun yerine genellikle kişisel tercihlerden kaynaklanan kişisel görüş gibi görünmektedir. en iyi sorun çözümü. yazılım mühendisliğini ölçmek biraz daha zordur, ancak önkoşul bilgisi orada ve biraz kod birlikte nasıl çözüleceğinden daha fazlasını öğrettikleri uygun üniversite derece derslerinde mevcuttur. Her neyse, bu olumsuz olmak anlamına gelmez çünkü ana ruh ancak iyileştirmedir, ancak daha sonra BT bilgisi olmayan bazı kişilerle çalıştım ya da kod ve yeniden kodlama yapan tek fikirli "script kiddies" var (ve sadece kendi dilleri) ve sadece her problemi daha önce uygulanmış çözümlerin (bu kodlayıcı tarafından) bir tekrarı olarak görüyorum, bu yüzden programcılar yazılım mühendisliği (SSADM) açısından daha büyük resme daha fazla odaklanır ve sorunlara fırsat olarak bakarlarsa çok tercih ederim müşteri için daha iyi yapmak.
Önce kafanızdaki veya kağıdınızdaki kodu veya mantığı çalıştırın. Derleme vurmak ve test etmek için komut çalıştırmak için acele etmeyin.
Gerçekten birkaç harfle duruyor:
Tamam, aşırı basitleştiriyorum, ancak temel olarak oldukça otodidaktiyseniz, asla öğrenmeyi bırakmazsanız ve biraz mükemmeliyetçiyseniz, iyi bir programcı olma temeline sahip olmalısınız.
Bunun ötesinde her şey belirli rollere ve teknolojilere daha özgüdür.
Bir şey ters gidebilirse, o zaman olur. En kötü davayı varsayalım
Oluşturduğunuz yazılımı kullanacak kişiyi unutmayın.
Yanlış gidebilecek her şeyin yanlış gideceğini kabul edin. Kod yazmak için çok az zaman harcayın - ancak ortak kalıpları tanımak ve yeniden kullanmak. İdeal tasarıma ulaşmak için sürekli olarak refactor kodu.
Tüm veriler bir yerde yaşamak zorundadır. Yeterince sert bakarsanız bulabilirsiniz.
Kapakların gücünü bilmeleri ve kullanmaya başlamaları gerekiyor.
Onaltılık gösterim. Ayrıca bit alanları - ANDing, ORing (kapsayıcı ve özel), tamamlayıcı (1'ler ve 2'ler), bit kaydırma.
İlk oylama Adlandırma Sözleşmeleri için olacak.
Birisi sizden bir şey inşa etmenizi istediğinde unutmayın: onlar da sizden onu korumanızı ister. Muhtemelen, sonsuza dek.
Programlar ne yaparsa yapsın, bir makineye nasıl iş yapılacağını anlatmaktan çok, diğer insanlara nasıl iş yapılacağını göstermenin en açık yoludur.