it-swarm.dev

Programcı olarak adlandırılacak algoritmaları ve veri yapılarını anlamam gerekir mi?

Kodladığımdan bu yana altı yıl geçti. ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, vb. Fakat ne zaman röportaj yapsam, insanların bana karmalar, ağaçlar, yığınlar ve kuyruklar hakkında soru sormaları muhtemeldir. Bazı sorular bazı sıralama algoritmalarını hokkabazlık üzerine. Gerçekten bilmem gerekip gerekmediğini bilmiyorum ya da kendime bir programcı demeyi bırakmalı mıyım. İçimde, tüm bu soruları soran insanlar beni seçse bile, beni asla bu şeyler üzerinde çalıştırmayacaklarını söyleyen bir şey var. Tüm bunları bilmem gerçekten gerekli mi?

38
sushil bharwani

Yapmanız gereken tek şey yapıştırıcı kodu yazmaksa, kendinize bir kod maymunu diyebilirsiniz. Bir sürü tutkal kodu yazılmalı ve bir kod maymunu olarak iyi bir yaşam yapabilirsiniz. Kendinize Gerçek Programcı demek için TM ve kodun sıfırdan yazılması gerektiğinde güvenilir olun, algoritmaları, veri yapılarını, bellek yönetimini, işaretçileri, Montaj dilini vb. bilmeniz ve bu bilgileri, denemeleri değerlendirmek için nasıl kullanacağınızı anlamanız gerekir.

80
dsimcha

tarihi bilmeyenler onu yeniden keşfetmeye mahkumdur

33
Steven A. Lowe

JavaScript gibi bir dilde çalışmak bunu oldukça obsolote yapar, çünkü Array bir vektör, karma ve ağaç arasında bir karışımdır ve yığın veya kuyruk olarak kullanılabilir. JavaScript'te Array sınıfından daha iyi performans gösteren bir veri yapısına ihtiyaç duyabileceğiniz veya uygulayabileceğiniz pek olası değildir. PHP'de de durum böyledir.

Java OTOH için bir fark var. Sanırım Java'nın standart kütüphanesi size ihtiyacınız olan herhangi bir veri yapısı hakkında bilgi veriyor.

  1. Doğru verileri seçebilmeniz için bu veri yapılarını bilmeniz ve ayırt etmeniz ve farklı durumlarda nasıl performans gösterdiğini anlamanız gerekir.
  2. Java'da, bazı çok özel durumlarda daha iyi hız elde etmek için sonunda bir hashmap için kendi uygulamanızı yazmak istemeyeceksiniz (örneğin, işlemek istediğiniz anahtarlar optimizasyona izin veren bazı özel kısıtlamaları yerine getirirse).

Sıralama algoritmaları söz konusu olduğunda, bunları bilmek veya anlamak için çok fazla ihtiyaç yoktur, çünkü tek başına bir tane uygulamaya gerek yoktur. Bununla birlikte, size böyle bir algoritma verilirse, onu anlayabilmeniz ve uygulayabilmeniz gerekir.

İki şey kesin:

  1. Siz böyle bir bilgiye güvenmeden programcı olarak kariyer yapabilirsiniz.
  2. Kesinlikle onları tanımak size zarar vermez.

Veri yapıları ve algoritmalar basitçe anlaşılabilecek bir şeydir. Ve uygulama veya sistem mühendisliğinin karmaşıklıklarına kıyasla son derece açık ve resmileştirilmiş ve bu nedenle oldukça önemsiz bir şeydir. Onlar bulmacada sadece küçük bir parça, ama kavramak kolaydır - eğer biraz zaman ayırmaya istekli iseniz.

Yani hayır, onlara ihtiyacınız yok, ama onları tanımak sizin yararınıza olacaktır .

30
back2dos

Bu, 'programcı' ve 'yazılım mühendisi' arasında anlamsal olarak anlamlı bir ayrımın olabileceği bir durum olabilir. Bu bağlamda, özellikle, çeşitli programlama dilleri ve ilgili teknolojiler hakkında bilginiz olduğunu ve bunları istenen sonuçları elde etmek için kullanabileceğinizi görüyoruz. Bu, 'bilgisayar programcısı'nın iyi bir operasyonel tanımıdır.

Kendimi bir yazılım mühendisi olarak görüyorum. Çalışmamın günlük yönlerinin çoğunda, muhtemelen aynı şeyleri yapıyorum. İstenen bazı sonuçları elde etmek için bilgisayar dilini ve ilgili teknolojileri kullanıyorum. Ancak, veri yapıları ve algoritmalar hakkında bir anlayışım var ve bu bilginin çok daha fazlasını yapma yeteneğimin temel bir dayanağı olduğunu düşünüyorum.

