Блог


Профессионализм в программировании. Хорошо ли это.

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

Но не торопитесь. Давайте разберемся по порядку. 

Что есть профессионализм? Обратимся к кладези знаний - Википедии.

Профессионализм — особое свойство людей систематически, эффективно и надёжно выполнять сложную (профессиональную) деятельность в самых разнообразных условиях.

При этом под профессиональной деятельностью понимается сложная деятельность, которая предстает перед человеком как конституированный способ выполнения чего-либо, имеющий нормативно установленный характер. Профессиональная деятельность является объективно сложной, поэтому она трудна для освоения, требует длительного периода теоретического и практического обучения.

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

Вернемся к конкретике, собственно к программированию.

Допустим такой момент. Как то давненько попадались на глаза тестовые вопросы собеседования на вакансию в Google. Запомнился один очень показательный. Не ручаюсь за точность, помню смысл.

Вы профессиональный шифровальщик и у вас задача узнать, правильно ли у вашего друга записан номер вашего телефона. Вы просите подругу передать ему записку. Что нужно в ней написать, что бы она не смогла узнать этот номер?

Ответьте сами, прежде чем прочитаете ответ. Это поможет понять уровень вашего профессионализма.

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


Абсурд? А вот и нет. Если это касается программирования.

Давайте рассмотрим пример из кодинга. Как вы обычно при регистрации проверяете введенные пользователем данные на соответствие E-Mail? Совершенно "профессиональный" программист ответит - зачем изобретать велосипед, нужно юзать фреймворк, там давно все проверки реализованы в валидаторе. Чуть менее "профессиональный" ответит - есть специальная функция или на крайний случай регуляркой. А полный профан и непрофессионал спросит: а зачем вообще проверять?

Ну если на клиенте, оно оправдано. Это подсказка пользователю. А вот для чего на сервере? Опять таки профессионал возмутится - да как же так? А вдруг введут что-то не то совсем?

А теперь крамола - ну и что? Какое наше дело, что он там введет. Наше дело - безопасность приложения, а она ничего общего с маской e-mail не имеет. Ну пусть вводит, ему с этим жить. Если действительно важно проверить, действующее ли мыло, нужно запрашивать подтверждение отправкой письма. Иначе все эти проверки - лишняя трата ресурсов и нервов.

Так вот, такой подход будет считаться непрофессиональным. Хотя он наиболее логичен, рационален, прост и очевиден, как в случае с телефоном и бумажкой. Ведь любая проверка несовершенна и может "забанить" вполне валидный e-mail. Вы в курсе, что RFC допускает такой адрес:

"my electronic address"@mail.ru?

а допустим какой-нибудь валидный, но несуществующий адрес

sdgsrhjkul6wqwdXAEG67Ksdfdhrwqweamtultyulkt@dsdsg.ru

мы посчитаем верным и допустимым.

 Все объясняется просто. "Профессионалом" последнее время считается тот, кто больше всех прочитал "умных книжек", а не тот, кто вдумчиво и кропотливо подходит к реализации приложения. Другими словами - впереди теоретик, знающий крутые слова "паттерн", "покрытие тестами", "диаграмма классов" и прочую муть, а не практик, которому важно юзабилити, быстродействие и простота. Программист, использующий принцип KISS, все меньше и меньше котируется как профессионал. А вот книжки зачастую пишут чистой воды теоретики. И они почему то решают, что нужно проверять email на соответствие, запрашивать повтор пароля и подобные штучки, больно бьющие по юзабилити. Нужно же что-то писать в книгах, иначе за что получать гонорар...

В теории, теория и практика неразделимы. На практике это не так.
© Yoggi Berra


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

1
 2
 3

    $page
Yii::app()->request->getQuery('page'null);

Увидишь, прослезишься и преисполнишься уважением - дааа! Сей код писан профессионалом. А вот это считается высшей степенью говнокодинга:

1
 2
 3

    $page
= @$_POST['page'];

Но давайте оставим в покое пафос и разберемся, почему собственно? Результат совершенно одинаков, кода намного меньше и он на порядок прозрачнее. Такая инициализация универсальна, не требует определенного фреймворка. Работает намного быстрее даже тернарной операции. Так почему? 

Как видно, совершенство достигается не тогда, когда уже нечего прибавить, но когда уже ничего нельзя отнять.
© Antoine de Saint-Exupéry

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

Измерять продуктивность программирования подсчетом строк кода — это так же, как оценивать постройку самолета по его весу.
© Bill Gates

Еще не достаточно? Давайте дальше.

Очень частая реализация автолоада классов (это квинтэссенция, только суть):

1
 2
 3
 4
 5
 6
 7
 8
<?php

function __autoload($className

       if(
file_exists($className '.php')){ 
           require_once 
$className '.php'
       } 
 }


Для чего тут проверка? Разработчик так не уверен в собственном приложении, боится что классы разбегутся под покровом ночи? Ну ладно, паранойя. Бывает. Только мне не ясен профит этого. Ну нет файла, require выкинет fatal error и все на том. Для чего проверять его наличие? Причем в пустоту - функция все равно ничего не возвращает.

Это кстати касается не только автолоада, такие проверки встречаются повсеместно в "профессиональных" кодах. Может быть я не в той вселенной живу, но у меня не было ни одного случая пропажи файла из рабочего приложения. Но даже если предположить, что он пропал, это видно в логах. А такая проверка в лог ничего не напишет. А значит нужно задуряться с ексепшенами и так далее, хотя в самой конструкции require есть все необходимое.

