İyi bir programcı değilim (mantık içinde), nasıl düzeltmeliyim? [kapalı]


50

Tamam, işte benim sorunum:

Büyük bir şirket için çalışıyorum, bazıları ne kadar işe indi? (Açıkçası görüşme kolay olduğu için). Eşyalarımı bilmiyorum değil, java'yı anlamakta çok iyiyim, kütüphaneleri vs.

Fakat ne zaman bir mantık problemi çözmeye çalıştığımda, bir çözüm bulmakta zorlanıyorum.

Örneğin conversion of decimal to roman, çözümü gördüğümde bunun basit bir problem olduğunu görüyorum. Ama 1-2 saat çalıştıktan sonra uygulayamadım!

Aptal olduğumu ve yazılım mühendisi olmaya değmediğimi hissediyorum. Bulmaca çözme yetenekleri yerel olarak harika bir programlayıcıya gelmelidir. Ama bazı bulmacaları çözmeye çalıştığımda, bir çözüm bulamıyorum ve sadece Google'ı açtım! .... ve bundan nefret ediyorum!

İşyerinde bir sorun (uygulama xyz özelliği gibi) verildiğinde oldukça hızlı davranıyorum ve iş yerime saygı duyuyorum ama bununla gurur duymuyorum. Çünkü herhangi bir matematiksel veya mantıksal akıllı zorlu problemi çözmeye çalıştığımda, karıştırabilirim. Hala ne yaptığımı sevdiğimi hissediyorum (bir mühendis olarak) ancak arkadaşlarımın karşılaştığı zorlu mantık sorunlarını çözemediğim için gerçekten üzgün hissediyorum.