Çoğu zaman - her zaman olmasa da - işim, belirgin çözümleri olmayan karmaşık sorunlara çözüm bulmayı, kullandığım çerçevenin özellikleri veya çalıştığım dilin özellikleriyle doğrudan ele alınan bir şey içermiyor ile. Burada, sorunu analiz etmem ve bir çözüm tasarlamam gerekiyor ve bazen bu süreç büyük ölçekli mimari alanına giriyor.

Bu tür işleri yapmak için bu daha derin konuların mükemmel bir şekilde anlaşılması gerekse de, yeterli değildir. Başka bir deyişle, bir karma tablonun nasıl çalıştığını veya bir yığın türünün neden genellikle iyi performans özelliklerine sahip olduğunu bilmek bir sistem mimarı veya kıdemli bir mühendis olmak için yeterli değildir. Bu mantıklı bir başlangıç ​​yeridir ve oradan daha derine inmeye ve daha geniş çapta seyahat etmeye ve daha büyük sorunların üstesinden gelmek için gerekli deneyimi kazanmaya başlayabilirsiniz.

Sorunuzu cevaplamak için kendinize, "Ne olmak istiyorum? Kariyerimle nereye gideceğim?" Yaptığınız şeyi yapmaya devam etmekten memnunsanız, karşılaştığınız büyük ölçüde keyfi röportaj sorularını yanıtlamak için yeterli veri yapılarını ve algoritmaları öğrenmek isteyebilirsiniz.

Kariyerinizde büyümek istiyorsanız ve bunun için gerekli olan tutkunuz varsa, bu konuları olabildiğince sıkı bir şekilde kucaklamalısınız. Onlar üzerinde çalışmak için biraz zamanınız varsa, açık fikirli ve gerçek bir coşku varsa, harika ve heyecan verici şeyler bulacaksınız. Quicksort'u ilk anladığım günü asla unutmayacağım. Heyecan ve keşif duygusu, hayatımın geri kalanı için rotayı belirledi ve bunun için daha minnettar olamadım. Şimdi yazılım mühendisi olarak çalışmanın dışında hiçbir şey yapmayı hayal bile edemiyorum.

Ne seçerseniz seçin iyi şanslar.

13
Adam Crossland

İşlerin ne için olduğuna bağlıdır. Bu tür şeyler oldukça standart röportaj sorularıdır, ancak aynı zamanda oldukça yaratıcı değildirler ve muhtemelen işle hiç ilgili değildirler - kesinlikle listelediğiniz teknolojileri kullanan bir iş değildir.

Görüşme soruları olarak benim için, herhangi bir genel programlama yeteneği veya bilgisi ölçüsü yerine bir Bilgisayar Bilimi derecesi yapıp yapmadığınızı (ve hatırlayabileceğiniz) iyi bir yargıçtırlar.

Röportajdan geçebilmeniz için bu şeyleri öğrenmenizi ya da sadece bu şeyleri soran herhangi bir yerin sizin için olmadığını kabul edersiniz, ama hayır, kendinize bir programcı çağırmak için onları bilmenize gerek yoktur.

12
Jon Hopkins

Harika bir soru. Javascript veya Java veya VC++, hiçbir zaman sıfırdan bağlantılı bir liste veya karma tablo oluşturmanız gerekmeyecek süper akıllı programlama dilleridir. diğeri, her bir tahakkuk eden performans cezaları ve bonusları vb.

Çok sayıda API programcıları aka kod maymunları ile röportaj yaptım ve röportajların çoğunda rutin olarak performans verimli ve ölçeklenebilir sistemler tasarlayamadılar. Alt satır: bir sürü API bilmek size ekmek getirecektir, ancak tereyağı için bilgi işlemin temelinden başlamanız gerekir.

6
Fanatic23

"Evet, tabii ki yine de kendinize bir programcı diyebilirsiniz" diye ekleyeceğim. Ama ne tür bir programcı olmak istiyorsun? En iyi programcıların teorik temelde en azından bir miktar temelleri olduğunu düşünüyorum. neden belirli bir veri yapısını/algoritmasını ve bununla birlikte gelen ödünleşimleri seçtiler. Görüşme yaptığım herhangi bir geliştiricinin aynı jargonu kullanmasalar bile en azından temel bir anlayışa sahip olmasını bekliyorum (jargonu bilmemek, diğer geliştiricilerle iletişim kurmayı daha zor bulacağınız anlamına gelir).