Это чистой воды перестраховка, но зато это выглядит ну о-о-очень профессионально.

Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
© Brian W. Kernighan.

Очень часто складывается ощущение, что код усложняется специально. Для того, чтобы потом бить себя кулаком в грудь - я "профессионал" и дилетантам с моим кодом делать нечего! Вспомним про паттерн "цепочки вызовов". Удобная штука, ничего не скажешь.

1
 2
 3

    $validation
->value($myvar)->required()->isInt()->execute();



 Если использовать с умом, то выгоды очевидны - код оптимален, не перегружен, чист и светел. 

 Однако частенько этот паттерн доводят до абсурда, выстраивая цепочки из различных объектов. И тогда это сущий ад, особенно при слабой документированности. Однако "профессионал" доволен - раз никто не может разобраться в его коде, значит они все слабаки, а он Д'артаньян. И смотрит свысока на тех, кто пишет просто, легко и интуитивно понятно. Говнокодеры, не умеют завернуть трехэтажного пятистопного ямба. Фи. 

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

Это по человечески понятно - все хотят кушать и разработчики фреймворков не исключение. Но вот тех, кто пишет подобной орнаментальной вязью обыкновенный продакшен я не понимаю.

Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
© Martin Golding

 Таких примеров "профессионализма" пруд пруди. У меня устойчивое ощущение, что многие "профессионалы" еще не наигрались. Я помню ту эйфорию, когда написал первый скрипт на продажу. Блин! Мне за это еще и деньги будут платить? С ума сойти. Да я сейчас вам такого понаварочаю, все сразу поймут, что я ацкий прогер! Сейчас за это даже немножко стыдно. 
Особенно умиляет, когда "профессионалы", наворотив тонны кода с километровыми веревками наследований и разных паттернов, потом с умным видом заявляют: ну и что, что тормозит. А вот мы сейчас мемкеш, акселератор и еще кучу приблуд навешаем и все залетает! Да, да. Успокойся. Все уже поняли, что ты крут и знаешь такие взрослые слова. Только ответь, на секунду задумавшись. А всегда ли стоит так все усложнять, чтобы потом разгребать завалы всякими приблудами? Не проще ли сразу писать оптимальный код, пусть даже в ущерб расширяемости? Ведь если это сайт-визитка, вероятность того, что он когда-либо будет интегрирован с 1С бухгалтерией очень близка к нулю. Так для чего тогда ради трех страниц вешать на него Битрикс?

Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали
© Народное

И вот еще что:

Любой "профессионал" новой формации однозначно вам заявит - не нужно изобретать велосипедов, все давно придумано и есть в Гугле. Даже термин специальный придумали - антипаттерн. Писать собственные реализации непрофессионально, так как бажно и времязатратно. Хорошо, согласимся. Только один маленький вопросик: а кто же пишет те самые крутые решения, если профессионал не должен сам изобретать колеса? Логично предположить, что их изобретают непрофессионалы? То есть профессионал должен пользоваться решениями дилетантов и нубов. Смешно.

Когда я вижу человека на велосипеде, я не боюсь за будущее человечества
© Марк Твен



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

А вот истинное мастерство - написать три строчки кода, но чтобы они работали не хуже целого фреймворка. Таких мало...

Чувствуется рука мастера!
© Сомнительный комплимент карманнику.

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

Просто задумайтесь, а всегда ли оправдано "профессиональное" усложнение кода. И не бросайтесь всуе фразами "это непрофессионально", ибо с такой тенденцией слова "профессионализм" и "индуаизм" уже становятся синонимами.

Сначала учите науку программирования и всю теорию. Далее выработайте свой программистский стиль. Затем забудьте все и просто программируйте.
© George Carrette

Николай aka twin




Теги: Флейм

Комментарии (6)

killervampire
24-08-2013
РНР - это строительный материал (кирпичи, вода, цемент ...) позволяет строить от собачей будки до ЗЕМНОГО ШАРА, ФРЕЙМВОРК - это ("ПАНЕЛЬКА") - коих настроили в начале 70-тых а сейчас разгребают это (дер....мо) и не знают что с ним делать..... Статья супер!!!!
akuchkovsky
24-08-2013
Полностью согласен с Вами, все это черпнул работая в Веб-студии, где все крутые Битриксоиды. Прошел уже год и ни один даже свой компонент не написал, не говоря уже о модулях, все как по шаблону, так и пишут свой крутой говнокод
Ушел от них с облегчением души и не пожалел!
Спасибо Вам большое, пишите побольше уроков и статей!
Alex
28-08-2013
Всё так и есть как написали. Иногда когда вижу что нет проверок данных в коде, сразу начинаю возвышаться над тем человек который писал.. считая что он лох. Но потом вникаю и понимаю - нахрена тут проверки.
Rud
29-08-2013
Спасибо Николай за еще одну замечательную статью, в каждый раз когда я читаю ваш блог я безумно радуюсь что вы есть и что я вас знаю.
Виктор
29-08-2013
Давно знаю и пользуюсь этим ресурсом. Не преувеличивая хочу сказать что Николай большого ума и такта человек. Сам я не программист и уже навряд ли им стану,но читать те скрипты,уроки,разъяснения и т.д. которые исходят от Николая -большое удовольствие.
Я рад что мне довелось с ним заочно познакомиться и после этого читая или разучивая чужие скрипты,я поневоле думаю: "как бы на это отреагировал tvin"
Удачи по жизни и побольше пишите чтобы было у нас меньше ошибок.
Илья
08-10-2013
честно скажу херня


 
Наверх