Demoralize olduğumu hissediyorum :(

TL; DR: Bir şeyi pratik bir bakış açısıyla anlıyorum (ürünümüze özellikleri uygulayarak) ancak ProjectEuler'den sorun üzerinde çalışmaya çalışırken, fena halde SUCK! Ve beynimi keskinleştirmem gerek !

Yani benim sorularım:

  1. Tamir etmeye nasıl devam etmeliyim? Proje euler sorunlarını çözmeye (ve kendimi zorlamaya) başlamalı mıyım? Bazı temel sorunları çözmem saatler sürse bile mi?
  2. Yoksa temellere geri dönüp biraz temel matematik çalışmalı mıyım?
  3. Bulmaca çözmeyi eğlenceli bulmuyorum. Ama ben kendim için eğlenceli hale getirmek istiyorum! Ve eğer onları daha iyi anlarsam hoşuma gider!

Not: Ben asla CS konusunda eğitim almadım (lisansım seçiciydi). Ama bu berbat bir geliştirici olmak için bir bahane değil.

Teşekkürler!


3
Eğer sizin için bulmaca çözme eğlenceli değilse o zaman neden rahatsız!
V4Vendetta

3
Eğlenceli değil, çünkü çözmekte zorlanıyorum. Eğer bu konuda iyiysem, beğeneceğime eminim!
John

1
Her zaman deneyebilirsiniz bu (eğer varsa, CİDDİYE bağımlılık uyarı vardır bulmaca çözme içine)
Benjol

2
Hiçbir şey yerel olarak gelmiyor. En temel becerilerin bile öğrenmeye ihtiyacı vardır. Gerekli yetenekleri eğitmek için oyun alanı olarak matematik ve klasik mekaniği öneriyorum, fakat diğer birçok konu (tamamen matematiksel olmayanlar da dahil) aynı şeyi yapabilirdi.
SK-mantık

3
@John Onaylandı. Zor bir problemdi. 5 dakika içinde çözemezseniz kendinizi kötü hissetmemelisiniz. Bunu yapmak için bir buçuk saat, Wiki’yi romen rakamları hakkında okuduktan sonra ve sadece sonuçlarını başka bir uygulamanın sonuçları ile karşılaştırarak bir hatayı düzeltebildim. (Diğerleri gibi) IL'nin geçerli bir sayı olduğunu düşündüm. Yanlış. XXXIX doğru sayıdır. Artı, onu optimize etmek için diğer uygulamaları da izlemek zorunda kaldım (II, III, XX, XXX vb. Önbelleklemekteydim ama işe yaramaz). Kötü hissetme!
xanatos

Yanıtlar:


24

İlk olarak, bunu becerilerinizde bir zayıflık olarak görmeniz harika. Gerçekte nerede geliştirmeniz gerektiğini biliyorsunuz, bu da bunu yapmayı çok daha kolay hale getiriyor ve düşündüğünüzden daha iyi olduğunuzu gösteriyor.

Daha önce birçok kez gördüğüm birincil probleminizin, bir "problem çözme araç setine" sahip olmadığınıza inanıyorum. Bir sorunla karşılaştığınızda ne yaparsınız? Bunu çözmek için nasıl gidiyorsun? Ben yavaş matematikte, ama ben birlikte matematik küçük araçların nasıl kullanılacağını biliyorum çünkü ben kalkülüs aced.

Bu yüzden, sadece problem çözme üzerinde çalışmanın yanı sıra, bunu yaparken masaya hangi araç ve becerileri getireceğinize bakmanız gerekir. İşyerinde yeni bir özellik üzerinde çalışacaksanız, IDE, hata ayıklayıcı, dokümantasyon, internet ve kaynak kodu olmadan mı oturuyorsunuz? Tabii ki değil!

Sorunları çözecek araçlar var, bunları henüz bilmiyorsunuz . Wikipedia makalesinde problem çözme teknikleri ile ilgili bazı bağlantılar vardır. Ancak en önemli araç bilimsel yöntemdir . Wikipedia makalesi pragmatik bir yaklaşım içeriyor:

  1. Bir soru tanımla
  2. Bilgi ve kaynakları toplayın (gözlemleyin)
  3. Açıklayıcı bir hipotez oluşturun
  4. Bir deney yaparak ve tekrarlanabilir bir şekilde veri toplayarak hipotezi test edin
  5. Verileri analiz et
  6. Verileri yorumlayın ve yeni hipotezler için başlangıç ​​noktası teşkil eden sonuçları çıkarın.
  7. Sonuçları yayınla
  8. Tekrar test et (sık sık diğer bilim adamları tarafından yapıldı)

Tüm problemler bu şekilde çözülebilir! Ancak birçok insan bu adımlardan geçmiyor. Kodunu test etmeyi reddeden bir geliştirici gibi. Hiç. Böceklerin bile var olduğunu anlamakta zorlanacak.

Son olarak, problem çözme için diğer birincil araç basit adımlarla parçalamaktır . Örneğin, Euler örneğindeki projedeki ilk problem :

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

İki gerçek var ve burada bir sorun var. Birincisi, bize 10'un altındaki üç veya beşin nasıl tanımlanacağını gösterir. 3 * 1,3 * 2,3 * 3,5 * 1 hepsi geçerlidir. 5 * 2, 10'a eşit olduğu için değildir. O zaman, aslında iki bize 23'ü almak için onları bir araya getirdiğimizi söyler.

Dolayısıyla zaten değer bulma yöntemimiz var ve toplamımızı elde etmek için bunları birlikte ekleyebiliriz. Elbette gerçeklere bakabilir ve siparişin basit bir tersini uygulayabiliriz. 3, 5, 6 ve 9, 3 veya 5'in katlarıdır. Yani% 3 3,% 5 5,% 6 3,% 9, 3, bir sıfır modunu verir. Bu yüzden başka bir yaklaşım 999'dan 1'e gitmek ve her bir sayıyı 3 ve 5 olan modüller yapmak olacaktır. Değerlerin listesini toplayın ve ekleyin.

Unix programlama sanatını programlama dünyasında küçük aletlerin kullanılmasına mükemmel bir örnek olarak önerebilirim . Onları bir araya getirmek çok karmaşık problemleri çözmenize izin veriyor ve bu kavramların bana ne kadar yardım ettiğini sayamıyorum.


19

Birçok programcı aynı zamanda doğal "bulmaca çözücüler" dir, ancak programlamanın bundan çok daha fazlası var. Tüm programcılar ilginç algoritmik problemleri çözmeye odaklanmış olsaydı, harika problemleri çözebilecek bir sürü yazılım ve yazılımımız olurdu, ama bunların hiçbiri kullanılamaz ya da bakımları olmazdı.

İşimde göreceli olarak az sayıda "bulmaca çözme" tipi zorluklar olduğunu görüyorum. Zorlukların çoğu, eski kodu çalışmak, yeni bir API öğrenmek, bazı bileşenlerin mimarisini insanların üç yıl içinde yemin etmeyecek şekilde tasarlamakla ilgili. Bunların hepsi zorlu, ama mantık bulmacası türünden çok fazla değil. Öte yandan, zamanlarının çoğunu derleyici optimizasyon algoritmaları hakkında düşünerek ve bu konuda çok iyi çalışan meslektaşlarım var.

Programcıların sürekli olarak "yaptığım işte nasıl daha iyi olabilirim?" Hakkında düşünmesinin önemli olduğunu düşünüyorum, ancak iyi bir programcı olmak mutlaka bulmaca çözmede harika olmanızı gerektirmiyor.

Şahsen, "gizem geocacheleri" çözerek bulmaca çözme düzeltmemi alıyorum .


Ama sıcak başlangıçların birçoğu SADECE bulmaca çözme becerisinin stresi. Facebook al. Eğer bulmaca çözmede iyi değilsem, oraya başvurmaya bile uygun değilim!
John

6
Facebook, binlerce ve binlerce özgeçmişi elemek zorunda kalmamak için ilk defa bir robot olarak bilmeceye sahip. FB için gerçekten çalışmak istiyorsan, o zaman bu tür sorunları çözebilmen gerekir, ancak çalışacak çok ve çok sayıda iyi yer var.
JesperE

Harika cevap beni de rahatlatıyor ... =]
Hartley Brody

