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


37

Kodladığımdan beri altı yıl geçti. ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, vb. Her türlü şeyi kodlama Diziler, haritalar, bağlantılı listeler, kümeler vb. Kullandım ve her yerde benim gibi çalıştım. Ancak ne zaman görüşülsem, insanların bana karmaları, ağaçları, yığınları ve kuyrukları hakkında soru sormaları çok muhtemel. Bazı sorular bazı sıralama algoritmalarında hokkabazlık yapmakta. Onları gerçekten tanımalı mıyım yoksa kendime programcı demeyi bırakmalı mıyım bilmiyorum. İçimde, tüm bu soruları soran insanlar beni seçseler bile beni asla bu şeylerle uğraşmayacaklarını söyleyen bir şey var. Tüm bunları bilmek gerçekten gerekli mi?


10
Bu, nerede çalıştığınıza ve kime programcı demek istediğinize bağlıdır.
Tim

1
Evet, olumsuz sıfatlar yoksa.
duros

Yanıtlar:


79

Yapmanız gereken tek şey tutkal kodu yazmaksa, kendinize bir kod maymunu diyebilirsiniz. Bir sürü yapıştırıcı kodunun yazılması gerekiyor ve bir kod maymunu olarak iyi bir yaşam sağlayabilirsiniz. Kendinize bir Real Programmer TM diyor ve kodun sıfırdan yazılması gerektiğinde güven duymanız için algoritmaları, veri yapılarını, bellek yönetimini, işaretçileri, montaj dilini, vb. Bilmeniz ve bu bilgileri nasıl kullanacağınızı anlamanız gerekir.


6
Vay canına, bunun "kod maymunu" terimini kullandıkları için aşırı politik olarak doğru insanlar tarafından unutulmayacağını bekliyorum.
dsimcha

15
"yazılım simianı" her zaman tercih edilen terminolojidir
STW

3
Tamamen aynı fikirdeyim. "Sıfırdan" yazılan yazılım türü, kimin yazabileceğini büyük ölçüde etkiler. Bazı yazılımlar doğal olarak diğerlerinden daha az (veya daha fazla) karmaşıklık gerektirir.
Nick Spreitzer,

8
+1,% 20 çünkü "Real Programmer TM" yüzünden% 5, "% 75", meclis dilini öğrendiğimden ve bunun acıya değdiğini iddia etmek istediğimden dolayı% 5 kabul ediyorum
Carson Myers

