Почему надо хорошо знать свой инструмент

Каждый раз, когда я рассказываю в блоге как я провожу собеседование программистов, я получаю груду комментариев вида «я плохо знаю язык и считаю, что это нормально, а ты собеседуешь неправильно, нельзя требовать от людей хорошего знания языка». Я уж думал, что я последний человек на Земле, который считает, что инструмент надо знать хорошо (справедливости ради, некоторые комментаторы меня в этом поддерживали).

Ан нет, отличная презентация Олве Маудала и Джона Джаггера «Deep C (and C++)» даёт надежду, что я не последний и хорошо показывает различия между посредственным знанием и хорошим.
11 декабря 2011 13:12

Александр Симонов (инкогнито)
11 декабря 2011, 13:28

Если проводить аналогии с молотком, хорошим знанием инструмента будет считаться умение этим молотком делать дело. А вовсе не знание всех существующих в мире видов ручек к молоткам и детальное понимание того, что произойдёт, если пытаться забить гвоздь в азотной атмосфере.
К сожалению, многие задачи собеседований скорее напоминают пример с молотком в азотной атмосфере, проверяя энциклопедические знания.
Что, конечно же, не отменяет необходимости знать свой инструмент достаточно хорошо, чтобы конечный результат получался с требуемым уровнем качества.

bolk (bolknote.ru)
11 декабря 2011, 13:35, ответ предназначен Александру Симонову

Если проводить аналогии с молотком, хорошим знанием инструмента будет считаться умение этим молотком делать дело. А вовсе не знание всех существующих в мире видов ручек к молоткам и детальное понимание того, что произойдёт, если пытаться забить гвоздь в азотной атмосфере.
Если проводить аналогии с молотком, то знание всех существующих в мере ручек равно знанию всех языков программирования, а вовсе не знанию одного языка хорошо. Умение забить гвоздь в азотной атмосфере относится к опыту, а не знанию языка.

Eyeless (инкогнито)
11 декабря 2011, 13:52, ответ предназначен bolk (bolknote.ru):

Все языки - это таки все инструменты, включая пневматические дрели и кисточки для акварели.
Александр говорил как раз-таки не про умение, а про знание, не подкрепленное опытом (потому что опыту взяться неоткуда - какой дурак будет в азотной атмосфере применять гвозди, все же знают, что шурупы гораздо лучше для этого подходят).

Илай (инкогнито)
11 декабря 2011, 14:32

Два программиста. Один сам выучил язык на практике, читая много отрывочной информации, мануал и читал чужие исходники, так что уважал краткость и читабельность кода.
Второй пользовался только университетскими знаниями и не следил ни за блогами, ни за чем новым, считая что и так потратил временя на изучение инструмента, что подтвердили дипломом и собеседованием. Писал при этом очень академический ОО код.
Даже не знаю что лучше.

bolk (bolknote.ru)
11 декабря 2011, 15:29, ответ предназначен Eyeless

Все языки — все инструменты. Я говорю про знание одного. Причём тут все инструменты и все языки?

bolk (bolknote.ru)
11 декабря 2011, 15:31, ответ предназначен Eyeless

Я не говорю сейчас про методологии и практики. Я, вроде, однозначно вполне написал, нет?

Олег Горбунов (инкогнито)
11 декабря 2011, 15:38

Евгений, а можно разграничить как-то между «хорошо» и «плохо»? Ну, хотя бы в вашем восприятии.
Я вот например, понятия не имею, хорошо я знаю PHP, или плохо, хорошо я знаю SQL или плохо. Что питон я знаю плохо, я знаю :)

GreLI (инкогнито)
11 декабря 2011, 15:41, ответ предназначен Илаю

Ещё не факт, что их надо противопоставлять. «Академик» мог не знать каких-то приёмов, но быть достаточно сообразительным и иметь достаточно знаний, чтобы додуматься самостоятельно. «Практик» мог не знать про академический подход, но вывести паттерны программирования из своего огромного опыта. Именно так они кстати и были созданы.

bolk (bolknote.ru)
11 декабря 2011, 16:48, ответ предназначен Олегу Горбунову

Так а слайды-то посмотрите, там же есть всё :) Или всё равно не понятно?

Олег Горбунов (инкогнито)
11 декабря 2011, 16:58, ответ предназначен bolk (bolknote.ru):

Ну я это... слона то и не приметил ;)

Олег Горбунов (инкогнито)
11 декабря 2011, 17:12