9

Sizi uyarmama izin verin, ne kadar çok bilirseniz, ne kadar az şey bildiğinizi o kadar çok anlarsınız.

Sadece bununla cesaretini kırma. Öğrenmeye devam edin ve eksik olduğunuzu fark ettiğiniz alanlarda çalışmaya çalışın.

Şimdi sorunuza. Benim önerim eule r projesinde sorunlar üzerinde çalışmaya başlamak olacaktır .

Bunun nedenleri basit, en popüler sorudan başlamak, normalde çözülmesi daha kolay olan problemler.

Bir sorunla karşılaştığınızda, onu çözmeye çalışın, kendi kendinize çalışın, farklı yaklaşımlar deneyin. Project euler'ın çalışma şekli, cevabınızı kontrol etmenizi ve test etmenizi sağlar.

Bu sorunu çözemediğinize karar verirseniz, sorunu aramaya başlayın (cevabı aramayın). Tekrar denemek yok.

Sorunu çözdükten sonra, proje eulerinde, her dil uygulaması için size en iyi yanıtları gösterdikleri bir bölüm bulunur. Tercih ettikleri dilde cevaplarını gözden geçirin, çözümlerini ve içine giren düşünceyi anlayın.

Şimdi sağladıkları cevabı kapatın ve tekrar çözene kadar kendi başınıza deneyin.

Yeterince pratik yaparsanız, bu problemleri çözme mantığı ve düşüncesi sizin için daha kolay ve daha kolay olacaktır.


4

Çoğu programlama işi çok fazla mantık gerektirmez. Ancak bunlar sevdiğiniz işler olmayabilir.

Genel bir kılavuz olarak, algoritmaları ve yapıları öğrenmeye çalışın. Skiena'nın Algoritma Tasarım el kitabını tavsiye edebilirim. Bunları öğrendikten sonra, problemleri sınıflandırmaya başlayacaksınız. Bu gezici satıcılar sorununa çok benziyor, burada bir ağaç kullanabilirim, burada bir ikili arama kullanabilirim ...

Project Euler'de çok çeşitli bulmacalar var. Bunların çoğu temel matematik bilgisiyle kolayca yapılabilir. Bu algoritmalardan birkaçını öğrendikten sonra diğerleri daha kolay çözülür.


2

