Applicazione console per interviste sviluppatore [chiusa]

1

Mi è stato affidato il compito di aiutare il nostro reparto risorse umane a creare nuove domande di intervista per i candidati candidati a posizioni di sviluppo. Come parte del processo, vorrei valutare la loro capacità di capire entrambi il codice senza l'aiuto di un compilatore e individuare potenziali problemi futuri.

Come tale, ho ideato un'applicazione di console di base. Il codice sorgente che fornirò ai candidati e porterò loro le seguenti domande:

  1. Would this code compile without any errors? If not, why not?
  2. Can you spot any potential issues in the code which might cause bugs in future?
  3. What improvements would you make to the code?

Ho le mie risposte alle domande, ma mi piacerebbe ricevere un feedback per vedere se c'è qualcosa che potrei aver perso.

using System;
using System.Collections.Generic;

namespace DeveloperTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var users = new List<User>();

            users.Add(new User("John Smith", "42", DateTime.Today));

            string name = "Jane Smith";
            int age = 37;
            int yearJoined = 17;
            int monthJoined = 01;
            int dayJoined = 15;
            users.Add(new User()
            {
                Name = name,
                Age = age,
                DateJoined = new DateTime(day: dayJoined, month: monthJoined, year: yearJoined)
            });

            users[0].PrintUserInfo();

            RemoveUsersUnderAge(users, 40);

            Console.ReadKey();
        }

        private void RemoveUsersUnderAge(List<User> users, int age)
        {
            foreach (var user in users)
            {
                if (user.Age < age)
                {
                    users.Remove(user);
                }
            }
        }
    }

    class User
    {
        private string _name;
        private int _age;
        private DateTime _dateJoined;

        public User()
        {

        }

        public User(string name, string age, DateTime dateJoined)
        {
            if (name == null) Name = "Unknown";
            if (age == null) Age = 0;
            if (dateJoined == null) DateJoined = DateTime.Today;

            Name = name;
            Age = Convert.ToInt32(age);
        }

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        public DateTime DateJoined
        {
            get { return _dateJoined; }
            set { _dateJoined = value; }
        }

        private void PrintUserInfo()
        {
            Console.WriteLine($"Name: {this.Name}.");
            Console.WriteLine($"Age: {this.Age} years old.");
            Console.WriteLine($"Joined: {this.DateJoined}.");
        }
    }
}
    
posta Dmihawk 25.01.2017 - 03:09
fonte

1 risposta

7

Sei sulla strada giusta, ma il tuo test potrebbe migliorare. Non mettere alla prova le persone per capire codice , testarle per capire gli algoritmi . La maggior parte dell'analisi che stai richiedendo può essere eseguita da strumenti, invece i candidati fanno analisi che ancora oggi richiedono l'intervento degli umani.

La maggior parte dei problemi con il tuo codice verrà rivelata in un quarto di secondo dopo aver colpito build e risolta quasi rapidamente. I modificatori di protezione, i membri statici / non statici e gli errori di battitura e le questioni simili non valgono la pena di passare il tempo, perché non rivelerà molto sull'abilità generale dei candidati, perché è soprattutto una caccia all'errore di battitura.

Quello che vuoi e il tuo codice manca, è un algoritmo difficile da analizzare e fare il debug. Roba come la pelosa gestione di data / ora, algoritmi di suddivisione di stringhe C, piccoli algoritmi di analisi, cose del genere. Gli elementi chiave sono loop, ramificazioni e manipolazione dei dati. Quelle sono quelle in cui i bug più insidiosi possono nascondersi, cose come errori "fuori-uno", la mancanza di controllo dei limiti, ecc. I campioni di codice che sono particolarmente buoni sono dove solo i casi di bordo o d'angolo sono un problema.

L'esempio di codice che hai fornito non fa quasi nulla, la maggior parte è solo getter e setter, processo decisionale minimo e loop quasi irrilevante. Inoltre, dal momento che l'esempio di codice non svolge alcun compito particolare, i suggerimenti su come migliorarlo saranno inventati e privi di significato. Lo studio del campione può dimostrare in qualche misura la capacità di alcuni di analizzare il codice, ma non di sintetizzare un nuovo codice. Ciò può essere dimostrato camminando mentalmente attraverso complicati algoritmi, dove è possibile dimostrare un chiaro modello di assegnazione e operazioni.

Un altro buon modo per dimostrare la capacità di sintesi è di avere una parte dell'algoritmo in analisi mancante. Lasciare fuori una funzione nidificata o alcune di queste, ma lascia abbastanza del corpo principale affinché sia chiaro che cosa dovrebbe fare l'algoritmo. Quindi, chiedi al candidato di scrivere il pezzo mancante per far funzionare di nuovo l'algoritmo generale e verificane la correttezza.

I tipi di compiti che ho delineato faranno un lavoro molto migliore nel separare i principali giocatori della lega dai campionati del bush, e non li valuteremo invece sulla base della loro capacità di fare qualcosa che i computer fanno già un milione di volte meglio.

    
risposta data 25.01.2017 - 04:05
fonte

Leggi altre domande sui tag