Посмотрел слайды. Я очень плохо отношусь к «собеседователям» которые считают, что я должен угадать «правильный» ответ на его «хитрый» вопрос относительно его восприятия и настроения. На краткий вопрос положен краткий ответ. Разверни в вопросе, что же именно хочешь услышать, какие знания тебя интересуют — ты получишь развернутый ответ.
Разговаривать нужно с людьми. И желательно, не вопросами «угадай, или я идиот, или я хочу узнать какие-то особенности» — уважение должно быть взаимным.

bolk (bolknote.ru)
11 декабря 2011, 18:28, ответ предназначен Олегу Горбунову

Тут я полностью согласен. Нужно объяснить на что внимание обратить.

warmland.ru (warmland.ru)
12 декабря 2011, 02:26, ответ предназначен bolk (bolknote.ru):

Я думаю, Илай говорил вот о чём: при прочих равных лучше тот программист, который обладает глубоким знанием языка. Но если, например, глубокое знание языка сочетается с провалами в других областях, и «глубокий» знаток пишет грязный код или не задумывается о проектировании, то достоинство сводится на нет.

Вероятно, читатели всякий раз негодуют, потому что опасаются, что вы, Евгений, ставите глубокое знание языка выше прочих достоинств соискателя.

Orcinus Orca (www.orcinus.ru)
12 декабря 2011, 05:35

Не знаю по поводу глубокого знания, но мне кажется, что правильней выбирать человека который может пользоваться тем набором знаний которые у него уже есть. Дело в том, что можно знать массу приёмов и хитых хаков для разбора и решения примеров, но на практике в большом проекте не смочь их реализовывать. Знать и уметь пользоваться - это разные понятия.

bolk (bolknote.ru)
12 декабря 2011, 06:38, ответ предназначен warmland.ru:

Вероятно, читатели всякий раз негодуют, потому что опасаются, что вы, Евгений, ставите глубокое знание языка выше прочих достоинств соискателя.
Мне интересно как они этот вывод делают.

bolk (bolknote.ru)
12 декабря 2011, 06:40, ответ предназначен Orcinus Orca (www.orcinus.ru):

Не знаю по поводу глубокого знания, но мне кажется, что правильней выбирать человека который может пользоваться тем набором знаний которые у него уже есть.
Мы не в сферическом офисе работаем. Рядом работают люди, которые пользуются своим набором знаний того, что у них есть. И люди прежде всего люди, они совершают ошибки, они где-то чересчур усложняют. Важно уметь это читать, ошибки же трудно искать не зная языка хорошо.

zg (инкогнито)
12 декабря 2011, 07:39

тема использования std::vector в embedded програмировании не раскрыта на странице 369.

warmland.ru (warmland.ru)
13 декабря 2011, 02:08, ответ предназначен bolk (bolknote.ru):

Мне интересно как они этот вывод делают.
Я пока читал слайды, с ужасом представил человека, который всеми этими знаниями активно пользуется при написании кода. То есть активно полагается на все эти соглашения.

bolk (bolknote.ru)
13 декабря 2011, 07:04, ответ предназначен warmland.ru:

«Си» другой язык, язык другого поколения, он не «помогает» программировать. Когда он был придуман никто не приходил в ужас от этого. И даже много позже программисты ещё находили прелесть в знаниях такого рода. Думаю, что закат языка Перл произошёл из-за этой тендеции — тенденции к упрощению, к переходу на «дружественные» языки, которые не позволяют программисту совершить распространённые ошибки.

Например, Пайтон не позволит сделать присваивание в условии. «if a=b: pass» вызовет синтаксическую ошибку. «Гоу» не даст создать функцию без возвращаемого значения (все ветвления так же учтутся).

Тем не менее, любой язык надо знать в подробностях. Это просто выгодно. «Побеждает сильнейший», а хорошее знание языка позволит быстрее найти ошибку и даже, иногда, её «почувствовать», позволяет быстро разобраться в сложном коде, в чужом коде, в плохом коде. Я предпочту такого программиста.

Например, в приведённых слайдах, если бы программа в debug компилировалась, а в обычном режиме начала чудить, девочка из слайда, взглянув на код, сразу бы поняла, что речь идёт об неинициализированной переменной и даже знала бы почему в debug этого не происходила, мальчик же оттуда же, начал трассировать программу или занулять всё подряд, т.е. его скорость решения проблемы была бы ниже.

warmland.ru (warmland.ru)
13 декабря 2011, 23:16, ответ предназначен bolk (bolknote.ru):

