Programlamayı geriye doğru öğrenin ya da “FizzBuzz testinde başarısız oldum. Şimdi ne? ”[Kapalı]


94

Küçük Bir Arka Plan

Bugün 28 yaşındayım ve yazılım geliştirme konusunda hiçbir zaman resmi bir eğitim almadım, ancak Halkla İlişkiler BA'sına ve Proje Yönetimi üzerine odaklanan Executive MBA derecesine eşdeğer iki yüksek öğrenim derecem var. Bu alanlarda yaklaşık 6 yıl çalıştım, 2,5 yıl önce işimi bıraktım / kaybettim ve yön değiştirmeye karar verdim.

Bir ay boyunca bir şeyler düşündükten sonra WordPress'te küçük web siteleri geliştirmeye serbest çalışmaya başladım. Kendi yolumu kendim öğrendim ve bugün müvekkillerim için sıfırdan başarılı temalar ve eklentiler geliştirerek mütevazi ama başarılı bir kariyer yürüttüğümü söyleyebilirim.

Ama bazen, sadece yeterince matematik çalışmadığı ya da daha tecrübeli geliştiricilerle rekabet etmek veya çalışmak zorunda kaldığımda beni gerçekten bir şeyleri anlama anlayışına sahip olmadığımı hissediyorum. Sürekli daha fazlasını öğrenmenin yollarını arıyorum ama temellerden yoksun görünüyor.

Ne yazık ki, Bilgisayar Bilimi'nde 4 yıl daha geçirmek bir seçenek değil, bu yüzden elimden geleni kitaplardan ve çevrimiçi kaynaklardan öğrenmeye çalışıyorum. Bu yöntem asla NASA'nın beni işe almasına izin vermeyecek, fakat şu an umrumda değil. Amacım önce barı geçmek ve kendime gerçek bir programcı diyebilmek.

Şu anda Boş vakit okuyan harcıyorum programcılar için Java alıntılar okuyarak, (bir dil herkes ulaşmaya diyor zor / talep ediyor) Komple Kanunu ve ayrıca (en iyi uygulamalar ele almak için) Kod: Bilgisayar Gizli Dili Donanım ve Yazılım (bilgisayarların iç çalışmalarını kavramak için).

TL; DR

Yani şu anki durumum şudur: Temel olarak PHP'deki herhangi bir sistemi (Google ve birkaç kitap yardımıyla) yazabiliyorum, Ajax, SQL ve ne olursa olsun, belki de deneyimli bir kişinin beklediğinden biraz daha yavaş ilgili tüm araştırmalar nedeniyle.

