Kendime bir fizikçi olarak daha iyi bir programcı olmayı öğretmek [kapalı]


17

Her zaman fiziği sevdim ve her zaman kodlamayı sevdim, bu yüzden bir üniversitede sayısal fizik yapan bir doktora pozisyonu teklifi aldığımda (ayrıntılar ilgili değil, çoğunlukla bir küme için paralel programlama), hayır -beyin benim için.

Ancak, çoğu fizikçi olarak, kendi kendime öğrettim. Nesne yönelimli bir şekilde kodlama veya bazı kD ağacında aramayı optimize eden bu belirli algoritmanın adı hakkında geniş bir arka plan bilgisine sahip değilim.

Şimdiye kadar yaptığım tüm çalışmalar fizik ve bilimsel sonuçlar hakkında daha fazla endişe duyduğundan şüphesiz bazı kötü alışkanlıklara sahibim - daha çok kodlamam kendim ve takım çalışması değil. Ben çok basit ve "ne yazıyor ne olsun" çünkü C çoğunlukla kullandım - fantezi soyutlama gerek yok. Ancak, son zamanlarda soyutlama ile gelen güç hakkında daha fazla bilgi edinmek istediğim için C ++ 'a geçtim ve oldukça C benzeri (en azından sözdizimi açısından).

Kendime bilgisayar bilimi mezunu gibi iyi ve soyut bir şekilde kod yazmayı nasıl öğretebilirim?

Kodumun etkili olduğunu biliyorum, ama aynı zamanda zarif ve okunabilir olmasını istiyorum . Soyut programlama hakkında 1000 sayfalık birkaç metnin okunması için zamanım olmadığını unutmayın. Gerçek, fizikle ilgili araştırmalara zaman ayırmam gerekiyor (amirim zarif bir şekilde nasıl programlanacağını düşünerek zaman harcadığımı bilseydi bana gülerdi). Çalışmamın bir programcının bakış açısından iyi olup olmadığını nasıl değerlendirebilirim?


12
Bir soru: Kodunuzun etkili olduğunu nasıl anlarsınız?
Matsemann

C ++ 'a ilk OO dili olarak hayır diyen birçok insan gördüm. Java öğreniyorum ve burada Mark Dexter'ın video eğitimlerini burada eclipsetutorial.sourceforge.net/totalbeginner.html buldum , onlar oldukça iyi ve TDD şekilde öğretecekler. Ayrıca Head First Java'ya göz atın, Java'yı OO şekilde örtmede oldukça iyidir.
Garv

4
@DeveloperDon, hesaplama, elektronik bilgisayarlar olmadan önce bile fiziğin merkezi bir parçasıydı. Hesaplamalar elle veya mekanik hesap makineleri üzerinde yapılmıştır. II. Dünya Savaşı'ndan bu yana fizikçiler yazılıma derinden dahil oldular. Bir kuyruklu yıldızın dönüşünü hesaplıyorsanız, bir nükleer zincir reaksiyonunda nötronların üretimini simüle ediyorsanız veya Higgs Bozonunun işaretlerini arayan gigabaytlarca veriyi analiz ediyorsanız, çok sayıda sayı çatırdaması yapmanız gerekir . 1974 yılında ilk yıl fizik laboratuvarımın ilk yarısı FORTRAN'ı öğretmeye adadı.
Charles E. Grant

1
Örneğin CERN'deki fizikçiler veri aldığında milyonlarca parçacık çarpışmasından veri alıyorlar. Bu miktarda bilgiyi işlemek için bir bilgisayara ihtiyacınız var. Ayrıca, bir maddenin makroskopik özelliklerini atomların mikroskopik etkileşimlerinden anlamaya çalıştığınız katı hal fiziği gibi bir alanı da düşünün. Böyle bir sistemde, tek bir elektron milyarlarca çekirdeğin ve elektronun itmesini / çekiciliğini hisseder - ve böyle bir sistemi doğru bir şekilde tanımlamak için hızlı bir bilgisayar ve verimli algoritmalara (ve temel denklemlere bazı iyi yaklaşımlara) ihtiyacınız vardır.
user787267