3
Mevcut işlerin çoğu sadece 'kod maymunları' gerektirir. 'Kod maymunu' işindeki insanların önceki tüm bilgilerini unuttukları ve potansiyeline rağmen kendini her gün biraz daha 'kod maymunu' yapması normaldir. :(
cag

32

tarihi bilmeyenler onu yeniden icat etmeye mahkumdur


75
Aslında, geçmişi bilmeyenler, 50'nin hepsinde içki almak için yeterince eski olan iyi bilinen O (N log N) yöntemlerini kullanmak yerine O (N 2) veya O (N 3) yöntemlerini kullanarak yeniden icat etmeye mahkum edildi. devletler.
John R. Strohm

@John ROFLMAO - çok doğru!
Steven A. Lowe

3
.... bunu tavsiye etmeye mahkumdur

30

Peki, JavaScript gibi bir dilde çalışmak bunu oldukça eski hale getirir, çünkü Dizi bir vektör, bir karma ve bir ağaç arasındaki karışımdır ve bir yığın veya sıra olarak kullanılabilir. Array sınıfından daha iyi performans gösteren JavaScript'te bir veri yapısına ihtiyaç duymanız veya bunları uygulamanız çok düşük bir ihtimaldir. Bu PHP'de de geçerlidir.

Java OTOH için bir fark var. Sanırım Java'nın standart kütüphanesi, ihtiyacınız olan her türlü veriyi size sağlıyor. Ancak:

  1. Doğru veriyi 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, belirli bir durumda daha iyi bir hız elde etmek için hashmap için kendi uygulamanızı yazmak isteyebilirsiniz (örneğin, kullanmak istediğiniz tuşlar, 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 bir ihtiyaç yoktur, çünkü bir tanesini kendi başınıza uygulamanıza gerek yoktur. Ancak, eğer böyle bir algoritma size verildiyse, onu anlayabilmeli ve uygulayabilmelisiniz.

İki şey kesindir:

  1. Sen olabilir böyle bilgisine dayanmadan bir programcı olarak kariyer yapmak.
  2. Bu kesinlikle onları bilmek size zarar vermez.

Veri yapıları ve algoritmalar basitçe bir şeydir, anlaşılması iyi bir şeydir. Ve son derece net ve resmileştirilmiş bir şey ve bu nedenle uygulama veya sistem mühendisliğinin karmaşıklığı ile karşılaştırıldığında oldukça önemsiz. Onlar sadece bulmacanın küçük bir parçasını oluşturuyorlar, ancak kavraması kolaydır - eğer biraz zaman harcamak istiyorsanız.

Yani hayır, onlara ihtiyacınız yok, ancak yalnızca onları tanımanız sizin yararınıza olacaktır.


13

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, birçok programlama dili ve ilgili teknolojiler hakkında bilginiz olduğunu ve bunları istenen sonuçları üretmek için kullanabileceğinizi görüyoruz. Bu 'bilgisayar programcısı'nın iyi bir operasyonel tanımıdır.

Kendimi yazılım mühendisi olarak görüyorum. İşimin günlük yönlerinin çoğunda, muhtemelen yaptığınız şeyleri yapıyorum. İstenen sonucu elde etmek için bilgisayar dili ve ilgili teknolojileri kullanıyorum. Ancak, veri yapıları ve algoritmaları hakkında bir anlayışa sahibim ve bu bilginin daha fazlasını yapma yeteneğimin temel bir göstergesi olduğunu düşünüyorum.

Sık sık - her ne kadar her gün olmasa da - işim, açık bir çözümü olmayan karmaşık sorunlara, çalıştığım çerçevenin özelliklerine veya çalıştığım dilin yeteneklerine doğrudan değinilen hiçbir şeyi içermemeyi içerir. ile. Bu konuda problemi analiz etmem ve bir çözüm bulmam gerekiyor ve zaman zaman bu süreç büyük ölçekli mimarlık alanında gerçekleşiyor.

Bu tür işleri yapmak için bu daha derin konuların mükemmel bir şekilde anlaşılması gerekli olsa da, bu yeterli değildir . Başka bir deyişle, bir karma masanın nasıl çalıştığını veya bir yığın sınıfı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, daha geniş seyahat etmeye başlayabilir ve daha büyük sorunların üstesinden gelmek için gereken deneyimi kazanabilirsiniz.

Sanırım sorunuzu cevaplamak için kendinize “Ne olmak isterim? Kariyerim ile nereye gideceğim?” Diye sormalısınız. Yaptığınız şeyi yapmaya devam etmekten memnunsanız, o zaman büyük oranda keyfi röportaj soruları ile yüzleşmek için yeterli veri yapıları ve algoritmaları öğrenmek isteyebilirsiniz.

Kariyerinizde büyümek istiyorsanız ve gerekli olan tutkuya sahipseniz, bu konuları olabildiğince sıkı bir şekilde kucaklamanız gerekir. Onlarla çalışmak için biraz zamanınız varsa, açık fikirli ve gerçek coşkunuz varsa, bazı harika ve heyecan verici şeyler bulacaksınız. İlk önce hızlı bağlantı noktasını anladığım günü asla unutmayacağım. Heyecan ve keşif hissi hayatımın geri kalanı için parkur oluşturdu ve bunun için daha minnettar olamadım. Şimdi, bir yazılım mühendisi olarak çalışmaktan başka bir şey yapmayı düşünemiyorum.

Ne seçerseniz seçin, bol şanslar.


2
Her zaman bariz çözümler vardır. Gereksinimler değiştiğinde çalışmayı bırakırlar;) Algoritmaların ve veri yapılarının derin bilgisinin iyi bir yazılım mühendisi için gerçek bir önkoşul olduğunu sanmıyorum. Sadece onsuz birini göremezsiniz, çünkü iyi bir yazılım mühendisinin sahip olduğu bilgi için tatmin edici bir susuzluktur.
back2dos

+1 İyi yazılmış ifadeler 'Sanırım sorunuzu cevaplamak için kendinize sormalısınız, "Ne olmak isterim? Kariyerim ile nereye gideceğim?"
Bill

11

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

Görüşme soruları olarak benim için genel bir programlama kabiliyeti veya bilgisinin bir ölçütü yerine, bir Bilgisayar Bilimi derecesi yapıp yapmadığınızı (ve bunu hatırlayabiliyorsanız) iyi bir yargıçtırlar.

Röportajı başarabilmeniz için bu şeyleri öğrenmenizi ya da bu şeyleri soran herhangi bir yerin sizin için olmadığını kabul etmenizi öneririm, ama hayır, kendinize bir programcı demelerini bilmeniz gerekmez.


1
Cevabınız için teşekkürler. Komik bir röportajda paylaşacağım insanlar beni araştıran kişiler json css ajax javascript jquery vb. Kullanarak Kullanıcı Arabirimi tarafında iyi olan birisini gerekli kılıyorlardı. Ve kaydetme bir kelime dosyasına basıldığında ne olur
sushil bharwani

2
@sushil - Bence çalışmak istemediğin yer burası ...
Jon Hopkins

@sushil: @Jon Hopkins ile tamamen aynı fikirdeyim. Böyle bir işi almaktan daha iyi bir iş bekleyen bir garson olarak çalışmak daha iyidir. Beceriksiz salakların üstleri olarak olması seni aşırı derecede sinirlendirecek ve kişisel gelişiminde durduracak.
back2dos

6

Harika soru Javascript veya Java veya VC ++, sıfırdan bağlantılı bir liste veya karma tablo oluşturmanıza gerek kalmayacakları süper akıllı programlama dilleridir. Ancak yine de ne zaman bir başkasının kullanılacağına karar verme yeteneğine, performans cezalarını ve her bir tahakkuk eden bonusu vb.

Bir çok API programcısı aka kod maymunu ile röportaj yaptım ve röportajların çoğunda rutin olarak performans etkin ve ölçeklenebilir sistemler tasarlamada başarısız oldular. Alt satır: API yüklerini bilmek size ekmeği kazandıracaktır, ancak tereyağ için bilgisayar temellerinden başlamanız gerekir.


Çok teşekkürler, tavsiyenizi alıp bu konular hakkında öğrenmeye başlayacağım
Mahmoud Hossam

3

"Evet, elbette kendinize hala bir programcı diyebilirsiniz" ekleyeceğim. Ama ne tür bir programcı olmak istersiniz? Bence en iyi programcıların en azından teorik temellerde bazı temelleri var. Neden belirli bir veri yapısını / algoritmasını seçtiklerini ve bununla birlikte gelen avantajları biliyorlar . Görüştüğüm geliştiricilerin aynı jargonu kullanmasalar bile en azından temel bir anlayışa sahip olmalarını bekliyorum (jargonu bilmemekle birlikte diğer geliştiricilerle iletişim kurmayı daha zor bulacağınız anlamına gelir).


2

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


2

“İyi bir programcı olmak istiyorsanız, sadece iki yıl boyunca her gün programlayabilirsiniz. Dünya standartlarında bir programcı olmak istiyorsanız, her yıl on yıl boyunca her gün programlayabilir veya iki yıl boyunca her gün programlayabilir ve bir algoritma dersi alabilirsiniz. ."

-Charles E. Leiserson

Algoritma Analizinden İyi Tavsiye Charles E. Leiserson - MIT


1

Projeye bağlı: Bilgisayar Mühendisi olmaktayım ve analist programcı olarak çalışıyorum.

Tasarımda çalışmak için çok zaman harcadım (test, doc, kod tasarımı). Ancak, bir hata (veya kötü performans) bulduğumda veya yeni bir veri yapısını kodlamam gerektiğinden (uygulama için gereklilik çok yeni olduğu için) algoritmadaki sorunun nerede olduğunu anlamalıyım ve onu düzeltmeliyim ( Bunu çok iyi yapmadım.

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

Bazı mükemmel bağlantılar:


1

Şu anda iyi bir programcı olabilirsiniz, ancak Veri Yapısı, Algoritmalar ve bilgisayar bilimlerindeki diğer konuların bilgisi kesinlikle birçok yönden kendinizi geliştirmenize yardımcı olacaktır:

  • Bir şeyleri yaparken daha etkili ve hızlı olabilirsiniz. Bilgisayar Bilimi diplomasına sahip olan ve bu konuların çoğunu bilen insanlar bile, kendilerini geliştirmek için kendilerini en son gelişmelerden haberdar tutma eğilimindedir.

  • Bu bilgi, eğer daha azına kadar, eğer programcıdan yönetim izine geçerseniz, çünkü bu bilgiyle projelerin teknik yönlerini daha iyi anlayabileceğiniz için de iyi olacaktır.

  • Tabii ki veri yapısı ve algoritmalar görüşmelerde çokça isteniyor, bu yüzden onları tanımanın faydalı olmasının bir nedeni de bu.


0

Karma, ağaç, yığın, sıra 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. Ama komut dosyası yapmanız gereken tek şeyse, muhtemelen sorun değilsiniz. Gerçek bir programcı için ticaretin araçlarının çoğuna ihtiyacınız olmayacak. Ancak bunun nedeni, Web komut dizilerinin çoğunu oluşturan string-hokkabazlık arasında büyük bir fark olduğu ve çoğumuzun "program yazma" olarak düşündükleridir.

Haşhaş ve ağaçlarla pratik olarak günlük olarak çalışıyorum ve istifler ve sıralar daha az sık ama yeterince sık. Sıralama temelde çözülmüş bir problemdir; hemen hemen her dilde standart kütüphanede yerleşik bir hızlı bağlantı noktası, temel koleksiyon türlerinde bir Sıralama yöntemi, vb. vardır, ancak hangi koşullar altında hızlı bağlantı noktasının performansının ciddi şekilde düşebileceğini ve sıralama işlemini geciktirmek için doğru stratejileri bilmeniz gerekir.

Bu ilkeleri ve nasıl çalıştıklarını bilmiyorsam, muhtemelen işe yarayan kodlama çözümlerini hackleyebilirim ama çok iyi kalitede çözümler olmazlardı. Yavaşça koşuyorlardı, okuması zor ve değiştirmesi, yeniden kullanması veya uzatması zordu. Bu yüzden iyi bir programcı olmayı öğrenmek istiyorsanız, algoritmalarınızı ve veri yapılarını kesinlikle okumalısınız. Kodunuzun kalitesini gerçekten artıracaklar.

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.