JavaScript'i gerçekten iyi biliyorum, ancak kodlama görüşmelerini bombaladım


33

Bu yüzden şu anda bir Ön Uç Geliştiricisi olarak yeni bir pozisyon arayışı içindeyim. JavaScript'i çok iyi biliyorum ve Kapanışlar, Köriler, Prototip Kalıtım, Tasarım Desenleri, Uygulama performansı ve genel Ön Uç Mimarisi hakkında şiirsel olarak mumlanabiliyorum. Ama yine de iş görüşmelerini bombaladım. (FYI için görüşme yaptığım işlerin çoğu, SPA'ları bir çeşit MVC çerçevesi ile inşa etmek içindir)

Genellikle kodlama testleri, profesyonelce hiç karşılaşmadığım şeylerin küçük kod parçacıklarıdır. Bir çeşit matematik problemini çözmek için bir fonksiyon yazmak gibi. Telefonu bir elinde tutarken kodlamaya çalışmanın ve bir yabancının ekranınızı görmesi ve yazdığınız her karakteri izlemesinin mirasının garipliği dışında, genellikle bu tür şeyleri gerçek dünyada görmüyorum.

Bu ciddi bir beceri seti mi eksik veya röportajcı bana alakasız sorular soruyor mu? Sanırım fonksiyonel programlama ve algoritma pirzolalarım üzerinde çalışmalıyım ama web üzerinde (ya da yazılı basında) herhangi bir öneri bulmamıştım.


4
Bazı örnekler için Project Euler'ı deneyin .
Peter K.

11
Ve telefonunuz için ahizesiz kullanım kiti almak mı?
AakashM

Neden telefonda kodlama testi yapıyorsun? İşi aldığınızda bu şekilde çalışmanız mı bekleniyor?
Burhan Ali,

2
@BurhanAli, telefon konuşmak için ve bu röportajın 1. aşaması için standart.
greenoldman

3
Evet, günümüzde sceen testlerinden bazılarının saçmalık olduğunu düşünüyorum. Özellikle bir saat içinde bir şey yapabileceğini söyledikleri “eve götürme” sınavlarını özellikle küçümsüyorum, ancak gerçekte doğru yapmak için yarım gün veya daha uzun sürebilir. Bunları dürüst yapmayı reddediyorum. Sen gerçekten görüşmecinin kaprisindesin. Bazıları gerçek dünyadaki yetenekleri değerlendiren iyi testler düşünüyor. Diğer görüşmeci ne yaptığını bilmiyor ve kendi kişisel ajanda ve güvensizliklerine sahipler.
Ringo

Yanıtlar:


52

Kod yazma, mülakat sürecinin sadece bir kısmıdır.

Aslında mantıksal problemi çözmek kod yazma görevinin sadece bir kısmıdır.

Mülakatçılar şunlardan emin olmak ister:

  • Kod yazabilirsin. On yıllık bir dilde mesleki tecrübesi olan birçok aday hiçbir kod yazamaz ve bu test bu adayları reddetmek içindir.

  • Kod yazmadan önce bir problem düşünürsünüz. Birçoğu klavyelerine sıçrayacak, onlarca satır kod yazacak, sonra asıl sorunu yanlış anladıklarını göreceklerdir, çünkü bunu düşünmek için zaman almadılar.

  • Kod yazarken kendinizi uyarlayabilirsiniz. Bir çözüm bulduğunuzu söyleyin, ancak uygulamaya başladığınızda, ilk fikrinizin en iyisi olmadığı ortaya çıktı; hızlıca daha iyi bir programa geçebilir ve sonunda yazdığınız kodu yeniden aktarabilir misiniz?

Bu aynı zamanda, bu tür görüşmelerin daha etkileşimli olması gerektiği anlamına gelir . Tek elle yazmak yerine, ahizesiz kullanım kitini satın alın veya Skype üzerinden arama yapın ve kulaklık kullanın. Yaptığınız işi yorumlarken ve yorumlarken yazarken yazarken yazın: aniden daha az garipleşir.

Çift programlamayı yaptın mı? Evetse, görüşme durumu çok benzerdir, ancak görüşmeci size fikir vermeyebilir ve siz işiniz bittiğinde sizinle klavyeleri değiştirmesini istemezsiniz.

İşte tamamen matematiksel bir problemin bir örneği ve geliştiricinin matematiksel olmayan becerilerini nasıl gösterdiği.

Örnek 1: basit kodlama çalışması

Fibonacci sayı hesaplayıcısını JavaScript uygulamasına uygulamanız gerekir. Dizini değiştirebilmelisiniz. Fibonacci dizisi bu kuralları takip eder:

  1. Dizinin ilk iki numarası 0 ve 1'dir.
  2. Takip eden her sayı önceki ikisinin toplamıdır.