1
Belki daha fazla zaman alabilmek için dilinizi C / C ++ 'dan Python' a değiştirmelisiniz? Python genellikle olduğu bilim adamları tarafından kullanılan , gibi modüller vardır Python ile bilimsel hesaplama için paketi - numpy veya SciPy . Python'da C / C ++ hızına ihtiyacınız varsa, sonra Cython'u kullanırsanız, C / C ++ türlerini ve yapılarını kullanmanıza izin verir, böylece C / C ++ 'a benzer bir hız elde edersiniz, ayrıca Cython kullanarak mevcut C / C ++ kütüphaneleriyle entegrasyon da kolaydır.
Czarek Tomczak

Yanıtlar:


20

Soyut programlama hakkında 1000 sayfalık birkaç metnin okunması için zamanım olmadığını unutmayın.

Birinden size yetenekli bir programcı yapacak beş adımlık bir kontrol listesi vermesini mi istiyorsunuz? Bu olmayacak !

Diğer disiplinlerde olduğu gibi, programlamada iyi olmak istiyorsanız, pratik yapmak ve çalışmak için zaman ve çaba harcamanız gerekir. Çok sayıda kod yazarak ve diğer insanların kodlarını dikkatlice okuyarak net ve zarif bir kod yazmayı öğrenirsiniz. Bu 1000 sayfalık tomenlerden bazıları aslında diğer insanların öğrendiği zor dersleri özetleyerek size zaman kazandıracak. Bir fizik doktora elde etmenin ağrısız bir yan etkisi olarak yetenekli bir programcı olabileceğinizi düşünmek yanıltıcıdır. Bir fizik doktorasından çıkamazsınız. deli programlama becerileri ile, sadece zaman ve bela mal olacak.

Kod Tamamlama , açık ve bakımı kolay kod yazma ve yapılandırma hakkında tavsiyeler de dahil olmak üzere yazılım geliştirme mekaniğine iyi bir giriş niteliğindedir. Evet, çok büyük bir ayak, ama kesinlikle Dirac'ın "Kuantum Mekaniğinin Prensipleri" veya MTW'nin "Gravitasyon" dediği kadar yoğun değil. Kod Tamamlama , daha iyi bir yazılım yazmak için beş adımlık bir kontrol listesine gideceğiniz kadar yakındır.

Matlab, VIM, C, MPI ve Valgrind bilmek için mükemmel araçlardır. Bir sürüm kontrol sistemi kullanmaktan bahsetmiyorsunuz. Bazı tesadüftü zaten bir sürüm kontrol sistemi kullanmıyorsanız sen gerekir hemen birini kullanarak başlayın. Sürüm kontrolü de tezinizi yazmak için bir tanrı-gönderme olduğunu. Bilmeniz gereken diğer temel araçlar bir hata ayıklayıcı, bir yürütme profili oluşturucu, bir günlük kaydı çerçevesi ve birim sınama çerçevesidir. Bunların her biri için 1000 sayfalık bir kitap okumak zorunda değilsiniz. Temel bilgileri almak için çevrimiçi eğitimlerle çalışın ve onlarla çalışmaya başlayın. İhtiyaçlarınız daha karmaşık hale geldiğinden belgelere daha derinlemesine bakın.

Bilgisayar bilimi temellerini öğrenme konusunda danışmanlık yapmak (yazılım oluşturma esaslarına karşın) daha zordur. İster yeni algoritmalar geliştiriyor olun, ister mevcut algoritmalar uyguluyor olun, hangi sorun üzerinde çalıştığınızı belirtmezsiniz. Araştırma probleminize bağlı olarak, temel veri yapılarının ve standart algoritmaların araştırılması faydalı olabilir. Diğer problemler sayısal analizde sağlam bir arka plandan daha fazla fayda sağlayacaktır. Algoritma analizinin temellerini öğrenmek istiyorsanız, birkaç iyi metin var. Algoritma Tasarım Kılavuzu ve Algoritmalara Giriş akla geliyor. Ayrıca şu anda çevrimiçi olarak birkaç iyi tanıtım dersi bulunmaktadır: Algoritma ve Algoritma Tasarımı ve Analizi .


Linkler için teşekkürler, içine bakacağım. Bir haftasonunda kodlama gurusu olmayacağımı biliyorum, ancak zamanla kademeli olarak iyileşmeyi umuyorum - özellikle de fizik dışında ilham ararsam (bildiğim fizikçilerin çoğu iyi kodlama uygulamaları için daha az umursamaz).
user787267

1
Okunabilir sayım olarak araçlara python
eklerdim

2
Kod Tamamlandı önerdiği için +1. Op'un söz konusu sorunu çözmek için okuyabileceği en iyi şey gerçekten.
JW01