Например, Пайтон не позволит сделать присваивание в условии. «if a=b: pass» вызовет синтаксическую ошибку. «Гоу» не даст создать функцию без возвращаемого значения (все ветвления так же учтутся).
Наверное, за этим будущее. Программная инженерия и так сложная штука, за исторически сложившиеся трудности держаться незачем.
«Побеждает сильнейший», а хорошее знание языка позволит быстрее найти ошибку и даже, иногда, её «почувствовать», позволяет быстро разобраться в сложном коде, в чужом коде, в плохом коде. Я предпочту такого программиста.
Я надеюсь, что у вас молчаливо предполагается, что хорошее знание языка используется, чтобы понимать такой код, как в слайдах, а не писать его. Хотя job security, наверное, — это тоже неплохо.

Я с вами согласен, но если бы я захотел озвучить мысль о том, что глубокое знание языка важно, я бы десять раз оговорился, что оно важно при прочих равных.

Agonych (инкогнито)
14 декабря 2011, 06:43

Полностью согласен. Аналогия с молотком не уместна. Программист не гвозди забивает, он программы делает. Это в разы более сложная задача и к ней гораздо выше требования. Вы же не согласитесь учиться у врача, который умеет только горчичники ставить и температуру мерить? Или у того, кто выучил только половину болезней, а про другую половину и не слыхал? Я видел достаточно программистов, которые не только не помогали, а вообще мешали работе, потому что сначала им нужно было все объяснять, потом проверять и перепроверять, потом переделывать самому. По логике вещей это не я долежн таким программистам платить, а они - мне.

Vladimir Moskva (fulc.ru)
14 декабря 2011, 20:53

Насколько часто встречаются люди, глубоко знающие язык, но не умеющие применять эти знания?

Я тоже еще раз повторюсь, что (по-моему) посредственное знание инструмента -- один из наиболее важных возможных недостатков программиста. Исключение - рассматриваемая область не основная для него, или он начал ее изучать сравнительно недавно. Но если несколько лет кодить на си, и не знать, в каких случаях переменная инициализируется нулем, а в каких - мусорным значением, то мало чем можно оправдаться.

zg (инкогнито)
15 декабря 2011, 00:53

Но если несколько лет кодить на си, и не знать, в каких случаях переменная инициализируется нулем, а в каких - мусорным значением, то мало чем можно оправдаться.
ролик про embedded программирование. а там:
1. может быть кастомный стартап, который ложил болт на стандарты, и производит инициализацию так, как удобнее.
2. может быть кастомный скрипт линковщика с аналогичным поведением.
3. глобальные и статические переменные могут быть запрещены. тут вообще далеко ходить не надо — в симбиан версий до 9 было именно так.

Vladimir Moskva (fulc.ru)
15 декабря 2011, 03:26, ответ предназначен zg

ролик про embedded программирование
Что за ролик?
1. может быть кастомный стартап, который ложил болт на стандарты, и производит инициализацию так, как удобнее.
2. может быть кастомный скрипт линковщика с аналогичным поведением.
3. глобальные и статические переменные могут быть запрещены. тут вообще далеко ходить не надо — в симбиан версий до 9 было именно так.
Если программист использовал другой инструмент, то он может не разбираться в исходном. Но тогда нечего позиционировать себя как C/C++ программист.

zg (инкогнито)
15 декабря 2011, 03:43, ответ предназначен Vladimir Moskva (fulc.ru):

Что за ролик?
презентация, ссылка в посте.
Если программист использовал другой инструмент
какой, другой?

zg (инкогнито)
15 декабря 2011, 03:44, ответ предназначен Vladimir Moskva (fulc.ru):

презентация, ссылка в посте.
страница 4, первое предложение.

Рома (инкогнито)
15 декабря 2011, 12:32

С++ очень громоздкий язык. С огромным числом тонкостей. И эти тонкости необходимо знать чтобы программировать. Эта презентация - антирекламма языка.
Всегда было любопытно кому он уступит свою современную нишу.

Воробьев Дмитрий aka VoDmAl (vorobyev.name)
15 декабря 2011, 23:23

Спасибо, отличная pdf-ка!!! Погрузился в мир C++, к удивлению многие нюансы до сих пор помню, хотя не пишу на нем более 8 лет.

bolk (bolknote.ru)
16 декабря 2011, 08:17, ответ предназначен Воробьев Дмитрий aka VoDmAl (vorobyev.name):

Вот ещё хорошая ссылка по Cи++, если ещё не читаете: http://alenacpp.blogspot.com/search/label/cpp

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)