Örnek: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, K 10 = 55.

Üç dakikanız var.

Burada görüşmeci mümkün olduğu kadar hızlı düşünmenizi, çözümü bulmanızı ve hızlıca uygulamanızı istiyor. Bu tür bir alıştırma, gerçek geliştiricilerin yaptıkları ile ilgisizdir ve CS derecesi yaparken bulabileceklerinizle daha yakındır, ancak bu tür şeylerle görüşen kişiler bu yüzden yapalım. Ayrıca, zaman kısıtlaması otomatik testler yapmayı imkansız kılar, böylece görüşmeci muhtemelen sizden bunu beklemez.

“Algoritmanın tanımı, özyineleme hakkında düşünmemi sağlıyor. İkinci kural, aşağıdaki özyinelemeli işleve yol açar. ”

var fibonacci = function (n) {
    return fibonacci(n - 2) + fibonacci(n - 1);
};

console.log(fibonacci(10));

“Özyinelemeyi sona erdirmek için, fibonacciişlev gövdesini değiştirerek özel durumları ekleyeceğiz .”

switch (n) {
    case 0: return 0;
    case 1: return 1;
    default: return fibonacci(n - 2) + fibonacci(n - 1);
}

“Done.”

Sonuç

Dediğim gibi, bu tür bir alıştırma, bir geliştiricinin gerçek bir işi ile tamamen ilgisizdir. Anlamsız hale getiriyor mu? Pek sayılmaz, çünkü en azından şu kişiyi gösteriyor:

  • Bir problem hakkında düşünebilir. Bazı adaylar tamamen kaybedilecek ve stres altında, yalnızca soruna yaklaşmanın olası bir yolunu düşünmek için ayrılan süreden daha fazla zaman alacaktır.

  • Özyinelemeyi bilir veya özyinelemeyi normal bir döngüde atlatabilir. Daha sonra, görüşmeci özyinelemeyi kullanmanın / kullanmamanın yolları ve özyinelemenin faydaları / sakıncaları neler olduğunu sorabilir.

  • Programlama dilinin temellerini bilir. Kişinin kullanması switch, bir koruyucu madde, şartlı veya sözlük kullanılması önemli değildir : arka plana bağlı olarak, farklı adaylar aynı şeyi başarmak için farklı araçlar seçecektir.

  • Ünite testleri, ölçeklenebilirlik veya performans gibi şeyler getirmeden soruna odaklanmış tutar. Görüşmeci daha sonra neden performans açısından, yukarıdaki fonksiyonun korkunç olduğunu sorabilir ve adayın performansı makul bir seviyeye getirmek için ne yapılması gerektiğini açıklamasını bekler.

Örnek 2: zor sorular

Fibonacci sayı hesaplayıcısını JavaScript uygulamasına uygulamanız gerekir. Olabildiğince hızlı olmalı. Dizini 0 ila 100 arasında değiştirebilmelisiniz. Fibonacci dizisi bu kuralları takip eder:

  1. Dizinin ilk iki numarası 0 ve 1'dir.
  2. Takip eden her sayı önceki ikisinin toplamıdır.

Örnek: F 0 = 0, F 1 = 1, F 2 = 1, F 3 = 2, K 10 = 55.

Üç dakikanız var.

Şimdi, görüşmecinin adayın sorunları çözme kabiliyetine gerçekten önem vermediğini, aksine hangi yolların diğerlerinden daha hızlı olduğunu tahmin etme kabiliyetini önemsemediğini gösteren ilginç bir kısıtlamamız var.

Bu zor sorular genellikle zor cevapları davet eder. Burada, zaman kısıtlaması verildiğinde, birden fazla uygulama yapmanın, bunları kıyaslamanın, en hızlı olanı profillemenin ve optimum bir çözüm getirmenin bir yolu yoktur.

Bunun yerine, ne hakkında:

“Google" İlk Fibonacci sayıları "yazmama izin ver ... ... Bu umut verici görünüyor. Bir ile basit normal ifade (Bu bir tezat olurdu), biz değerlerin virgülle ayrılmış listesi oluşturabilirsiniz.”

sed -e "s;\([0-9]*\) \([0-9]*\);'\2',;g" fbncc10.txt | tr '\n' ' '

“Sonunda programın kendisi.”