9

Geçmişim sizinkine biraz benziyor-Ben kendi kendine programlamayı öğreten bir fizik mezunuydum. Mezun olduktan sonra birkaç BT işi aldım ve sonunda bir yazılım mühendisi oldum; OpenGDA (çeşitli senkrotron sahalarında deneyleri yürütmek için kullanılan yazılım) üzerinde çalışmak için biraz zaman dahil.

Buraya giderken sahip olduğunuz sorular hakkında öğrendiğim en önemli şey, bu becerileri diğer insanlardan almanın, onları kendiniz almaya çalışmaktan çok daha kolay olmasıdır. Deneyimli bir mentor, kodunuzun nerede zayıf olduğunu veya ortak kalıpların ve uygulamaların size nerede yardımcı olabileceğini belirlemenize yardımcı olabilir. C ve Objective-C'yi kendi başıma nasıl yazacağımı öğrenirken, aynı kodda başka insanlarla çalışana kadar ne bilmediğimi (ne demek istediğimi görürsen) tam olarak bilmiyordum. Burada tavsiye istediğinizi, zaten yaptığımdan daha iyi yaptığınız anlamına gelir :-).

Şimdi, uysal bir profesyonel yazılım mühendisi nerede bulabilirim? Kısa bir süre önce , deneyimli programcıları protégés ile işleyen bir sistem olan MentorNet'e katıldım .

Fakat böyle resmi bir sisteme gitmek zorunda değilsiniz. Yerel bir programcı buluşma grubu bulmak (veya üniversitenizin yazılım mühendisliği bölümünün Cuma günü işten sonra nereye gittiği) bulmak için harika bir yerdir.


MentorNet çok ilginç görünüyor - içine bakacağım. Fizikçiden yazılım mühendisine zor bir geçiş miydi?
user787267

@ user787267 Programlamaya ilgi duyduğumdan (ve zaten bir hobici programcı olduğundan), geçişi sizin gibi göründüğünden yapmak için motive oldum, bu yüzden teknik tarafı zor bulamadım. Daha fazla bilgi almak için daha uzun sürdüğüm su ıslatıcıydı: daha büyük bir proje ekibindeki yerimi anlamak ve daha önce yaptığım "yalnız kurt" kodlamasından büyük bir değişiklik konusunda uzman olan kim.

5

Yazılım için Kraliyet Yolu Yok

Eski zamanlarda, Euclid'e öğrencisi Kral Batlamyus tarafından sizinki gibi bir soru soruldu. Cevabı: "Geometriye giden kraliyet yolu yok."

Profesyonel bir geliştirici gibi kod yazmak için ne kadar zaman harcadığınızı bilseydi amirinizin güleceğini söylediniz. Diğerleri sorularınızı kaynak kontrolünden Algoritma Tasarım ve Analizine kadar öğrenilecek şeylerin bir çamaşır listesiyle yanıtladı.

Hedefinizin altında kalıyorlar:

"Gerçek fizikte zaman geçirmem gerekiyor"

Konser Piyanisti mi yoksa Tek Kişilik Grup mu?

Dünya insanlar için çok hızlı hareket ediyor. Bir konser piyanisti olmak istiyorsanız, zaman öğrenme araçlarınızı tek kişilik bir grup olmak için bölmeyin.

Orta ila büyük projelerde fizikte doktora rolüne ilişkin konseptim, sistem tanımı, teoride uzman, kullanım senaryosu oluşturma sırasında konu uzmanı ve yazılım eserlerinin ürettiği sonuçlar için son kullanıcı / yargıç olarak bir fikir lideridir. Mümkün olan en iyi yazılım mühendisleriyle yakın çalışın.

Çalışmamın bir programcının bakış açısından iyi olup olmadığını nasıl değerlendirebilirim?

Çubuğu yükseğe ayarlamak istiyorsanız, buradan başlayın:

Uygulamada Yazılım Mimarisi, Len Bass, Paul Clements, Rick Kazman

"Kalite Özelliklerini Anlama" bölümüne bakın. Kodun ötesinde, kullanılabilirlik, değiştirilebilir, performans, güvenlik, kullanılabilirlik, güvenilirlik, test edilebilirlik, bakım kolaylığı ve taşınabilirliği göz önünde bulundurur (taşıyamazsınız, ancak tasarımı bir platformdan diğerine taşıyabilirsiniz). Hepsi belirli ölçülebilir hedeflere ihtiyaç duyar. Benzer referanslar şunları içerir:

