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:
- Dizinin ilk iki numarası 0 ve 1'dir.
- 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, fibonacci
iş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:
- Dizinin ilk iki numarası 0 ve 1'dir.
- 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:
- Dizinin ilk iki numarası 0 ve 1'dir.
- 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.htm
ve fib.js
dosyalar oluşturarak başlıyorum . Ardından, index.htm
gerç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 onclick
değ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 compute
oluyor:”
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 compute
ve 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.