Programlama yolculuğuna yeni başladığına çok inanıyorum, bu yüzden ilk önce biraz kavrayarak doğru yapman biraz zaman alırsa sorun olmaz gibi görünüyor. Her denemede yaptığı tek fark, WoW gibi bir şey öğreniyor olmanız ! ! Yaptığım en son şey hiç de mantıklı gelmiyor çünkü ondalık ihtiyacım vardı ve çift değil.

Bulmacayı çözmek ilgini çekmiyorsa, bunun için kafa avına çıkmayacaksan, kod tabanını öğrendiğinde etrafta dolaşan başka mantıksal meseleler de var, üzerinde çalışmayı seçebilir ve önerilen düzenlemeleri danışmanına veya liderine sunabilirsin. . (biraz yıldırım düşerse endişelenmeyin, metodolojinizin neden hatalı olduğunu bilmenize yardımcı olurlar, bu nedenle keskin bir gözlemci ve uygun bir dinleyici olun)

Yerleşmeniz biraz zaman alacak ve sonra tüm silindirlere ateş açmaya başlamış olabilirsiniz. Söylemeye gerek yok, google veya SO’da bir çözüm arama dürtüsünden kaçının, çabalarınızı kesinleştirin ve tarayıcınızı yalnızca şüphe duyuyorsanız veya kesinlikle habersiz olduğunuzda ateşleyin


1

Her şeyden kötüsü, zayıflığınızı bilmek gerçek bir güçtür, bu nedenle daha iyi bir oyun almak için ne çalışmanız gerektiğini bilirsiniz.

Tavsiyem, mantık problemlerini çözen birçok kodu okumak olacaktır. Herkesin bulmaca çözmede kendi tarzı vardır, okuma kodu size bunu nasıl öğrenebileceğiniz konusunda ipucu verebilir. Ayrıca, kodu anlayabilmeniz, muhtemelen sizi sorunu tanımlayan matematiksel teoriye de işaret eder; bu nedenle, temel sorunları da öğreneceksiniz.

Şerefe, Carlo.


1

Buna eklemem gerektiğini düşünüyorum.

Seçilen cevabın daha önce de belirtildiği gibi, zayıflığınızı bilmek çok büyük bir avantaj ve problem çözme tekniklerini öğrenmek için bazı temel araçlar var. Sanırım cevapta eksik olan, sadece zor problemleri çözmenin yollarını bulmak. Denediğiniz her problemi tamamen bitirmek için inatçı olun. Kod çözme, çok fazla kod, sorun çözme konusundaki kitapları okumak gibi, ancak kod yazmak neredeyse daha önemlidir.

Bazı açılardan aynı zayıflığı paylaşıyoruz (yine de, düşündüğünüz kadar kötü değil). Problem çözme becerilerimi uygulamak için, her zaman bir proje Euler veya HackerRank problemi üzerinde çalışıyorum. Kolay bir problemse, 7 programlama dili seçerim ve hepsini de çözmeye çalışırım. Daha zor problemler için, sadece sorun için harcadığım zamanı makul tutmak için birbirinden çok farklı olan 3 dili seçebilirim. Tüm problemler için, bir çözüm bulduktan sonra, başkalarının ortaya çıkardığı çözümleri araştırıyorum ve onları anladığımdan emin oluyorum. Herhangi bir çözümü anlamadıysanız, her zaman StackOverflow'a veya muhtemelen burada bile Programcılar Yığın Değişim Programına ya da bir şeylere gönderebilirsiniz ve sitede sorunuzu cevaplayabilecek birisinin olduğundan eminim.

Temel olarak, yine de pratik yaptığınızdan ve sadece okumadığınızdan ve çok pratik yaptığınızdan emin olun. Tıpkı sporda olduğu gibi, net düşünme zaman ve çaba gerektirir.

Problemler hakkında düşünme biçiminize yardımcı olmak için yapabileceğiniz bir diğer şey, ilk önce çözdüğünüz problemler için test paketi yazmaktır. Bir problem için önce tam olarak anlamadan iyi bir test yazamazsınız. Bunu farklı diller için yaparsanız, bu size aynı anda farklı test teknikleri öğretme avantajına sahiptir.

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.