http://msdn.microsoft.com/en-us/library/ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

Hedefleriniz ve C ve C ++

FORTRAN gibi, bunlar zor ve eski dillerdir. C / C ++ için olumlu göstergeler şunları içerir:

  • Donanım, gömülü sistemler ile uygulama.
  • Başlangıç ​​noktası olarak istediğiniz mevcut proje.

Web geliştirme, veri görselleştirme ve büyük veri yapan birçok insan var. Birçoğu başka diller bulmak veya yapmak için motive olur. Örneğin, fizikçi Sir Tim Berners-Lee başarısını HTML ile yaptı (ancak fizik için çok az şey biliyor). Hedefinizi programlama dilinize göre değerlendirin.

Matlab'ı kullanmayı düşünün

Matlab'ın büyük bir kurulu tabanı vardır, matematik ve fen bilimleri için uzmanlaşmıştır. Veri görselleştirme araçları vardır. Bilim insanı ve matematikçilerin problem alanını çözüm alanından ziyade problem alanında ifade etmelerini sağlar. Matlab bir Paralel Hesaplama Araç Kutusu ve Dağıtılmış Bilgi İşlem Sunucusu ürünleri yapar.

Matlab'ın başarısının fizik, matematik, elektronik ve enstrümantasyon, işletim sistemleri, programlama dilleri, yazılım geliştirme, yazılım testi, yazılım mimarisi ve tasarımında uzman kişilerle multidisipliner ekipler kullanmasından kaynaklandığını düşünüyorum. Analoji bir esneme olabilir, ancak 3D yazıcınız olduğunda bir şey yapmak için neden bir çekiç, keski ve törpü ile başlayarak kendinizi tek başınıza bıraktınız? Newton'un isteyebileceği gibi, neden birinin omuzlarında durmuyorsunuz?


4

"Profesyonel" stil hakkında hiçbir şey bilmeden (deneyimden bahsederek) Fizikte uzun bir yol kat edebileceksiniz. Ama birçok insanın sonsuz zaman harcadığını gördüm çünkü kodlarını birkaç yıl büyüttükten sonra nerede yaptıkları ya da karmaşıklıklarında kayboldular (akademide bile "atma" kodu yok, ama işler başlangıçta düşündüğünüzden çok daha uzun süre sopa).

Algoritmalar ve veri yapılarına hızlı bir başlangıç ​​yapmanızı öneririm, örneğin bu kursla . Bundan sonra performansı daha üretken bir seviyede düşünebilmeli ve Wikipedia'daki makaleleri takip edebilmelisiniz.

Bundan sonra, dilinizin özünde mevcut olanlara, örneğin C ++ cppreference.com için alışın . Ayrıca Scott Meyers'ın Effective C ++ serisini ve Koenig & Moe tarafından Accelerated C ++ ' ı okumanızı şiddetle tavsiye ederim . En azından C ++ için bu size dil tarafında sağlam bir temel sağlayacaktır.

Paralel olarak aletlerinizi iyi tanımalısınız. Kodunuzu Linux altında geliştirmeniz pek olası değildir, bu yüzden derleyicinizden (en azından gcc ve clang) nasıl daha fazla tanı (uyarı) alacağınızı öğrenmeye çalışın. Ayrıca cppcheck veya clang'ın tarama yapısı gibi statik analiz araçları hakkında bilgi edinin . Bu araçları geliştirme sürecinizin ayrılmaz bir parçası haline getirmeyi öğrenin, örneğin bunları yapı kurulumunuza entegre ederek (evet, en azından GNU markasını, hatta GNU autotools / cmake / ... gibi bir şeyi daha iyi kullanmalısınız). Araç setinize profil oluşturma araçları da eklemelisiniz. C ++ için, çok düşük bir seviyede profil oluşturabilen valgrind hakkında yapabileceğiniz her şeyi öğrenmenizi şiddetle tavsiye ederim (ayrıca kaynak sızıntılarını bulmanıza yardımcı olabilir).

Tüm bunlar, hataları bulmak veya işe yaramaz optimizasyonlar yapmak yerine zaman kaybetmek yerine en çok önem verdiğiniz konulara (araştırmanıza) odaklanmanıza yardımcı olacaktır. Tabii ki bu bir danışmana satmak neredeyse imkansız, ama onlar (ve siz) etkilenecek, ancak güvenilir sonuçlar elde edebileceğiniz hız.

