Вопрос «как достигнуть высокого уровня профессионального совершенства и что для этого нужно» мучил меня последние 20 лет. Помимо чтения-перечтения правильных книг, изучения исходников правильных программ и периодического ныряния в Computer Science — приходилось постоянно общаться с разными коллегами из разных подсфер разработки.
С «чисто» разработчиками «головного мозга» становилось довольно быстро скучно, т.к. часто оказывалось, что движение к цели (проекта, ТЗ) является каким-то побочным, а главное — это процесс и нужно, уподобляясь бюрократам, религиозным сектантам и экспертам по багам русского языка — изучать тонкости работы интерпретатора-компилятора и чем больше ты знаешь всякой мусорной хрени, рожденной хаосом, тем круче. Ощущение, что нейроны мозга проросли друг в друга, запутались и отсохли, создав пульсирующее кольцо презрения к красоте и простоте — не покидало.
С «чисто» менеджерами «головного мозга» было тоже не очень весело. Да да, конечно в данном случае основной целью было сделать проект в срок, но возникающие в момент технических и аналитических сложностей и преодоления рисков эмоции и психозы с желанием найти виноватых в багах и подсознательным шантажом, с целью взять на себя ответственность за сроки, навязываемые сверху и откровенным наплевательством на техническое совершенство — приводили к мысли, что настоящие менеджеры все таки должны быть такими же профессионально развитыми, как и разработчики, нередко решающие сложные головоломные задачи, дебажа код и ночами и выходными. Но от менеджера, конечно, требуется гораздо больше именно человеческих качеств: храбрости, ясности, уверенности и умения мотивировать.
Но, к счастью, такие «чистые» случаи довольно редки, а в условиях потока проектов и дедлайна через довольно короткое время в командах остаются настоящие бойцы — и вот именно в коммуникациях с ними и в активной проектной работе таки начали постепенно формироваться правильные ответы на поставленные в начале поста ребром вопросы.
И, как же полезно какое-то время посидеть на поддержке кода… особенно своего! Когда широко открытыми глазами видно, как горе от ума («зачем делать просто если можно сложно?») и попытки разработчика (возможно тебя) слышать только себя и самоутвердиться — рождают кровоточащие в поддержке и развитии чудовища, которые и пристрелить уже нельзя, и кормить — опасно для жизни.
Итак, вот такие ответы на вопросы у меня сформировались и я готов ими поделиться.
Вопрос: какие языки программирования изучать в первую очередь?
Вопрос устарел! :) Если у вас нет цели получать удовольствие от процесса и зарплату за строки кода и троллить реальность, запутывая окружающих в глубине собственных знаний багов компиляторов/интерпретаторов, т.е. если вы не Чудак (лишнюю букву заменить) — то языки уже не нужно прямо сидеть и изучать. Сейчас существует плеяда языков, которые учатся буквально за несколько дней и позволяют быстро решать поставленные бизнес-задачи с хорошим качеством. Для веба тут несомненный лидер — PHP, для machine learning/deep learning тут прекрасно себя показывает лаконичный Python, а для бэкэнд-сервисов можно начать с быстрого решения задачи на том же PHP/Python/Ruby/Go/Node.js, а закончить (по опыту «заканчивать» приходится в 0.1% случаев) на более громоздких и низкоуровневых языках: Java/C#/C++.
Вопрос: какие алгоритмы нужно изучать в первую очередь?
Вы не поверите, но алгоритмы из Computer Science — часто являются контринтуитивными и разрушающими сознание и сколько бы вы их не изучали и не запоминали — вы их забудете после хорошего отпуска, только если вы не гений на пути к нобелевке. Максимум, что нужно знать для начала, так это то, что кроме встроенных в язык функций сортировки, есть еще, как там ее… сортировка «пузырьком» — но про нее нужно сразу забыть, т.к. есть более эффективные методы сортировки, описанные в книгах, которые можно прочитать на пенсии (я честно прочитал не один раз Сэджвика), но гораздо полезнее — знать, как называется библиотечная функция сортировки в языке и использовать ее.
![](https://habrastorage.org/web/ece/457/af9/ece457af9e444130969a3faf10f86e3d.jpg)
Не нужно знать принципы работы двигателя внутреннего сгорания, чтобы хорошо управлять автомобилем и получать наслаждение от жизни! Не нужно знать тонкости работы виртуальных деструкторов, чтобы эффективно использовать СУБД с HTML-мордой и быстро решать бизнес-задачи с коротким time2market.
Аналогично следует подойти и к поиску и к деревьям и к теории графов и обработке строк. Скорее всего, это все уже реализовано в языке программирования оптимальным образом. А если вы до сих пор не знаете, что регулярные выражения это вершина айсберга теории конечных автоматов — забейте и расслабьтесь и учитесь лучше хорошо пользоваться регулярками. А если ВДРУХХХ нагрузочное тестирование после 10 лет успешной эксплуатации веб-проекта выявит неэффективность алгоритма — тогда и почитаете и заодно разберетесь с основами теории вычислительной сложности.
Гораздо интереснее, если говорить по Science — это покопаться в матстатистике, тервере, линейке чтобы понимать, о чем сейчас говорят в контексте deep learning. Поверьте, это гораздо интереснее, чем бесконечное колупание внутри машины Тьюринга.
Вопрос: стоит углубляться в реляционную алгебру и СУБД?
Обязательно и как можно скорее. Но прежде всего, стоит ощутить простую и красивую философию реляционной алгебры и сразу просмотреть, чего делать нельзя. Скорее всего, вы будете использовать СУБД для хранения и агрегации данных и вам будет потом гораздо проще разобраться с различными современными и иногда весьма полезными недоСУБД, которые устроены гораздо проще и примитивнее классики как по возможностям, так и по архитектуре.
Вопрос: стоит ли копаться в unix и операционной системе?
Если вы нагоФнокодите 50 строк на javascript, то Ктулху этого, скорее всего и не заметит. Но если вы перепутаете фундаментальные сетевые протоколы, как иногда путают IP с TCP — беды не миновать. Я думаю, что на изучение архитектуры операционной системы, bash, системных вызовов и сетевых протоколов и стандартов стоит потратить максимум доступного времени и вы не пожалеете. Язык «С» тоже следует прочувствовать, ну чтобы было понимание, что под капотом происходит у вас. Дело в том, что современные, особенно веб-проекты, требуют очень тесного взаимодействия и понимания тонкостей работы операционки, умения мониторить и понимать процессы, потоки, системные вызовы, знать в деталях TCP/http — это позволит вашему проекту и взлететь быстро, и работать правильно и долго.
Поэтому инвестируйте в изучение unix как можно больше времени — поверьте, это окупиться с лихвой и над вами перестанут смеяться бородатые дядьки, настраивающие nginx/apache/mysql с широко закрытыми глазами.
![](https://habrastorage.org/web/b2b/86a/6d3/b2b86a6d33a24b878da26015f23c5f15.jpg)
Не нужно быть геологом, чтобы покорять вершины! Не нужно зазубривать сортировку Шелла, чтобы сортировать данные форм :)
Вопрос: зачем писать модульные и интеграционные тесты к коду?
Вас обманули. Раньше, в эпоху популярных техник разработки на гране садомазохизма, когда языки были дырявыми и программы создавались годами — нужно было все что можно и нельзя покрывать автоматизированными тестами с примесью шизофрении. Сейчас это очень дорого, программы, а особенно веб-проекты, создаются на порядки быстрее, требования постоянно меняются — и единственная возможность чтобы проект работал правильно и долго — это «сразу писать правильно и без ошибок» (С) :-) Я не шучу. Вот как обычно это делают:
- Хорошенько думают, прежде чем писать код;
- Пишут аккуратно, ясно, модульно;
- Пишут на одном из лаконичных динамических языков со встроенными в синтаксис коллекциями и выразительными конструкциями (желательно функциональными), чтобы можно было визуально отследить поток выполнения программы на 99.99% (php, python, ruby, scala).
Но если вы таки, несмотря на предупреждения выше, полезли без особой нужды в низкоуровневые языки типа java и C# (и, упаси Бог, в С/C++) — вам придется писать модульные тесты, ибо вы начнете быстро на третий день запутываться в собственном коде, уложив монитор на пол и ползая по нему с лупой на четвереньках и падать, иногда, на окруживших героя коллег :) Низкоуровневые языки хороши для отдельных сервисов и узких задач и в условиях достаточного количества времени и людей и департамента тестирования — показывают себя с лучшей стороны.
Иногда, правда, в больших и сложных проектах, хорошо помогают функциональные тесты. В Битрикс24, автоматизированном изнутри исключительно на bash/php, у нас несколько сот таких вот тестов и они оправдывают потраченное на них время.
Вопрос: а стоит ли писать ТЗ и углубленно проектировать?
Это философский вопрос :) В веб-проектах его обычно пишут, но требования часто начинают сразу меняться, поэтому совет простой: пусть ТЗ пишут менеджеры и сами его и читают, а разработчикам следует выделить 2-3 дня на пытки с пристрастием экспертов в предметной области со стороны Заказчика. Проектирование в веб-разработке с желанием влезть в голову Клиенту и таки увидеть будущее развитие системы — это ключевой момент, влияющий на успех.
Вопрос: если языки изучать есть смысл только создателям компиляторов, то что же изучать то с пристрастием?
Изучайте стандартные библиотеки языка и возможности веб-технологий (например WebRTC). В PHP можно найти просто море коннекторов к стандартным и очень мощным оперсорсным библиотекам, в Python бонусом идут библиотеки для работы с тензорами и deep learning фреймворками, в java это библиотека коллекций и executor framework и т.п.
Также инвестируйте время в изучение фреймворков. В java есть целая библиотека этого добра — Spring/EE. В php есть ряд интересных и популярных веб-фреймворков. У python появилось несколько прекрасных фреймворков для машинного обучения и т.д.
Вопрос: так увлечение программированием это все таки добро или зло?
Конечно зло! :) Нужно научиться увлекаться эффективным и лаконичным решением задач с помощью имеющегося сейчас в избытке инструментария. Если задачку можно решить на bash — пишите на bash, если сходить в СУБД можно из PHP — берите его и используйте. Если для создания сайта с админкой есть готовые фреймворки — берите их и не страдайте садомазохизмом.
Написанный даже вами код, через 2-3 месяца, вы забудете и как бы вы не старались его хорошо запомнить, мозг будет сопротивляться и вы будете страдать. Поэтому самый простой способ получать удовольствие от разработки — использовать готовые и протестированные библиотеки и решать с их помощью задачи с МИНИМАЛЬНЫМ объемом своего, вылизанного по всем стандартам, кода.
Важно понять, что программировать научиться можно быстро, а вот выражать свои мысли ясно, лаконично и красиво в коде, следуя принципу «дурака работа любит» — очень трудно и именно этому следует учиться большую часть времени. Гораздо полезнее изучать готовые библиотеки от корки до корки и строить свои проекты на базе готовой алгоритмической алгебры, чем писать «все с нуля». А современный тренд по созданию лаконичных и немногословных языков с встроенными в синтаксис коллекциями для выражения собственных мыслей (php, python, kotlin, scala), нередко в функциональном стиле, подавляющих когнитивный шум от тяжеловесных конструкций — еще больше убеждает меня в этом!
Мир движется по пути упрощения, ясности и красоты. Компиляторы победили ассемблер. Лаконичные функциональные языки с многообразием библиотек — побеждают низкоуровневый садомазохизм по работе с памятью и «ООП головного мозга».
Коллеги, надеюсь мне удалось ответить на часть мучающих каждого из нас вопросов и советы будут полезны не только начинающим веб-разработчикам, но и более опытным и экспертам, ищущим пути самореализации. Всем удачи и хорошего настроения!
Комментарии (42)
Alexeyco
23.05.2017 18:23+8> Если вы нагоФнокодите 50 строк на javascript, то Ктулху этого, скорее всего и не заметит.
Битрикс должен сделать это девизом
den_golub
23.05.2017 18:34+7низкоуровневые языки типа java и C# (и, упаси Бог, в С/C++)
Ктулху забери автора к себе. / оффтопAlexSerbul
23.05.2017 18:46-8я и так в аду :-)
den_golub
23.05.2017 18:48+4нет серьезно, когда они стали низкоуровневыми?
AlexSerbul
23.05.2017 18:52-4Ну сравни python с java, разница то огромная пипец. Понятно, что C у нас низкоуровневый, а все остальное высокоуровневое — но как ты поставишь вместе PHP и C++?
den_golub
23.05.2017 19:02+1Ну уровень у них одинаковый, место применения разное, собственно php и появился как развитие под специфические задачи
В 1994 году датский программист Расмус Лердорф создал набор скриптов на Perl/CGI для вывода и учёта посетителей его онлайн-резюме, обрабатывающий шаблоны HTML-документов. Лердорф назвал набор Personal Home Page (Личная Домашняя Страница). Вскоре функциональности и быстроты Perl — интерпретатора скриптов — перестало хватать, и Лердорф разработал с использованием языка C новый интерпретатор шаблонов PHP/FI (англ. Personal Home Page / Forms Interpreter — «персональная домашняя страница / интерпретатор форм»)
AlexSerbul
23.05.2017 19:08-6Сборщик мусора у них, в отличие от C++, встроенный. Но java работает в разы быстрее из-за строгой типизации и ООП головного мозга. Зато у php динамическая типизация, удобная часто при разработке и встроенные коллекции. Они очень разные. Тут грань что считать высокоуровневым, а что низкоуровневым — размытая.
den_golub
23.05.2017 19:16+2Тут грань что считать высокоуровневым, а что низкоуровневым — размытая.
Вот —
Основная черта высокоуровневых языков — это абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания.
И вот —
Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах
Критерии очень даже понятныеAlexSerbul
23.05.2017 19:17Cи на каком уровне, по твоему?
flancer
24.05.2017 09:40+2Коллега, а вы пробовали ассемблер? Попробуйте, и тогда вопрос с С у вас отпадет, а разница между python и Java перестанет быть "пипец огромной"
horses
24.05.2017 10:39-1Это понятно. Но кто-нибудь сейчас будет писать сайт на ассемблере? Его даже на СИ писать не будут. Даже такие высоконагруженные сервисы, как ВК, работают на PHP, почему-то их не пишут на СИ и тем более на ассемблере.
den_golub
24.05.2017 10:52+1окститесь, у них немного разные сферы, никто и не просит сайты писать на си, для этого и придумали PHP чтоб жизнь упростить,
НО от этого они высокоуровневые языки, те которые автор привел в статье не станут низкоуровневыми, и наоборот тоже чуда не случится.
Так то попытка смешать мух и котлеты не очень удачная.
Или по Вашему все что не используется в вебе сразу низкоуровневое? ИМХО, но так то есть совсем специфичные высокоуровневые языке вообще не используемые в вебе никоим образом, но хотя возможно и могли бы там использоваться, и что они тоже становятся высокоуровневыми?
Вопрос изначально стоит не в том, на чем лучше писать сайты, а о том что деление некорректное на высоко- и низко- уровневые языки. Веб это не апогей разработки. тем более если разговаривать о нем в контексте кампании 1С-Битрикс.
horses
24.05.2017 11:36-1Деление на самом деле условное. Когда был ассемблер и си (условно), то все было понятно, какой низкоуровневый, какой высокий. Сейчас же границы очень сильно размыты. А так как статья о веб-разработке, то не веб языки можно считать условно низкоуровневыми (но опять же, это не точная, "научная" формулировка). Понятно, что это не соответствует классическим представлениям.
А написать сайт на си не представляет большой проблемы. И пишут какие-то специфичные вещи, с которыми не может справиться PHP.
AlexSerbul
24.05.2017 13:37-3Статья как раз для вас! Избегайте излишней формализации и цепляния к формулировкам, которые поросли паутиной еще 30 лет назад. Эти все вещи мне и не только мне давно известны, но мир меняется. Лучше размышлять уровнем абстракции/алгебры языков и тогда вы поймете, что Haskel с Erlang, частично, Scala, с, думаю Akka, вообще пипец на каком высоком уровне находятся. Раскрепостите сознание, не зацикливайтесь, прошу :-)
AlexSerbul
24.05.2017 13:39-3И, продолжая тему, выбирая правильный язык = алгебру = уровень абстракции и выразительности — вы меняете на порядок вероятность успешности проекта.
А веб, уверен, это вершина сейчас в мире разработки. Почти все делается для него и он направляет индустрию, как бы нам не хотелось не признавать это и углубиться в совершенствование компилятора какого нить
qMBQx8GH
24.05.2017 10:55+2Сборщик мусора у них, в отличие от C++, встроенный.
Вот не помню когда последний раз писал new/delete в C++ ))AlexSerbul
24.05.2017 13:41-2Макс, ну потому что ты реально очень крут и делаешь сразу правильно. А я дальше учебников и Страуструпа C++ не видел и вот это выделение памяти и ошибки возможные — очень волнуют :-)
AlexSerbul
23.05.2017 19:12-5наверно самое большое отличие у них в типизации. Если в php одна динамическая и нестрогая и интерпретатор, то в java — статическая и строгая и все сначала компилируется. Хотя потом да, выполняется и там и там в виртуальной машине.
dgstudio
23.05.2017 18:42+9Про тесты ты по-прежнему не прав :) Тесты пишут не для того, чтобы проверить, хорошо ли работает код. Тесты пишут для того, чтобы если через два года десятый по счету менеджер и пятнадцатый программист сломают какую-то фундаментальную штуку в бизнес-логике — это было бы видно СРАЗУ.
den_golub
23.05.2017 18:44+2В дополнение скажу если еще писать нормальные комментарии, то и сам вернувшись через год-другой проекту есть шанс вспомнить что к чему.
AlexSerbul
23.05.2017 18:45-6и ты продолжаешь верить, что тесты выявят СРАЗУ любую ошибку через 5 лет и для этого стоит их поддерживать все это время? :-)
Alexeyco
23.05.2017 20:57+1Фундаментальная ошибка. Может быть, вместо того, чтобы убеждать их в том, что юниттесты не для идиотов, убедить, что и ремни безопасности в машине — тоже для дураков?
j_wayne
23.05.2017 23:57А я еще тесты пишу, потому что лень прокликивать странички вручную.
А потом еще и тест остается на случай регрессии. Двойная выгода…
horses
24.05.2017 10:42Разные программисты пишут тесты для разных целей. Кто-то пишет, чтобы через множество итераций разными программистами проверить, что все работает так же. Кто-то пишет для того, чтобы в ходе разработке проверять, что затрагиваемый, но уже реализуемый функционал не изменил логику поведения, не "сломался".
Кто-то уверен в себе и плюет на тесты )))
xcono
23.05.2017 22:31-3Учите jQuery, а не javascript.
Но все же, кажется, это все добрая шутка, т.к. про тесты как-то толсто вышло.
hardtop
23.05.2017 23:10+1Сначала отнёсся скептически, а потом узрел здоровый скепсис и легкое накидывание на вентилятор.
В принципе, можно сказать, что для веба сейчас важнее не выбор языка программирования, а умение правильно писать. Или, возможно, правильно заниматься раскруткой/поддержкой.
Bandicoot
24.05.2017 13:21-1Я не знаю алгоритмы, хотя несколько раз предпринимал попытки их изучить и вообще не пишу тестов. Паттерны проектирования в лучшем случае могу объяснить на словах, и то с предварительной подготовкой.
Но это не мешает мне зарабатывать на жизнь исключительно веб-разработкой. При всей косячности Битрикса, в статье прозвучали здравые мысли. В первую очередь я стремлюсь писать простой и поддерживаемый код — KISS, DRY, YAGNI для меня знакомые аббревиатуры. Также для меня важно подробно изучить инструменты и технологии, с которыми приходится работать, возможности стандартных библиотек.
den_golub
Так вот он главный принцип разработчиков системы 1С-Битрикс. /оффтоп
Dimash2
Чтобы управлять автомобилем как профессиональный пилот — надо знать принципы работы двигателя внутреннего сгорания )
AlexSerbul
Зачем? :-) Жми на газ и вперед.
Dimash2
Чтобы доехать до финиша )
den_golub
Если это спринт по прямой то и так сойдет
Dimash2
Вы видели соревнования по Драгу? О чем спор ) Взорвете двигатель )
den_golub
Это если обороты не держать в пределе, тогда да.
AlexSerbul
Да я изучил ДВС вдоль и поперек, а на практике беру либо и использую в 99.9% случаев. И нахрена я несколько лет копал Somputer Science с пристрастием? :-)
noodles
Но больше принцип работы трансмиссии, подвески и тормозов. У мотора задача тупая и понятная по сравнению с перечисленными системами)
horses
Вы, видимо, профессиональный пилот? Тогда почему в профессиональных гоночных командах куча профессиональных техников, помощников и пилоту остается задача только "рулить". Не такая уж и простая задача. Но пилоту важно знать какие обороты, какой крутящий момент у него, пик, минимум. Ему нужно знать развесовку и чувствовать ее. Но информация о принципе работы двигателе ему особо то и не нужна. Или, вы думаете, если профессиональный гонщик сядет за машину с роторным двигателем или с электродвигателем: он сразу будет хуже ехать без детального знания принципа работы привода? Ему достаточно знать как этот двигатель тянет, как едет. Т. е. внешние проявления, но не внутрянка.
Dimash2
Чувствуете разницу между принципами и детальными знаниями?
horses
И как в гонке поможет знание общих принципов?