var map = ['0', '1', '1', '2', '3', '5', '8', '13', '21', '34', '55', '89', '144', '233', '377', '610', '987', '1597', '2584', '4181', '6765', '10946', '17711', '28657', '46368', '75025', '121393', '196418', '317811', '514229', '832040', '1346269', '2178309', '3524578', '5702887', '9227465', '14930352', '24157817', '39088169', '63245986', '102334155', '165580141', '267914296', '433494437', '701408733', '1134903170', '1836311903', '2971215073', '4807526976', '7778742049', '12586269025', '20365011074', '32951280099', '53316291173', '86267571272', '139583862445', '225851433717', '365435296162', '591286729879', '956722026041', '1548008755920', '2504730781961', '4052739537881', '6557470319842', '10610209857723', '17167680177565', '27777890035288', '44945570212853', '72723460248141', '117669030460994', '190392490709135', '308061521170129', '498454011879264', '806515533049393', '1304969544928657', '2111485077978050', '3416454622906707', '5527939700884757', '8944394323791464', '14472334024676221', '23416728348467685', '37889062373143906', '61305790721611591', '99194853094755497', '160500643816367088', '259695496911122585', '420196140727489673', '679891637638612258', '1100087778366101931', '1779979416004714189', '2880067194370816120', '4660046610375530309', '7540113804746346429', '12200160415121876738', '19740274219868223167', '31940434634990099905', '51680708854858323072', '83621143489848422977', '135301852344706746049', '218922995834555169026', '354224848179261915075'];

var fibonacci = function (n) {
    return map[n];
};

console.log(fibonacci(10));

Sonuç

Zor sorular zor cevapları davet eder. Kahramanlık yapmayın ve sadece üç dakikanız olduğunda kıyaslama ve profillemeye başlama. Deneyiminizi kullanırken sorunu çözmenin akıllı yollarını düşünün. Deneyim bana bir haritayı kullanmanın sayıyı hesaplamaktan daha hızlı olabileceği konusunda ipucu veriyor. Yanlış olabilir, ancak zaman kısıtı verildiğinde bu girişimin yapılması beklenebilir.

Araçlarınızı bilmek de yardımcı olur ve geliştirici becerilerinin önemli bir parçasıdır: düzenli ifadeler bilmeden, ayrılan üç dakikayı virgülle ayrılmış bir liste için Googling ile harcardım veya ihtiyaç duyduğum diziyi oluşturacak bir ayrıştırıcı yazmaya başlardım.

Unutmayın, iyi bir geliştirici hemen kodlamaya başlayan değil, daha iyi bir fırsat olduğunda kodlamayı nasıl önleyeceğini bilen bir kişi değildir. Bazı görüşmeci size kodlama yapanlara benzeyen, ancak neredeyse hiç kod gerektirmeyen ödevler vermekte tereddüt etmeyecektir.

Örnek 3: eksiksiz uygulama geliştirme

Fibonacci dizisini JavaScript'te uygulamanız gerekir. Dizinin uzunluğu programın yürütülmesi sırasında belirlenir. Dizi şu kuralları izler:

  1. Dizinin ilk iki numarası 0 ve 1'dir.
  2. Takip eden her sayı önceki ikisinin toplamıdır.

Örnek: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89.

Uygulama, kullanıcının bir giriş alanı aracılığıyla dizinin uzunluğunu belirlemesine izin veren bir web sayfası olarak sunulmalıdır.

Bir saatin var.

Hadi başlayalım.

“Örnek sıra çok yararlı, çünkü uygulamamın tamamen yanlış görünmemesini sağlamak için bir sürü birim test yapmamı sağlayacak. Genel olarak, node.js veya QUnit için istemci tarafı JavaScript için Mocha kullanıyorum, ancak burada sadelik uğruna, sadece birkaç test fonksiyonu atacağım. ”