C ve C ++ 'dan bahsettiniz, ancak sayısal hesaplamalar için Python'u numpy ve scipy ile tavsiye edemem . C, C ++ ve FORTRAN'da uygulanan son derece optimize edilmiş rutinlerden faydalanırken, çok yüksek seviyede temiz ve oldukça temiz bir dilde yazmanıza (etkileşimli bile çalışabilirsiniz) izin verir. Ayrıca, kendi C veya C ++ kodunuzu Python ile arayüzlemek neredeyse önemsizdir.


Bağlantılar için teşekkürler! Kesinlikle içine bakacağım (ancak bir noktada lisede hızlandırılmış C ++ okuduğum halde, birkaç kitap okumak için zamanım olduğunu düşünmüyorum). Unix ortamında çalışıyorum (Vim'i editörüm olarak kullanıyorum ve beğendim) ve make ve Valgrind'i yaygın olarak kullanıyorum. Ben de biraz yardımcı olur gibi gcc ve -Wall -pedantic seçeneği tetikledik. Belki üniversitenin süper bilgisayarında yüksek performanslı bilgi işlem (paralel programlama için MPI kütüphanesi ile) yaptığımı söylemeliydim.
user787267

Python gerçekten benim için bir seçenek değil, çünkü benim kod çok hızlı olması gerekiyor çünkü - örneğin çizmek için sevdim. Matlab'ı da çok kullandım.
user787267

Sık sık Python'u kendi C ++ uygulamamda uygulanan rutinlerle konuşmak için ön uç olarak kullanıyorum. Boost ile bu gerçekten kolaydır ve Python'un tam esnekliğini elde edersiniz (örneğin, çizim için verileri işlemek için). Ayrıca, Python prototipleme için oldukça temiz. Bir şeyin çok önemli olduğunu öğrendiğimde, onu her zaman C ++ 'a taşıyabilirim. MPI'den bahsettiğinizden beri, dağıtılmış bilgi işlem için güzel bir arayüz oluşturan IPython ile bir akşam geçirmenizi tavsiye ederim.
Benjamin Bannier

@ user787267 Artık Python'un yavaş çalıştığı doğru değil - örneğin youtube.com/watch?v=Iw9-GckD-gQ adresine bir göz atın . Anahtar, daha sonra 1) numpy / scipy kullanarak 2) Cython veya shedskin kullanarak ve 3) yalnızca çekirdek algoritmayı bir C / C ++ veya FORTRAN modülüne yerleştirerek daha hızlı bir çalışma kodu yazmak için Python'u kullanabilirsiniz. bu son% 5'lik iyileştirmeye gerçekten ihtiyacınız var. Ayrıca, kodlama için harcadığınız zaman kodun zaten çalışmadığı zamandır, bu nedenle yarı zamanda yazılmış% 80'lik bir performans koduna sahip olmak daha verimli olabilir
Tobias Kienzler

Genellikle Matlab'da kolay şeyleri test etmek için prototipler yaparım, ancak bir süre Python'a geçmek istedim. Ben bir göz atacağım. Kodum zaten C ++ ile yazılmış büyük bölümleri nedeniyle ancak yarıda dil değiştirmek istemiyorum. Her ne kadar gerçek zaman programlamasını da düşünmek doğru olsa da (ve inan bana, inanıyorum), bunun programlama becerilerinizi (kademeli olarak) geliştirmemek için bir bahane olması gerektiğini düşünmüyorum.
user787267

4

Çalışmamın bir programcının bakış açısından iyi olup olmadığını nasıl değerlendirebilirim?

  • Doğru mu? Her durumda doğru sonuçlar veriyor mu?

  • Diğer insanlar kodunuzu kolayca okuyabilir ve anlayabilir mi?

  • Şefiniz "Harika, şimdi de X yapın ..." dediğinde çok fazla kod yazmanız gerekiyor mu?

  • Bir program yazdığınızda, tekrar tekrar kullanabileceğiniz bir araç mı, yoksa bir kez kullanmak mı ve bir şeyleri atmak mı?

Evet, evet, hayır ve 'evet, bir defaya mahsus hesaplamalar yerine araçlar yapmaya çalışabilirim' diyebilirseniz, zaten çok iyi gidiyorsunuz. Programcı olarak yaptığımız şeylerin büyük bir kısmı, yukarıda listelenen şeylere yardımcı olmak içindir.


3

Programlarınız ticari kaynak kodundan tamamen farklı olacaktır, bu nedenle günlük kaynak kodu geliştirmenizde pek çok iyi uygulama ve yaklaşım uygulanmaz. Ancak birkaç ipucu ve püf noktası öğrenmek için iyi bir yol var.

Bazı iyi yazılım geliştiricilerinin kodunuzu gözden geçirmesine ve birlikte optimize etmesine izin verin. Size çok daha fazla deneyim kazandıracak ve size iyi uygulamalar öğretecektir. Ayrıca başkaları tarafından yazılan kaynak kodlarını da gözden geçirin. Sourceforge veya github'da açık kaynak projeleri arayın ve kaynak kodlarını okuyun.

Ama en önemlisi, hedeflerinize ulaşmak için yeni bir şey öğrenmeniz gerekip gerekmediğini düşünün. Sadece kodun daha güzel görünmesi için gereksiz şeyler yapmak uygulamalarınıza herhangi bir değer katmayacaktır.


Açık kaynaklı projelere okumak ve katılmak, aslında çok iyi bir fikir - ama boş zamanlarımda yapmam gereken bir şey (ama çok fazla sorun olmaması gereken programlamayı sevdiğim için). Daha iyi bir programcı olmak istememin bir nedeni de akademide kalıp kalamayacağımdan emin olmam. Ph.d. Sadece sektörde bir iş bulabilirim - ve burada yetenekli bir programcı yüksek talep görmelidir. Başka bir neden, gerçekten zor bir diferansiyel denklemi çözmek gibi zarif / güzel bir şey yaratmanın entelektüel memnuniyetidir.
user787267

Ne yazık ki endüstri genellikle akademik gelişimde kazanmadığınız becerileri gerektirir. Akademik araştırmalarınız sırasında yazacağınız şeyler genellikle ticari uygulamanın kaynak kodunun% 5'inden azdır.
Andrzej Bobak

3

Daha iyi bir programcı olmak söz konusu olduğunda sihirli bir mermi yoktur. Eğer kendi kendinize öğretilirseniz, anahtar sizin sahip olduğunuz kulağa hoş gelen bir farkındalıktır. Bununla birlikte, iyi kod yazmayı öğrenmek çoğunlukla okuma ve uygulama ile ilgilidir.

Kendi kodunuzu eleştirmek, daha iyi olmanın en iyi yollarından biridir. Her zaman kendinize şu soruları sorun:

  • Bunu değiştirmek kolay olacak mı?
  • Bu kolayca test edilebilir mi?
  • Bunu basitleştirebilir miyim? 3 ay sonra tekrar gördüğümde bunu kolayca anlayabilir miyim?

Diğer önerim, kendinizi C / C ++ içine kilitlemeyin. Bunlar bir nedenden dolayı kullanılan iyi diller olsa da, konu ile ilgili olmayan birçok şey yapmanızı gerektirir. Matlab'a bakın, eğer üniversitede bu mevcut değilse şaşırırdım. Python gibi bir betik dili düşünün. Haskell gibi fonksiyonel bir dil almayı kesinlikle düşünün - paradigma doğada çok matematiksel ve muhtemelen eldiven gibi sorunlarınıza uyacak. Kısaca diğer dilleri / paradigmaları keşfedin. Kemerinizde kalıcı bir alet olmasalar bile sizi daha iyi bir programcı yaparlar.

Bazı algoritma tasarımlarına da bakmak isteyebilirsiniz. İşi aldığınızdan şüpheleniyorum, zaten bu konuda enfiye etmeye hazırsınız, ancak sayısal analiz yaparken algoritmalar inanılmaz derecede önemli. Aslında, özellikle sayısal analiz algoritmalarına yönelik kaynaklar olduğundan şüphelenirim.

Kodu yazarken asla birincil amacınızı gözden kaçırmayın. İşleri halletmelisin. Daha iyi bir programcı olmak bunu yapmanın bir yoludur. İş için doğru araçları seçmek başka bir şeydir.


2

İlk olarak, "zarif" göreceli bir terimdir. Soyutlama sizin için zarif görünebilir, ancak başka bir C meraklısına gereksiz görünebilir. Her neyse, sorunuzu cevaplamak için kodunuzu incelenmek üzere http://codereview.stackexchange.com adresine göndermeyi denemelisiniz .
Ana noktadan hareketle, kendi deneyimlerime dayanarak bazı istenmeyen tavsiyeler. Tüm işlerinizi sadece C ile halledebiliyorsanız, neden soyut bir şekilde kodlamak istiyorsunuz? Bu şekilde, başkalarının kodunuzu tekrar kullanmasını sağlamak ister misiniz? C ++ 'a geçmek için gerçekten sağlam bir nedeniniz varsa, soyutlama ve C ++ ve OO kavramlarını öğrenme için gidin. Aksi takdirde fikri bırakın. Benim düşünceme göre, kodunuzun daha okunabilir olmasını ve bilimsel sonuçlarınızın OO soyutlamalarını vermekten daha tekrarlanabilir olmasını amaçlamıyor musunuz? Ben kendimi OOPS ve "zarif" ly kod öğrenmek için bu tür saplantı vardı. Ancak C ++ 'da ustalaşmak zaman alacaktır. Çöp toplama C ++' da otomatik olmadığından bellek yönetimini öğrenmek zorunda kalacaksınız. Kendim bir araştırma laboratuvarı için çalıştığım ve C ++ ve OO öğrenirken çok fazla zaman kaybettiğim için tavsiyemi al


1
Ancak C, C ++ 'dan daha yönetilmez. C ++ 'da en az RAII vardır.
Benjamin Bannier

Kodlamayı seviyorum, bu yüzden daha iyi bir programcı olmak istiyorum. Ben bir fizikçiyim ve ikinci bir programcıyım, ama bu programlama becerilerimi geliştirmemem anlamına gelmiyor - sonuçta, kodumu bilimsel sonuçlarla birlikte yayınlamaya karar verirsem, iyi olmak daha iyi olurdu, okunabilir kod.
user787267

2

Teori okumak için zaman eksikliğinden bahsettiğinizde.

Birkaç ay sonra eski kodunuza tekrar baktıysanız ve "bu kodu ne tür bir salak yazdı" diye merak ettiyseniz, ilerleme kaydedersiniz.

Nasıl ilerledin? Başkaları tarafından yazılmış daha iyi kod görerek. Bir kişi, çalışmalarına değer kattığını görmedikçe 'zarafet' veya 'iyi' kodun değerini asla bilemez. Teori okumak yerine, gözlerinizi çalışma alanınızdaki başkaları tarafından yazılan kodlara açık tutmanızı öneririm. Stackoverflow (C ++ etiketi) üzerinde tartışılan kavramlara gözlerinizi açık tutun. Günde sadece on beş dakika harcamak, sizi rastgele size yardımcı olabilecek kavramlara maruz bırakabilir. Kodunuzdan daha iyi yazılmış olan kodu gösterebilir. İşte o zaman Wikipedia'yı takip edip bunun hakkında daha fazla bilgi edinebilirsiniz. Meraktan çıkan bu öğrenme, ertesi gün uyandığınızda unutacağınız teoriden çok daha uzun ömürlü ve faydalı olacaktır.

Ayrıca MATLAB veya Python gibi dilleri de deneyin.


Stack Exchange'de oldukça fazla zaman harcıyorum - günlük işimde benim için çok değerli bir kaynak. Matlab'ı çok kullandım, ancak çok bağışlayıcı olduğu için dizileri önceden ayırmamak gibi kötü alışkanlıklar geliştirmek çok kolaydır.
user787267

Python @ user787267 için +1 Gerçekten dizinin önceden konumlandırılmasının neden kötü bir alışkanlık olduğunu
anlamıyorum

2

Bir fizikçi programcıyı kendime çevirirken, fizik altyapımı yazılım kavramlarını anlamak için doğru metaforları oluşturmada en yararlı buldum . Bu bakış açısı aynı zamanda öğrenmeyi programlamayı benim için daha eğlenceli hale getirdi ve uğraştığınız yazılımdaki "zarafet" duygusunu geliştirmeme yardımcı oldu.

CUJ sütununda "Düşünme Kalıpları - isimler, metaforlar, daha iyi programlama ve dilin politikası" gibi metaforların ve benzetmelerin yazılımdaki önemli ve az takdir edilen rolünü tanımladım . Örneğin, sınıf kalıtımının OO kavramları genellikle ebeveynlerin bir ailede yavrulara geçme özellikleriyle karşılaştırılır. Bu yanlış bir benzetmedir. Sınıf mirası için doğru benzetme organizmaların biyolojik sınıflandırmasıdır (örneğin, RedRose sınıfı bir çeşit Çiçek ve bir Çiçek türü bir Bitkidir).

Veya hiyerarşik bir durum makinesinin yazılım konseptini ele alalım. Burada iyi bir metafor, hidrojen atomu gibi bağlı bir kuantum sistemi kavramıdır. Hatırladığınız gibi, bir atomun durumları tam olarak "iç içe" oldukları (hiyerarşik) oldukları için üç kuantum sayısı | n, l, m> ile numaralandırılır. Bu metafor, durumların devletler içinde yuvalandığını (enerji durumlarındaki (n) açısal momentum (l) yuvaları gibi) nasıl anlayacağınızı gösterir ve ayrıca durum yuvalamanın her zaman sistemin bazı simetrisinin yansıması olduğunu görürsünüz .

Fizikten bir başka ilginç benzetme, son zamanlarda çok çekirdekli CPU'lar ve "bulut" da dağıtılmış bilgi işlem nedeniyle yeniden keşfedilen "aktör hesaplama modeli" dir. Durum bilgisi olan aktörler (diğer adıyla aktif nesneler) tarafından değiştirilen olayları QED'deki fotonlar veya QCD'deki gluonlar gibi sanal bozonlar olarak düşünmeyi yararlı ve eğlenceli buldum. Bu metafor, iletişimin temel asenkron doğasını, tamamlanma aşaması olay işlemesini (kuantum sıçraması) ve yalnızca açık ara yapay nesneler yoluyla birbirleriyle etkileşime girebilen etkin nesnelerin sıkıca kapsüllenmesini açıklar.

Her neyse, bir sistem metaforu geliştirmek XP'de (eXtreme Programlama) önerilen bir uygulamadır ve bir fizikçi olarak iyi metaforlar bulma konusunda bir avantajınız olacaktır. Ayrıca "zarafet" için de bir anlam kazanacaksınız, çünkü yazılımınız kavramsal bütünlüğü uyguladığınız iyi metaforlardan miras alacaktır.


Fizik potansiyel olarak zengin bir metafor kaynağı olmasına rağmen, XP'deki amaç, yerinde müşteri ve diğer ekip üyeleriyle iletişimi kolaylaştıran bir metafor bulmaktır, bu nedenle genellikle daha yaygın olarak anlaşılan metaforları seçme eğilimindedir.
Pete Kirkham

2

Sorunları çözme yaklaşımım açısından kazandığım en büyük kazanımların hepsinin fonksiyonel dilleri ve ayrıştırıcıları öğrenerek elde edildiğini söyleyebilirim. Her iki keşif de kazara yapıldı. Şimdi size daha iyi bir programcı olmak konusunda gerçekten ciddi olup olmadığınızı söylüyorum, o zaman bir derleyici yazmayla ilgili çeşitli teknikleri öğrenmeniz gerekir, örneğin, ayrıştırıcılar ve ayrıştırıcı jeneratörler ve hesaplamaları daha yüksek düzende nasıl oluşturacağınızı öğrenmeniz gerekir fonksiyonlar.

Ayrıştırıcı ve derleyici için mükemmel bir kaynak PL101: Kendi Programlama Dilinizi Oluşturun . İşlevsel programlamaya hala iyi bir giriş bulamadım, ancak SICP hakkında gerçekten iyi şeyler duyuyorum .


-5

Bilgisayar Bilimleri mezunu, mezun olduklarında iyi kodlamayı bilmez; Üniversiteden ayrıldıklarında çok fazla talep görmezler. Sadece deneyim olsun.

Sorunuzun cevabı, Tasarım Desenlerini öğrenmeniz gerektiğidir. Java, .NET'te programladım ve şimdi bir PHP, Javascript ve MySQL programcısı olarak çalışıyorum. Bu arada .NET, ASP.NET gibi çok yüksek bir soyutlama düzeyine sahiptir. Bu, soyutlama öğrenimini atlayabileceğiniz anlamına gelir. Perl, PHP, vb. Gibi dillerin soyutlama düzeyi düşüktür.

Baş İlk Tasarım Desenlerini okuyun, iyi bir kitap. Oldukça kapsamlı bir kitap. İhtiyacınız olan her şey bu.


Bu cevabın neden reddedildiğine dair bir fikrim var, ancak belki de downvoters neden dediğinde yararlı olacaktır?
Pierre Arlaud
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.