C
C++
IT Standards
Programming
June 2016 14

«Привет, мир!» как инструмент для оценки навыков программирования

Оценка уровня профессиональных навыков программиста очень сложная задача. Каждый решает её по-своему: кто-то предлагает кандидату пройти очень объемный тест, состоящий из тысячи вопросов, кто-то предлагает решить сразу очень сложную задачу, и т.п. Данные подходы имеют право на существование, но они как минимум требуют много времени. Обычно требуется быстро оценить уровень, тогда проще всего предложить решить очень простую задачу на интересуемом языке программирования. Я предлагаю в качестве такой задачи использовать программу, с которой начинается изучение любого языка – «Привет мир!».
С одной стороны, это очень простая задача, но с другой, как показывает практика, даже она является в то же время очень сложной. Рассмотрим подробно какие варианты решения такой задачи пишут реальные люди и что они показывают.
Вариант 1-ый – правильная программа, работающая с ошибкой.
#include <stdio.h>
void main()
    {
    printf( "Hello, world!" );
    }


Что тут неправильного? В консоль выводится текст, программа вроде работает… Но, вспоминаем, в контексте операционной системы, любая программа возвращает код завершения. Данный код (нужно вспомнить ассемблер) храниться в регистре eax (на 32-х разрядной платформе, чтобы быть полностью корректным). В примере выше мы ничего в данный регистр не помещаем, но операционная система не меняет логики своей работы. Поэтому, скорее всего какой-то мусор, находящийся там, будет интерпретирован как результат работы нашей программы. А так как это скорее всего (99.99%) не нулевое значение, то это означает, что наша программа завершилась ошибочно.
Вот «правильный» вариант с точки зрения операционной системы:
#include <stdio.h>
int main()
    {
    printf( "Hello, world!" );
    return 0;
    }

В предпоследней строке мы в качестве результата работы возвращаем 0 – все успешно.
Идём дальше, уже лучше, но все равно есть что улучшить. Смотрим на строку с выводом строки в консоль, там есть повод для замечания от компилятора – небезопасный вывод. Вот более безопасный вариант:
#include <stdio.h>
int main()
    {
    printf( "%s", "Hello, world!" );
    return 0;
    }

Думаю, этот вариант понятен без объяснения (для остальных не составит труда найти объяснение в гугле).
Вроде последний вариант нельзя улучшить, или нет? Какие есть предложения? Как известно, программа без комментариев ничего не стоит, поэтому возможно здесь не хватает именно них или нет? Я считаю (и не только я один), что комментарий здесь также нужен, но какой? Что комментировать и как, чтоб не получилось масло масленое. Писать программы, понятные компьютеру, учат в школе в 9-м классе (или ещё раньше), но писать программы, понятные человеку, иногда не учат даже в университете.
Вот пример программы с комментариями (то есть документированной) в стиле системы автодокументирования Doxygen.
///@file hello_world.cpp
///@brief Учебная программа, выводящая в консоль приветствие «Hello, world!».
///@author idimm 

#include <stdio.h>

///@brief Главная функция, непосредственно выводящая в консоль приветствие. 
int main()
    {
    printf( "%s", "Hello, world!" );
    return 0;
    }

Некоторые пояснения — данный код содержит минимальную информацию на уровне файла (кто автор, версию, общее описание) и на уровне функции (что функция делает). Данный пример показывает, что даже такая программа может содержать ценный комментарий.
Но и это не последний вариант. Пусть нам необходимо вывести приветствие на китайском языке, как это сделать? Во-первых, это можно реализовать различными способами, во-вторых, это потребует дополнительных знаний о работе с символьными данными (строками). Я не буду приводить пример решения данной задачи, но она не так проста, как кажется. Рекомендую самостоятельно это сделать.
Таким образом, даже простейшая задача может много рассказать о навыках программирования.
-54
5.1k 22
Comments 153