“ Dosya index.htmve fib.jsdosyalar oluşturarak başlıyorum . Ardından, index.htmgerçekten minimalist ve W3C uyumlu olmayan kodlarla dolduruyorum (HTML becerilerimle de ilgileniyorsanız, daha sonra tekrar başlayabiliriz. ”

<label>Length</label> <input id="length" value="15" />
<input id="compute" type="button" value="Compute" />
<div id="result" style="font-weight:bold;"></div>
<div id="tests"></div>
<script src="fib.js"></script>

“Şimdi Fibonacci jeneratör işlevini çağıracak ve sonuçları gösterecek bir kod yazalım.”

fibonacci = (function () {
    var compute,
        init;

    compute = function (length) {
        // TODO: Implement Fibonacci sequence.
        return [1, 2, 3];
    };

    init = function () {
        var button = document.getElementById('compute');
        button.addEventListener('onclick', function () {
            var length = parseInt(document.getElementById('length').value, 10),
                result;

            console.log(
                'Computing Fibonacci sequence of length ' + length + '.'
            );

            result = compute(length);
            document.getElementById('result').innerText = result.join(', ');
        });
    };

    return {
        compute: compute,
        init: init
    };
}());

“Kodu ilk defa çalıştırmanın zamanı geldi ve ... işe yaramadı. Hiçbir şey olmuyor. Niye ya?"

“Tamam, fibonacci.init();sonunda unuttum . Ben ekledim ve yine de hiçbir şey olmuyor, en azından mesajı konsolda göstermesi gerekiyor. Bekle, doğru, öyle onclickdeğil click; JQuery'yi o kadar sık ​​kullanıyorum ki, etkinliklerin isimlerini düz JavaScript'teki unutmaya başladım. ”

“Bazı testler ekleyelim.”

ensureAreEqual = function (expected, actual) {
    var testResultsContainer = document.getElementById('tests');
    testResultsContainer.innerText += (expected.equals(actual) ?
            '.' :
            ('Actual [' + actual.join(', ') + '] is different from ' +
             'expected [' + expected.join(', ') + '].'));
};

test = function () {
    ensureAreEqual([0], compute(1));
};

“Dizileri karşılaştırmak zor olabilir, bu yüzden bu cevabınArray.prototype.equals kodunu kopyalayıp yapıyorum .”

“Şimdi uygulamayı çalıştırdığımızda, görüntüler:”

Gerçek [1, 2, 3] beklenenden [0] farklı.

return [1, 2, 3];Fibonacci dizisinin gerçek uygulaması ( ) dikkate alındığında, son derece beklenen bir test başarısız oldu . Bunu değiştirme zamanı geldi. ”

“Orijinal ifadeden, Fibonacci dizisi başlıyor [0, 1], şöyle computeoluyor:”

compute = function (length) {
    var fib = [0];
    return fib;
};

“Bu, ilk testten geçmeyi mümkün kılıyor ve şimdi ikincisini yazabiliyoruz.”

ensureAreEqual([0, 1], compute(2));

“Başarısız oluyor, bu yüzden geri dönüyoruz computeve değiştiriyoruz.”

compute = function (length) {
    var fib = [0, 1];
    return length === 1 ? [0] : fib;
};

“Şimdi, her iki test de geçiyor ve artık son derece olmayan davalara geçme zamanı”

compute = function (length) {
    var fib = [0, 1],
        i,
        next,
        current = 1,
        previous = 0;

    for (i = 2; i < length; i += 1) {
        next = current + previous;
        previous = current;
        current = next;
        fib.push(next);
    }

    return length === 1 ? [0] : fib;
};

“Sonuç olarak 100 gibi daha büyük uzunluklara bakılmaması dışında, üç test de başarılı oluyor. Bu sonuçları doğru bir şekilde elde etmek için isteğe bağlı bir hassas kitaplık kullanmalıydık . Geliştirilmesi gereken şeyler de var. Örneğin, adlandırma kuralları bazen çok kötüdür (nedir fib?). HTML ile ilgili JavaScript kodu, test kodunun yanı sıra farklı bir nesneye de gitmelidir. Ayrıca, test etmedim compute(0)ve girişleri kontrol etmedim . ”

Sonuç

Örnekte ilerleyerek, görüşme sırasında beklenen etkileşimi görebilirsiniz. Her şey yolunda gitmedi (başlangıçta birkaç hata yaptım, bu da uygulamayı çalıştırdığımda hiçbir şeyin olmadığı utanç verici bir duruma neden oldu) ve daha geniş bir dizi uzunluğunu desteklememiz gerekirse orijinal yaklaşım yetersizdi, ancak başardım. bunu göstermek için:

  • Farklı sorunları çözebilirim
  • Test odaklı geliştirme yapıyorum, Fibonacci dizisi bunun için mükemmel bir fırsat.
  • Kaynak güvenilir olduğunda kodu kopyala-yapıştır yapıyorum ve sıfırdan yazmak oldukça karmaşık ve hataya açık görünüyor,
  • JQuery gibi kütüphanelere fazla güvenmiyorum.
  • Doğru kapsamı seçtim: görüşmeci JavaScript becerilerimi kontrol etmek istediğinden, mükemmel ve temiz HTML yazmak için zaman kaybetmeyeceğim: burada zaman harcamak, birim testleri yazmak için daha fazla zaman harcamayı mümkün kılmıyor,
  • Ne zaman biteceğimi ve ne zaman bittiğimi biliyorum, bir çok şeyin mükemmel olmadığını göz önünde bulundurarak ( compute(0)ki bu başarısız olacak, ancak demo için önemli değil).

Bu tam olarak bir görüşmecinin sizden beklemesi gereken şeydir.

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.