3
Martijn Verburg

Algoritmalar bilgisi, seçimlerinizin nasıl yapılacağını güvenle söylemenizi sağlar ölçek! Şahsen bunun kıdemli bir programcı olmak için gerekli olduğunu düşünüyorum

2
user1249

"İyi bir programcı olmak istiyorsanız, iki yıl boyunca her gün programlıyorsunuz. Eğer dünya çapında bir programcı olmak istiyorsanız, on yıl boyunca her gün programlayabilirsiniz veya iki yıl boyunca her gün programlayıp bir algoritma sınıfı alabilirsiniz ."

-Charles E. Leiserson

Algoritma Analizinden iyi tavsiye Charles E. Leiserson - MIT

2
milan-j

Şu anda iyi bir programcı olabilirsiniz, ancak Veri Yapısı, Algoritmalar ve bilgisayar bilimindeki diğer konular hakkında bilgi sahibi olmak, kendinizi birçok yönden geliştirmenize kesinlikle çok yardımcı olacaktır:

  • Bir şeyler yaparken daha etkili ve daha hızlı olabilirsiniz. Zaten Bilgisayar Bilimi derecesine sahip olan ve bu konuların çoğunu bilen insanlar bile kendilerini geliştirmek için son gelişmelerden haberdar olma eğilimindedirler.

  • Bu bilgi, daha az ölçüde de olsa, daha sonra programcıdan yönetim yoluna geçerseniz, bu bilgi ile projelerin teknik yönlerini daha iyi anlayabileceğinizi söylemek için de iyi olacaktır.

  • Elbette görüşmelerde veri yapısı ve algoritmalar çok sorulur, bu yüzden onları tanımanın faydalı olmasının bir nedeni daha vardır.

1
aditya

Projeye bağlı: Bilgisayar Mühendisliğinde BEng'im ve analist programcısı olarak çalışıyorum.

Tasarımda (test, doc, kod tasarımı) çalışmak için çok zaman harcadım. Ancak, bir hata (veya kötü performans) bulduğumda veya yeni bir veri yapısını kodlamam gerektiğinde (uygulama için gereksinim çok YENİ olduğundan), algoritmadaki sorunun nerede olduğunu anlamam ve onu düzeltmem gerekir ( Bunu çok iyi yapmadım, bu yüzden :))

Klasik algoritmalar ve veri yapıları geliştirici dünyasında bir çeşit "sözlük modeli" dir.

Bazı mükemmel bağlantılar:

1
alepuzio

Karmalardan, ağaçlardan, yığınlardan, kuyruklardan ve sıralama algoritmalarından bahsediyorsunuz. Bahsettiğiniz teknolojiler çoğunlukla web sayfası ve web komut dosyasıyla ilgilidir. Ağaçları en azından kesinlikle anlamalısınız, böylece DOM ile iyi çalışabilirsiniz. Ancak komut dosyası yazmak için yapmanız gereken tek şey buysa, muhtemelen sorun olmaz demektir. Gerçek bir programcı için ticaret araçlarının çoğuna ihtiyacınız olmayacak. Ancak bunun nedeni, Web komut dosyalarının çoğunu oluşturan string-juggling ile çoğumuzun "program yazma" olarak düşündüğü şey arasında büyük bir fark olması.

Pratik olarak günlük olarak hash ve ağaçlarla çalışırım ve daha az sıklıkta ama yeterince sık yığınlar ve kuyruklarla çalışırım. Sıralama temel olarak çözülmüş bir sorundur; Hemen hemen her dilde standart kütüphanede bir hızlı sıralama, temel koleksiyon türleri üzerinde bir Sıralama yöntemi vb. bulunur, ancak quicksort'un performansının hangi koşullar altında ciddi şekilde düşebileceğini ve sıralamayı geciktirmek için doğru stratejileri bilmelisiniz.

Bu ilkeleri ve nasıl çalıştıklarını bilmiyor olsaydım, muhtemelen işe yarayan kodlama çözümlerini hackleyebilirdim, ancak çok kaliteli çözümler olmazlardı. Yavaş koşuyorlardı, okunmaları zor ve değiştirmeleri, tekrar kullanmaları ya da uzatmaları zor. Eğer iyi bir programcı olmayı öğrenmek istiyorsanız, algoritmalarınızı ve veri yapılarınızı mutlaka okumalısınız. Kodunuzun kalitesini gerçekten artıracaklar.

0
Mason Wheeler