Ama yoktu çünkü FizzBuzz test için bir çözüm (Google'dan) anlamaya çalışıyorum dün mahsur kalan if($n1 % $n2 == 0) yöntem modülü operatörü ezberledim.

Bu ikilemi çözmek için iyi bir yol olarak ne önerirsin? Sorunları daha hızlı ve belki de "programcı yolunda" çözmemi sağlayacak olan hangi konuları / kitapları incelemeliyim ?

EDIT - FizzBuzz'ı çözmek için bilmediğim şeylerle ilgili bazı karışıklıklar olduğu görülüyor.

Belki de kendimi doğru ifade etmedim: Sorunu çözmek için gereken adımları biliyordum. Ezberlemediğim şey modulus operatörü idi. Sorun, temel matematiği bilmemek yerine, temel matematiği programa aktarmaktı.

Kodlama Korku hakkında okuduktan sonra eğlenmek için sınava girdim . Sadece ben ve resmi olarak eğitilmiş devs arasında iyi bir temel karşılaştırma çizgisi olduğuna karar verdim.

Bunu sadece bir bilgisayar ortamında matematikle uğraşmamanın bir örnek olarak kullandım, basit problemleri çözebilmek için modül operatörleri gibi temel şeyleri ararken zaman kaybetmemi sağlıyor.


63
Bunu okuduğumda I'm basically capable of writing any complete system in PHP (with the help of Google and a few books)ve bunu bilmediğinizle birleştirdiğinizde if($n1 % $n2 == 0), PHP'de yazılmış şeylere maruz kaldığınızı merak ediyorum. Sanırım yaptığınız çoğu şey basit bir modulo hesaplamasının ötesine geçiyor. Yapabileceğini düşündüğün şey hakkında biraz daha bilgi verebilir misin?
phant0m

10
Ben de kendi kendime öğrendim bir programcıyım .. 10 yıldan beri, tüm web, her zaman .. o zamanlar web geliştirme dersleri yoktu ... kendi kendine öğrenmenin bir faydası olduğunu düşünüyorum. gerçekten temel OO ilkeleri ve tasarım kalıpları hakkında bilgi edinmek isteyeceksiniz. sorunlara saldırırken kafanızın arka tarafında olmak için size çok yardımcı olacaklar. Genelde, başkalarının sahip olduğu her zaman kelime bilgisine sahip olmadığımı anlıyorum, ancak kodlamayı ve zarif çözümler yazmayı seviyorsanız, en sonunda siz ne istersen onu içine kodlamak mümkün olacak
hanzolo

56
Bu stuck b/c I didn't memorize %konuyla ilgili olarak, bunu yapmanın başka yolları olduğunu belirtmek gerekir: ($ n2! = 0 varsayarak) if (is_int ($n1 / $n2))veya if (($n1 / $n2) == (int) ($n1 / $n2))anahtar kelimeleri bilmek bir şeydir ve yerleşik bir çözümün yokluğunda temel fikirlerin nasıl ifade edileceğini bilmek önemlidir. bir diğeri.
grossvogel

18
@grossvogel Kesinlikle! Fizzbuzz gibi insanların nedenlerinden biri de bunu çözmenin birçok yolu var. Modül işlecini bilip bilmediğinizi görmek sadece bir numara değil. Bir anahtar programlama becerisi, bir problemi, sizin bilginize / araçlarınız / kaynaklarınız / vb. İçin en uygun forma ifade ettiği formdan tercüme etme yeteneğidir
octern

18
Modül operatörünü bilmemek FizzBuzz'ın başarısız olmasının bir nedeni değildir. Kayıp bir şey bulduğunuzda, bunun üzerinde çalışmanız gerekir.
Loren Pechtel

Yanıtlar:


144

Senin durumunda, kendini öğrettiğin ve zaten öğrenmeye iyi, sağlıklı ve BS-olmayan bir yaklaşım gibi görünen bir şeye sahip olduğun gibi. Yine de bazı öneriler ...

Pratik yapmak mükemmelleştirir

Bence aşağıdakiler gibi progamming egzersizlerine dalmalısınız:

Çevrenizdeki bilinen üniversitelerin veya yerel (veya uzak) programlama yarışmalarının geçmiş sınav sorularını bile alın. Mesela, Fransa'da, lise programcılarının adaylığını sürdürdüğü için Prologin denilen hoş bir programımız var ve her yıl iyi bir kafa kaşıma bulmacası dizisi sunuyor (muhtemelen sadece Fransız, ancak üzgünüm, ama bu demek istediğim şeyler. ).

Daha fazla bilgi için: Programlama Bulmacalarını ve Zorluklarını Nerede Bulabilirim?

Klasik Kitaplar ve Referanslar

Çok uzun bir şaşırtıcı kitap listesi de önerebiliriz , ancak Zen’in cevabını Aydınlanma için tek bir doğru yol olmadığını söyleyebilirim.

Hangisinin listenin başında olduğunu söylemek zor olacak. Bu nedenle, şu anda doğru yaptığınız gibi, kaçınılması gereken genel tuzakları ve takip etmek için en iyi uygulamaları öğrenmek için bir sürü şey okumaya devam edin.

Daha fazlası için:

Limitleri zorlamak

Ayrıca, aşağıdaki gibi çizilmeye başlanan materyali arayın:

Bugünlerde yapılacak şeylerin bir örneği olarak alınması zorunlu değildir, ama orada neler olup bittiğini anlamaya çalışmaya değer.

Akran Sistemleri Motive Edicidir

Ayrıca, başkalarıyla yüzleşerek becerilerinizi adım adım geliştirmek için aşağıdaki toplulukları dolaşmak (ve bunlara katılmak) isteyebilirsiniz.

Yarı Zamanlı Eğitim

Başka bir 4 yıllık kursa ya da benzer bir şeye katılmak için zamanınız veya motivasyonunuz yoksa (bu gerekli olmasa bile, hatta ödüllendirici olmayabilir ve pahalı olabilir), çevrimiçi materyal öğretmeyi aramayı düşünebilirsiniz. Tabii ki, bunlar bilgisayar bilimi ile sınırlı değil.

Orijinal MIT OpenCourseWare çabası sayesinde, şu anda uygun olan tonlarca üniversite var ve birçok üniversite düzeyinde kurs materyali ücretsiz bulabilirsiniz. Gezinmek ve içinden kendi başınıza okumak her zaman kolay değildir, ancak bazıları oldukça iyi durumdadır. Yerden başlayıp yukarı oldukça yüksek gitmek için, şu an da dikkate Khan Academy .

Bazıları biraz daha ileri gider ve kursun materyaline benzer şekilde erişebileceğiniz, aynı zamanda hızlı dersler ve düzenli öz değerlendirmeler de sundukları ücretsiz çevrimiçi kurslar sunar. Örneğin, ziyaret Coursera veya Udacity .

Yukarıdakilerin çoğu, sık sık Youtube veya iTunesU'daki derslerini yayınlar; bu nedenle, bilgi için olan susuzluğunuz daha önce tüm linkler tarafından bastırılmadıysa, bol miktarda malzeme bulacaksınız.

Eğer "gerçek" üniversiteye daha yakın bir deneyim sunan bir şey istiyorsanız, yarı zamanlı çalışmanıza izin veren, ancak hızınızı takip etmenizi ve hem öz değerlendirmelerinizi hem de sonunu almanızı gerektiren uzak üniversiteleri düşünebilirsiniz. OpenUniversity ve uluslararası varyantlarında olduğu gibi yıl sınavları (bazen yerinde) .

Tutku Gidiyor

  • Bir evcil hayvan projesi bulun: kendi projelerinizi oluşturun veya mevcut bir veya daha fazla mevcut yazılım projesine katılın ve katkıda bulunun.
  • Kod, kod, kod. Ve sonra biraz daha kodlayın.

(ve sizi eleştirmek ve farklı bakış açıları bulmak için kodunuza bakarak yeterli sayıda göz atın)

Fransızlar şöyle der:

En çok affedilen biri, sapkın forgeron için.

Yaptığın şeyi yapmaya devam et, ve sonunda bir uzman olacaksın. Zaman alır ve çalışır.

Ayrıca bakınız ben Sorun Öğrenme Yaşıyorum fazla öneri için.


Not: Röportajlar için çok tartışmalı bir araç olmasına rağmen ve iyi adayları belirlemeye yardımcı olmamakla birlikte, FizzBuzz'ı en azından inanılmaz "kötü olanları" dışlamak için kullanıyorum. Öyleyse bu pratik olayı karıştır! :)


3
C'est süper ça! :) Liste için teşekkürler. Euler Projesi ve bulmacalar çok hoş görünüyor. Ve zaten bazı diğer SE sitelerini kullanıyorum. İçine dalacak.
moraleida

@ moraleida: Cevabı sevdiğine sevindim. Rica ederim.
haylem

PS'niz hakkında: Şu anda röportajlar konusunda endişeli değilim, çünkü gerçekten bir çalışan olmaya geri dönmek istemiyorum. Kodlama Korku hakkında okuduktan sonra eğlenmek için sınava girdim. Sadece ben ve resmi olarak eğitilmiş devs arasında iyi bir temel karşılaştırma çizgisi olduğuna karar verdim. :)
moraleida

4
+1 sadece neden FizzBuzz'ın en sonunda kullanıldığını bildiriyor ... Sık sık burada ya da bloglarda eleştiren kişilerle ilgili yorumlar görüyorum çünkü şirketlerin süper kodlayıcıları tanımlamak için kullandığını varsayıyorlar. (Bu şirketlere: Yanlış yapıyorsunuz!)
Izkata

1
Bu, bazı bağlantılarda listelenmiştir, ancak bir çağrı yapılmasını garanti ettiğini düşünüyorum: Ayrıca rosettacode.org'a da bakardım . Çok sayıda programlama dilinde çözülmüş çok sayıda farklı sorunu vardır. Yazma kadar önemli olan kod okumada iyi bir uygulamadır ve aynı problemi çözmek için birçok farklı yaklaşım görmenin harika bir yoludur. Ve henüz bildiğiniz veya öğrenmek istediğiniz bir dilde çözülmeyen bir sorun bulursanız, bu sizin için bir programlama zorluğudur.
Mark Reed,

60
I didn't have the if($n1 % $n2 == 0) method memorized.

Çok uzun zamandır kodlamadım (yaklaşık 27 ay önce kendime SQL öğretmeye başladım ve yaklaşık 20 ay önce Perl'de kodlamaya başladım), ancak yukarıdaki alıntı eski öğrencilerden duyduğum bazı şeylere benziyor:

Her problem için hangi entegrasyon tekniğini kullanacağımı nasıl ezberleyebilirim?

Olasılıkları eklemeli mi, çoğaltmalı mıyım, yoksa "n select k" yi mi kullanmalıyım yoksa faktörleri mi kullanmalıyım.

Bir dakika bekle! X'in dün 2'ye eşit olduğunu söyledin! Şimdi sıfıra eşit mi ?!

Tamam, bu sonuncusu muhtemelen biraz zordu ... ama yapmaya çalıştığım mesele , problem çözmenin ezberleme olmadığı . Öyle olsaydı, bazı dahiler her problemi çözmek için bir bilgisayar programlayabilirdi ve hiçbirimiz bir daha asla düşünmek zorunda kalmayacaktı (ne cehennem gibi bir dünya olurdu ...).

Şimdi, herhangi bir entelektüel çabanın en azından biraz ezberden oluştuğu doğrudur. Özellikle, PHP'de kod yazacaksanız, temel veri türlerini (sayılar, dizeler, diziler), onlarla yapabileceğiniz temel şeyleri (sayılar için: toplama, çıkarma, çarpma, bölme ve modül: dizgiler için: birleştirme, alt dizeler, değiştirme ve en azından bazı düzenli ifadeler hakkında bilgi; diziler için: birleştirme, öğelerin üzerine dokunma, öğeleri ekleme, ilmikleme, öğeleri sayma, vb.) (if / then / else ifadeleri, foreach döngüleri, süre döngüleri vb.)

Ardından, bir sorunla karşılaştığınızda, ihtiyacınız olan araçların bağlamını sağlamak için sorunu kullanın. FizzBuzz için, bir sayının 3, 5 veya 15'e bölünebildiğini söylemeniz gerekir. Tamam, bu yüzden rakamlarla uğraşıyoruz .... bir tamsayı başkaları tarafından bölünebilir olduğunda bize hangi temel araçları söyleyebiliyor? Eh, modül operatörü. Öyleyse bunu kullan. (Tabii ki, eğer numaranız, $nsüslü olabilir ve son rakamın $n0 mı 5 mi olduğunu ve / veya rakamların $n3 ile bölünebilir bir şeye eklenip eklenmeyeceğini görmek mümkün olabilir .) 1 ile 100 arasındaki her sayı için bunu yapın, böylece karpel tüneli elde etmekten kaçınmak için bir foreachdöngü kullanın .

Hikayenin morali, bir yandan "temelde PHP'de herhangi bir sistemi yazma yeteneğine sahip olduğumu" söylerseniz, diğer yandan FizzBuzz'ı kodlayamazsanız, ilk iddia yanlıştır. Eski matematik öğrencilerimden bazıları kavramları anladıkları için aşağı yukarı yemin ediyorlardı, ancak sınavdaki problemleri ya da ödev problemlerini ya da sınav problemlerini yapamadılar. Anlayışlarında da yanılıyorlardı.

Mazeret uydurmayı bırak ve temellerini öğren.


6
Ezberlemiyorum, metabolize ediyorum ve bunları sezgimin bir parçası yapıyorum. Daima bunu genişletmeyi dene.
ncmathsadist

@ ncmathsadist - Evet, genişleyen sezgi anahtardır, ancak sezgi bile çok az sayıda temel kavram ve gerçeğin ezberlenmesine güvenmek zorundadır.

Kayıt için, bir sayıyı 3 ile çarpmanız ve ardından 3 ile bölünebilir olup olmadığını görmek için rakamları eklemeniz gerekmez, sadece sayıları ekleyebilirsiniz. örneğin, 864, 8 + 6 + 4 = 18, böylelikle 3'e bölünebilir ve 864
Oztaco,

@ leaf68 - Duh! [tokatlar] kesinlikle haklısın ... lemme edit!

27

FizzBuzz'ın bir oyuncak problemi olduğunu düşünebilirsiniz; modulus operatörünü ne zaman gerçek bir programda kullanmam gerekecek? Ama gerçekten her zaman kullanıyorsun. Üç yaygın örnek:

  1. Bir tablo görüntülüyorsunuz ve farklı satırlar için alternatif arka plan renkleri istiyorsunuz. Bir satırın ( row_number % 2 == 0) olup olmadığını kontrol eder ve tek satırlar için bir satır, bir satırlar için bir renk görüntülersiniz.
  2. Döngü yaptığınız bir nesne koleksiyonunuz var ve her satırda N nesne içeren bir tablo yazdırmak istiyorsunuz; daha sonra ne zaman satır sonu ekleyeceğinin ölçütü şudur (item_number% N == 0). Aslında bu kesin davranış hakkında SO sorusu vardı, ancak bu cazip dilde durum if item_number % N == 0eşdeğer ( if item_number|divisbleby: N) olarak yazılmıştı .
  3. Verimlilik nedenleriyle yalnızca grup belirli bir boyuta ulaştığında gerçekleşen bir işleme gruplandırmak istediğiniz birkaç işlemi gerçekleştiriyorsunuz. Belki google veri API'sini kullanıyorsunuzdur ve her işlem için yeni bir işlem oluşturmak için HTTP üstbilgisi / kimlik doğrulaması ek yükü istemiyorsunuz, bu nedenle bunları 50 işlemden oluşan gruplar halinde topluyorsunuz. Veya kayıtları veritabanınıza kaydediyorsunuz ve işlemi makul bir boyutta olduğunda taahhüt etmek istiyorsunuz. Gibi bir şey if cur_item_number % 50 == 0 then commit_data.

Tabii bütün bunları yapmanın başka yolları da var. Ancak modül operatörünü kullanmadan veya float bölümünü tamsayı bölümüyle karşılaştırarak fizz buzz'lar yapabilirsiniz. Örneğin, FizzBuzz için aşağıdaki sözde kod gibi bir şey yapabilirsiniz.

div_by_3_rem = 0
div_by_5_rem = 0
for(i = 0; i< 50; i++) {
    if(div_by_3_rem == 0 && div_by_5_rem == 0) {
       print "FizzBuzz"
    } elif(div_by_3_rem == 0) {
       print "Fizz"
    } elif(div_by_5_rem == 0) {
       print "Buzz"
    } else {
       print i
    }
    div_by_3_rem += 1
    div_by_5_rem += 1
    if(div_by_3_rem == 3) {
       div_by_3_rem = 0
    }
    if(div_by_5_rem == 5) {
       div_by_5_rem = 0
    }
}

Sonuç olarak, bir gün harika bir programcı olmak istiyorsanız , dil kitaplarını öğrenmeyin. Evet, bir PHP / Java kitabı size google / stackoverflow ve yarı çalışan programlardan her şeyden çok daha hızlı cevaplar almanızı sağlayacaktır. Fakat aslına bakarsanız, kaliteli optimal programlar yazmayı ve bir programcı gibi düşünmeyi gerçek bir CS kitaplarına maruz bırakmaya ihtiyacınız olduğunu bilmek için.

Bilgisayar Programlarının Yapısı ve Yorumlanması (Şema - Lisp lehçesi öğretecek) ya da muhtemelen Think Python gibi bir şey gibi başka bir şeyle meşhur bir programlama dili ve CS arka planı sunan bir CS kitabıyla başlayın. Bilim adamı (okumadım). Bunların her ikisi de ücretsiz çevrimiçi.

Sonunda iyi bir algoritmalar kitabı, en iyisi CLRS Algoritmaları (ücretsiz değil) olsa da, bu ücretsiz çevrimiçi algoritmalar kitabını okumalısınız.düşük maliyetli bir değiştirme olabilir (ancak CLRS satın alabilirseniz). Algoritmalar kitabı size bilgisayar problemlerini nasıl çözeceğinizi düşüneceğinizi ve çeşitli veri yapılarını (Diziler / Bağlantılı Listeler / Yığınlar / İkili Ağaçlar / B-Ağaçlar / HashTable'lar) ve en iyi şekilde nasıl kullanacağınızı bilmeniz gereken önemli algoritmaları tanıtmayı öğretecektir. . Her kanıtı ezberlemeniz veya her algoritmayı (bir Fibonacci Yığınını kullanan) mükemmel bir şekilde yazmayı bilmeniz gerekmez; ancak sezgisel olarak iç içe geçmiş iki iç içe geçmeli O (N ^ 2) olduğunu bilmelisin; Karşılaştırma türleri en iyisidir O (N lg N), ikili arama O (lg N), O (N) 'de medyanı bulabilir, neden sabit disk veritabanlarının B-Trees kullandığını vb.). En azından algoritmalar kitabının güçlü bilgisi, google / facebook çeşitliliğinin teknik programlama röportajlarında yardımcı olacaktır. Programlama kitaplarını okurken, sadece yağma / okuma yapmayın; sen'

Ayrıca, CS ve algoritmalar kitabını okuduktan sonra yazılım mühendisliği (Code Complete veya Pragmatic Programmer) üzerine bir kitap öneriyorum. ; birlikte kod tutun; gerektiğinde refaktör; sürüm kontrolü kullanın; vb).


4
Henüz en iyi yorum; pratik, pratik, pratik diyen birçok insan görsem de, bu şekilde olmaz. Alıştırmalar söylediklerini mükemmelleştirir, ancak bu sadece kötü davranışları zorlar. OP'ye: Kendinizi diğer kavramlara açıklayın, neden bir hızlı bağlantı noktasının bir bubblesort üzerinde tercih edildiğini öğrenin. Sadece mükemmel pratik mükemmel yapar. CS kursu alın.
Pieter B,

2
Bu örnek kodu gönderdiğiniz için teşekkür ederiz, zaten kendim yapmam gerektiğini düşündüm. - Yalnızca NAND geçitlerini kullanarak herhangi bir karmaşık mantıksal devre kurabiliriz; Turing tamamlanan çok az basit işlemi olan dillerimiz var; problemleri çözmek için bu süslü operatörlere ihtiyacımız yok . Bir problemi çözmek sadece doğru araçları bilmek, bir problem üzerinde çalışabilmek, kendi bilginiz için işe yarayan bir çözüm bulmak bir programcı yapan şeydir.
karıştırmak

22

Ama dün FizzBuzz testi için bir çözüm bulmaya çalışırken mahkum edildim çünkü if ($ n1% $ n2 == 0) yöntemini ezberledim.

Kimse bu şeyi ezberlemez . Kendi başına gelmen gerekiyordu. Modül operatörünü ve ne işe yaradığını biliyorsanız, o zaman FizzBuzz problemine büyük ölçüde uygun olur.

Burada bir uzuv üzerinde çıkacağım ve genellikle sorunun PHP olduğunu öne süreceğim. Java'nın şimdiye kadar tasarlanan en kötü dil olduğunu ve PHP'nin şimdiye kadarki en kötü dil olduğunu söylemeyi seviyorum , çünkü yaratıcıları bile asla tasarlanmadığını itiraf ediyor. Ortamınız pratik olarak nasıl yapılmayacağının tanımı olduğunda, iyi yazılım mühendisliği uygulamalarını öğrenmek zordur . Ve her şeyin yapılabilmesi için bir çerçeveye bağlı olarak pek bir şey söylemiyor.

Şu anda boş zamanımı Java For Programmers'ı inceleyerek geçiriyorum (herkesin zor / zorlayıcı olduğunu söylediği bir dili ele geçirmek için)

Java, var olan en kolay ve en kötü dillerden biridir. Sadece bir şey var: çöp toplanan manuel kalıtım. Arkadaşlarınız veya danışmanlarınız Java'nın zor olduğunu söylüyorsa, yeni arkadaşlar bulun. C ++ kavramları içeriyor zor bir dil olduğunu ve bu kimsenin itiraz edecek. Ayrıca en azından bazı jenerik ve lambdalara sahip olan C # da yapabilirsiniz .

Dillerinizi kodlayamayan insanlar tarafından tasarlanıp uygulandığı zaman kodlamayı nasıl öğreneceksiniz ve yaptığınız her şeyin çerçevelerine bağlısınız?


14
@ moraleida: Kullanmadığınız bir operatörün sözdizimini ararken utanılacak bir şey yok.
DeadMG

2
@ moraleida: Bu durumda gerçek bir sorun olmadığını kabul ediyorum. Herhangi bir profesyonel, görüşmeci veya başka türlü, niyetimizin ne olduğunu açıkça ifade edebildiğiniz sürece, parmağınızı farklı bir dilin sözdizimine tam olarak sokamayacağınızı düşünmemeliyim.
haylem

5
Çoğu nokta üzerinde anlaşmaya varıldı, ancak neden Java'yı 'şimdiye kadar tasarlanan en kötü dil' olarak düşünüyorsunuz? Java'nın büyük bir hayranı değilim, ama bu çok tartışılan geliyor.
Casey Kuball,

7
Soruyu, sorulan şeyle sıfır ilişkisi olduğunda, diz üstü salak bash PHP'nin bahanesi olarak kullanmak için -1.
StasM

1
@Darthfett: Bununla ilgili bir makale yazabilirim. SO C ++ sohbetine gelin ve okuyabilirsiniz: P
DeadMG

11

Bence FizzBuzz'ı anlamaya çalışırken neden mahsur kaldığına sıkı bir göz atman gerekiyor. Diyelim ki, $nbir sayıya bölünebilir olup olmadığını size söyleyen bir operatör olduğunu hatırladınız . Ve ne olduğunu unutmak için kötü şansın var. Tamam, neden başka bir şekilde yapmaya çalışmıyorsun? Kod hakkında bir şey biliyorsanız, bir düzine başka yapmanın yollarını bulabilmelisiniz. Bunlardan bazıları tuhaf görünebilir - örneğin, 5'in her birini bir diziye koymak ve $naralarında olup olmadığını kontrol etmek gibi - ve bu kötü bir çözümdür, ancak yine de bir çözüm olabilir. Ancak, hiç sahip olmadığınızı söylüyorsunuz, sadece sıkışıp kaldınız. Daha büyük bir sorunun belirtisi olabilir.

Programlamada öğrenmeniz gereken iki şey var.

  1. Hile çantası. PHP'de dosya nasıl okunur, Java'da XML nasıl ayrıştırılır, Python'da veritabanına nasıl bağlanır. Bazı insanlar ezberler, ama aslında bu şeyler sadece her gün kullanıyorsanız ezberlemeye değer. Aksi takdirde, sadece doktora gidin ve arayın. Bu şeylerin edebi formları dışında hiçbir özü yoktur - sadece belirli bir büyünün nasıl ortaya çıktığını ve sonucun ne olacağını bilmeniz gerekir.
  2. Mindset. Bu en önemli şey. Programlaman böyle ve bunun ezberlemeyle alakası yok. Bilgisayara yapmak istediğiniz şeyleri nasıl açıklayacağınızı, hangi yolları kullanacağınızı ve hangilerini belirli bir durumda kullanacağınızı anlamanız gerekir. Şimdi, modern araçlar ve modern belgeler göz önüne alındığında, birinin PHP'de "hile torbası" yaklaşımı kullanarak bütün bir CMS yazması mümkündür, ancak bir kez hazır bir çözümü olmayan bir işle karşılaştığınızda, "sıkışmışsınız" demektir.

Sizden açıklama, ilk bölüme başladığınıza benziyor, ancak ikinci bölümden biraz eksik. İyi CS kursu genellikle bu konuda çok yardımcı olur, ancak tek yol bu değildir. Farklı sorunları çözmeye ve bu sorunların nasıl çözülmesi gerektiğine dair okumaya çalışmak, burada alıntılanan temel kitapları okumak - bunların yardımı olacak. Programcının zihniyetini aldıktan sonra, yeni bir püf noktası kullanmanın bir sorun olmayacağını keşfedeceksiniz. Elbette burada ve orada google yapmak zorunda kalacaksın, ama asla mahsur kalmayacaksın.


1
“Ve bu sorunların nasıl çözülmesi gerektiğini okuyun - Aslında, aynı sorun için farklı çözümlere bakın. Her birini anlamaya çalışın, ortak olanları ve farklı yaptıklarını karşılaştırın. Bu şeyleri anlayın; aynı problemi düşünerek farklı düşünme biçimlerini otomatik olarak alacaksınız.
karıştırmak

Ben tamamen zihniyet üzerinde hemfikir olurdum. Zihniyeti ve kavramları kavradığınızda, altta yatan dil yapılarını öğrenmek çok daha kolaydır ve tabii ki işleri yapmanın alternatif yollarını düşünmeye başlayacaksınız. (Fizzbuzz gibi, 5 ile bölünebilen tüm sayılar ya 5 ya da 0 ile bitecektir, bu yüzden bu kısımdaki modül işlenene gerek yoktur)
JohnP

9

Başka bir şeyde iyi olma şeklinizi geliştirmede başarılı olursunuz: pratik. Programlama dünyasında kata kodu adı verilen hoş bir konsept var . Bu aslında nispeten küçük bir problemin çözümünü kodladığınız, neyin iyi neyin kötü olduğunu analiz ettiğiniz, hepsini kazıdığınız ve tekrar yaptığınız bir alıştırmadır. FizBuzz başlı başına bir kata. Öyleyse yap ve daha fazlasını yap. Çok iyi görünmeyen ya da sadece işe yaramayan şeyler bulduğunuzda, araştırma yapın ve bu konuda dikkatli olun. Başkalarının bu nasıl ele bkz makale ve bloglar okumak, soru-cevap sitelerinde sorular sorun ve sonra pratik öğrendiklerinizi.

Bu uygulamayı yaparken, ne kadar ek matematiksel / teorik altyapıya ihtiyacınız olabileceğini öğreneceksiniz. Eğer kafanızı tamamen saramayacağınız konseptlere rastlarsanız, o zaman onları ve önkoşul bilgilerini okuyunuz ve dersinizi genişletmek için ne dersiniz varsa, dersleri baz alarak karar veriniz. teorik arka plan.


1
Bu kod kata da harika görünüyor!
moraleida

8

... çünkü ezberlenmiş if ($ n1% $ n2 == 0) yöntemine sahip değildim.

Bunu yorumluyorum, modulus operatörünü bilmiyordunuz ve / veya hatırlamıyorsunuz. Bu durumda başlangıç ​​yeri, kullandığınız dilde dil yapılarını gözden geçirmektir. Bilmediğiniz her şeyi gözden geçirin ve bilmediğiniz bir şey öğrenin.


4
+1. Diğer cevaplar nasıl daha iyi bir zanaatkar olunacağından bahsederken, gerçekte hangi araçların bulunduğunu bilmek daha da önemlidir. Hiç kolay bir kırık olmadan bir vidayı çıkarmak için denediniz mi? Bunu yapmanın başka yolları da var, ama bunun için yapılan aracı nihayet öğrendiğiniz zaman alnınızı kesmek. OP'nin uzun zaman önce herhangi bir PHP operatörü listesine bakıp , tanıdık olmayanlarla oynaması gerektiğini söyleyebilirim .
Tim Lehner

5

Kodlamaya devam et, öğrenmeye devam et. Sonunda, yeterli özveriyle, FizzBuzz'a bakacak ve neden bunun hakkında düşünmek zorunda kaldığınızı merak edeceksiniz. Birçok şirket FizzBuzz tarzı bir soruyu görüşmelerinin çok erken bir parçası olarak yapar, bu nedenle bu seferinde başarısız olmak en azından işe alım süreci hakkında bir şeyler öğrendiğiniz anlamına gelir.

Sadece kod yazmaya, proje fikirleriyle gelip araştırmaya devam edin.


4

Java, C ++ öncesi JavaScript öğrenmeyi önerebilir miyim? Sebepler:

  1. Ön uç tasarımında kullanılır (jQuery, WordPress eklentilerinizden bazıları, Twitter yayınları, JSON aracılığıyla tarayıcınıza veritabanları yüklemek, çok az veya hiç arka uç çalışması, form doğrulama vb.)
  2. Node.js ile sunucu tarafında kullanılabilir
  3. İOS, Android, Win8, vb. İçin hibrit uygulamalar oluşturmak için kullanılabilir
  4. JS'yi incelemek, farklı tarayıcılarda ve cihazlarda web sayfasının performansını daha iyi anlamanıza yardımcı olur
  5. JS, daha acemi dostu olacak şekilde tasarlandı
  6. Sen zaten HTML ve CSS'yi biliyorsun (umarım;)

Ücretsiz Newbie Kaynakları

http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
10 tane daha bağlantım vardı, ancak SE 10 kişiyi vuruncaya kadar göndermeme izin vermiyor.

C ++, Java, vb. Öğrenmek de faydalıdır, ancak IMHO'nun JS gibi web programlaması üzerinde etkisi yoktur, çünkü hem ön hem de arka ucunda kullanabilirsiniz. İyi eğlenceler!



1
ve bir iş almaya hazır olduğunuzda: jobety.com
Aralık'ta

3

Örneğin, giving.code (açıklama: sitem) veya Amerika Kodunu ya da her neyse , bulabilir ve yardım edebilirsiniz . Bu, PHP dışı web sayfası oluşturma sorunlarına daha fazla maruz kalmanın ve iyi hissetmenin mükemmel bir yoludur.

Çözmek için bir probleminiz olduğunda - veya çözmenize yardım ettiğinizde veya sadece anlayabildiğiniz zaman - kodları almak doğal olarak yol boyunca gelir. Bir hedefe sahip olmak, bir şeyler öğrenmenin en iyi yoludur.


1
Korku veren! Bu ders çalışmanın gerçekten güzel bir yolu!
moraleida

0

Demek FizzBuzz problemini çözemezsin. Büyük anlaşma. Şimdi yapabilirsin ve iddiaya girerim sayısız yolu asla unutmayacaksın. Kendinizi kötü bir programcı olarak tanımamak için çok istekli olmayın, çünkü aptalca bir sorunu başınızın üstünden çözemezsiniz.

Bu bir sorun. Diğeri ise, programlama öğrenme eğrisinin biraz gerisinde kalıyor gibisiniz. Diğerlerinin dediği gibi, kodlamaya devam edin ve okumaya devam edin. Ne kadar çok yaparsanız o kadar iyi olursunuz. Bu kadar basit. Arka planınızdaki en büyük delik olduğunu düşündüğünüz her şeye başlayın ve oradan devam edin.


(Bu canlandırıcı geliyordu. Orada başarılı olduğumdan emin değilim. Lol.)
Nick Spreitzer

0

Kiralamak için birisini tavsiye etmeyi reddedeceğimi sanmıyorum çünkü şu şartlar ile sağlanan modül operatörü olduğunu bilmiyorlardı:

  1. Bir çeşit operatör olduğunu biliyorlardı.
  2. Onlara sorduğumda "modülün" ne olduğunu bana söyleyebilirlerdi.

Her zaman değil (genellikle olsa)% ve bazı diller garip. Ve cehennem, on yıl sonra dürüstçe söyleyemem tüm perl operatörlerini tanıyorum (ve yine uzay gemisi ne yapar?) Ne de bitsel operatörleri her zaman mükemmel bir şekilde hatırlayamıyorum. Onları gerektiren bir şey yaptığımdan beri birkaç yıl geçti.

Birini tavsiye etmekte tereddüt etmeme neden olan şey, eğer bu soruyu / testi kaçırdığı için panik atak geçirmelerine neden olmuşsa olur. Bu bana biraz fazla yeşil oldukları izlenimini verebilir (çok giriş seviyesi olmadıkça). Kimse bu şeyleri ezberleyebilecek (ya da ihtiyacı hisseden) birine ihtiyaç duymaz. Daha geniş kavramları anlayan birine ihtiyacınız var. Hiç kimsenin Google’a bakıp bakmamasını umursamayacağını, ancak röportajda% bilmenin önemli olmadığını ve ayrıca hızlı bir google yaparken "operatör" kelimesini anahtar kelime olarak kullanmayı bildiğinizden emin olmanız gerekir. Ara.

Ayrıca, bu sadece bir fikir ... ama eğer yerel topluluk kolejinizde bir compsci programı varsa, diğer krediniz de transfer olur ve muhtemelen 2 yıllık derece için yaklaşık 20 krediye ihtiyacınız olacaktır. Neredeyse bir sömestr bitirebilirdim. Size bir veri yapıları kursu yaptırırlardı, umarım algoritmalar da sizi biraz daha güçlü yapar.


-1

İşte örnek bir kurs: http://www.ox.ac.uk/admissions/undergraduate_courses/courses/computer_science/computer_science_.html

Önce aşağıdakileri okumanızı öneriyorum: Nesne yönelimli programlama (çok yaygın, her yerde kullanılır, burası java'nın girdiği yer) Eşzamanlılık (gerçek dünyada gizemli bir şekilde çökmeyen java programları yazmak, kilitlenmeler hakkında bilgi edinmek için) Veritabanı kavramları (çoğu uygulamanın veri kaydetmesi gerekir, teori burada önemlidir) Programlama paradigmaları (düşüncenizi genişletmek ve yeni şeyler öğrenmek için en azından bir oops olmayan dil hakkında, tercihen işlevseldir)

4 yıllık zorunlu bilim eğitimine baktığımda, dürüst olmak gerekirse, ciddiye almanız gereken sadece bir avuç ders olduğunu düşünüyorum.

Veri yapıları ve algoritmalar (ve gerçekten iyi olmak ve diğer programcılar tarafından ciddiye alınabilmesi için burada matematiğe ihtiyacınız var), bilgisayar ağları ve işletim sistemleri en önemli akla geliyor. Daha düşük seviye kodlarla ilgilenen diğer konular, montajda kodlama yapabilmek gibi, sizin için çok da önemli değil. Yazılım mühendisliği ve testler sizi faydalı olan kavramlara maruz bırakır ve zamanla bunu kaldırabilirsiniz.

Sadece bu kavramları sezgisel bir şekilde açıklayan bir pdf dosyası indirmeniz yeterlidir.

Bazı zorunlu fen derslerinde, en azından benimki, ilk yıl mekanik, elektrik, inşaat vb. Gibi tüm mühendislik alanlarına giriş niteliğindedir. Bugün çoğu uygulama programcıları için. Bu yüzden, bugün etrafımızdaki mühendislerin birçoğunun aslında sadece 3 yıllık gerçek bir kompozisyon bilimi eğitimi var (Umarım bu sizi daha iyi hissettirir :)

Cevabın temel noktası: her gün okumak, bir saat kadar söylemek ve bir süre içinde oldukça iyi bir programcı olmak için biraz zaman ayırabilirsiniz. Sadece öğrenmeye devam et. Ve her gün bir kod yazmayı unutmayın.


-3

Benim için stratejim, yalnızca çalıştığım şeyle ilgili olan probleme saldıracağım, Bu yüzden tavsiyem hepsini öğrenmek zorunda değilsin, sadece çalıştığın şeyle ilgili olanları oku, çünkü hepsini bir kerede öğrenmeye çalıştıysanız, secde edilme ve nefret programlamanıza son verme eğilimi vardır.

Barış

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.