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

Вопрос «как достигнуть высокого уровня профессионального совершенства и что для этого нужно» мучил меня последние 20 лет. Помимо чтения-перечтения правильных книг, изучения исходников правильных программ и периодического ныряния в Computer Science — приходилось постоянно общаться с разными коллегами из разных подсфер разработки.

С «чисто» разработчиками «головного мозга» становилось довольно быстро скучно, т.к. часто оказывалось, что движение к цели (проекта, ТЗ) является каким-то побочным, а главное — это процесс и нужно, уподобляясь бюрократам, религиозным сектантам и экспертам по багам русского языка — изучать тонкости работы интерпретатора-компилятора и чем больше ты знаешь всякой мусорной хрени, рожденной хаосом, тем круче. Ощущение, что нейроны мозга проросли друг в друга, запутались и отсохли, создав пульсирующее кольцо презрения к красоте и простоте — не покидало.

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

Но, к счастью, такие «чистые» случаи довольно редки, а в условиях потока проектов и дедлайна через довольно короткое время в командах остаются настоящие бойцы — и вот именно в коммуникациях с ними и в активной проектной работе таки начали постепенно формироваться правильные ответы на поставленные в начале поста ребром вопросы.

И, как же полезно какое-то время посидеть на поддержке кода… особенно своего! Когда широко открытыми глазами видно, как горе от ума («зачем делать просто если можно сложно?») и попытки разработчика (возможно тебя) слышать только себя и самоутвердиться — рождают кровоточащие в поддержке и развитии чудовища, которые и пристрелить уже нельзя, и кормить — опасно для жизни.

Итак, вот такие ответы на вопросы у меня сформировались и я готов ими поделиться.

Вопрос: какие языки программирования изучать в первую очередь?

Вопрос устарел! :) Если у вас нет цели получать удовольствие от процесса и зарплату за строки кода и троллить реальность, запутывая окружающих в глубине собственных знаний багов компиляторов/интерпретаторов, т.е. если вы не Чудак (лишнюю букву заменить) — то языки уже не нужно прямо сидеть и изучать. Сейчас существует плеяда языков, которые учатся буквально за несколько дней и позволяют быстро решать поставленные бизнес-задачи с хорошим качеством. Для веба тут несомненный лидер — PHP, для machine learning/deep learning тут прекрасно себя показывает лаконичный Python, а для бэкэнд-сервисов можно начать с быстрого решения задачи на том же PHP/Python/Ruby/Go/Node.js, а закончить (по опыту «заканчивать» приходится в 0.1% случаев) на более громоздких и низкоуровневых языках: Java/C#/C++.

Вопрос: какие алгоритмы нужно изучать в первую очередь?

Вы не поверите, но алгоритмы из Computer Science — часто являются контринтуитивными и разрушающими сознание и сколько бы вы их не изучали и не запоминали — вы их забудете после хорошего отпуска, только если вы не гений на пути к нобелевке. Максимум, что нужно знать для начала, так это то, что кроме встроенных в язык функций сортировки, есть еще, как там ее… сортировка «пузырьком» — но про нее нужно сразу забыть, т.к. есть более эффективные методы сортировки, описанные в книгах, которые можно прочитать на пенсии (я честно прочитал не один раз Сэджвика), но гораздо полезнее — знать, как называется библиотечная функция сортировки в языке и использовать ее.


Не нужно знать принципы работы двигателя внутреннего сгорания, чтобы хорошо управлять автомобилем и получать наслаждение от жизни! Не нужно знать тонкости работы виртуальных деструкторов, чтобы эффективно использовать СУБД с HTML-мордой и быстро решать бизнес-задачи с коротким time2market.

Аналогично следует подойти и к поиску и к деревьям и к теории графов и обработке строк. Скорее всего, это все уже реализовано в языке программирования оптимальным образом. А если вы до сих пор не знаете, что регулярные выражения это вершина айсберга теории конечных автоматов — забейте и расслабьтесь и учитесь лучше хорошо пользоваться регулярками. А если ВДРУХХХ нагрузочное тестирование после 10 лет успешной эксплуатации веб-проекта выявит неэффективность алгоритма — тогда и почитаете и заодно разберетесь с основами теории вычислительной сложности.

Гораздо интереснее, если говорить по Science — это покопаться в матстатистике, тервере, линейке чтобы понимать, о чем сейчас говорят в контексте deep learning. Поверьте, это гораздо интереснее, чем бесконечное колупание внутри машины Тьюринга.

Вопрос: стоит углубляться в реляционную алгебру и СУБД?

Обязательно и как можно скорее. Но прежде всего, стоит ощутить простую и красивую философию реляционной алгебры и сразу просмотреть, чего делать нельзя. Скорее всего, вы будете использовать СУБД для хранения и агрегации данных и вам будет потом гораздо проще разобраться с различными современными и иногда весьма полезными недоСУБД, которые устроены гораздо проще и примитивнее классики как по возможностям, так и по архитектуре.

Вопрос: стоит ли копаться в unix и операционной системе?

Если вы нагоФнокодите 50 строк на javascript, то Ктулху этого, скорее всего и не заметит. Но если вы перепутаете фундаментальные сетевые протоколы, как иногда путают IP с TCP — беды не миновать. Я думаю, что на изучение архитектуры операционной системы, bash, системных вызовов и сетевых протоколов и стандартов стоит потратить максимум доступного времени и вы не пожалеете. Язык «С» тоже следует прочувствовать, ну чтобы было понимание, что под капотом происходит у вас. Дело в том, что современные, особенно веб-проекты, требуют очень тесного взаимодействия и понимания тонкостей работы операционки, умения мониторить и понимать процессы, потоки, системные вызовы, знать в деталях TCP/http — это позволит вашему проекту и взлететь быстро, и работать правильно и долго.
Поэтому инвестируйте в изучение unix как можно больше времени — поверьте, это окупиться с лихвой и над вами перестанут смеяться бородатые дядьки, настраивающие nginx/apache/mysql с широко закрытыми глазами.


Не нужно быть геологом, чтобы покорять вершины! Не нужно зазубривать сортировку Шелла, чтобы сортировать данные форм :)

Вопрос: зачем писать модульные и интеграционные тесты к коду?

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

  • Хорошенько думают, прежде чем писать код;
  • Пишут аккуратно, ясно, модульно;
  • Пишут на одном из лаконичных динамических языков со встроенными в синтаксис коллекциями и выразительными конструкциями (желательно функциональными), чтобы можно было визуально отследить поток выполнения программы на 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)


  1. den_golub
    23.05.2017 18:09
    +14

    Не нужно знать принципы работы двигателя внутреннего сгорания, чтобы хорошо управлять автомобилем и получать наслаждение от жизни! Не нужно знать тонкости работы виртуальных деструкторов, чтобы эффективно использовать СУБД с HTML-мордой и быстро решать бизнес-задачи с коротким time2market.

    Так вот он главный принцип разработчиков системы 1С-Битрикс. /оффтоп


    1. Dimash2
      23.05.2017 18:22
      +2

      Чтобы управлять автомобилем как профессиональный пилот — надо знать принципы работы двигателя внутреннего сгорания )


      1. AlexSerbul
        23.05.2017 18:23

        Зачем? :-) Жми на газ и вперед.


        1. Dimash2
          23.05.2017 18:33
          +1

          Чтобы доехать до финиша )


          1. den_golub
            23.05.2017 18:34

            Если это спринт по прямой то и так сойдет


            1. Dimash2
              23.05.2017 18:43
              +1

              Вы видели соревнования по Драгу? О чем спор ) Взорвете двигатель )


              1. den_golub
                23.05.2017 18:46

                Это если обороты не держать в пределе, тогда да.


              1. AlexSerbul
                23.05.2017 18:54
                -8

                Да я изучил ДВС вдоль и поперек, а на практике беру либо и использую в 99.9% случаев. И нахрена я несколько лет копал Somputer Science с пристрастием? :-)


      1. noodles
        23.05.2017 23:51
        +2

        Но больше принцип работы трансмиссии, подвески и тормозов. У мотора задача тупая и понятная по сравнению с перечисленными системами)


      1. horses
        24.05.2017 10:36
        -1

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


        1. Dimash2
          24.05.2017 15:31

          Чувствуете разницу между принципами и детальными знаниями?


          1. horses
            25.05.2017 10:52

            И как в гонке поможет знание общих принципов?


  1. Alexeyco
    23.05.2017 18:23
    +8

    > Если вы нагоФнокодите 50 строк на javascript, то Ктулху этого, скорее всего и не заметит.

    Битрикс должен сделать это девизом


  1. den_golub
    23.05.2017 18:34
    +7

    низкоуровневые языки типа java и C# (и, упаси Бог, в С/C++)


    Ктулху забери автора к себе. / оффтоп


    1. AlexSerbul
      23.05.2017 18:46
      -8

      я и так в аду :-)


      1. den_golub
        23.05.2017 18:48
        +4

        нет серьезно, когда они стали низкоуровневыми?


        1. AlexSerbul
          23.05.2017 18:52
          -4

          Ну сравни python с java, разница то огромная пипец. Понятно, что C у нас низкоуровневый, а все остальное высокоуровневое — но как ты поставишь вместе PHP и C++?


          1. 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 — «персональная домашняя страница / интерпретатор форм»)


            1. AlexSerbul
              23.05.2017 19:08
              -6

              Сборщик мусора у них, в отличие от C++, встроенный. Но java работает в разы быстрее из-за строгой типизации и ООП головного мозга. Зато у php динамическая типизация, удобная часто при разработке и встроенные коллекции. Они очень разные. Тут грань что считать высокоуровневым, а что низкоуровневым — размытая.


              1. den_golub
                23.05.2017 19:16
                +2

                Тут грань что считать высокоуровневым, а что низкоуровневым — размытая.

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


                И вот —
                Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах


                Критерии очень даже понятные


                1. AlexSerbul
                  23.05.2017 19:17

                  Cи на каком уровне, по твоему?


                  1. flancer
                    24.05.2017 09:40
                    +2

                    Коллега, а вы пробовали ассемблер? Попробуйте, и тогда вопрос с С у вас отпадет, а разница между python и Java перестанет быть "пипец огромной"


                    1. horses
                      24.05.2017 10:39
                      -1

                      Это понятно. Но кто-нибудь сейчас будет писать сайт на ассемблере? Его даже на СИ писать не будут. Даже такие высоконагруженные сервисы, как ВК, работают на PHP, почему-то их не пишут на СИ и тем более на ассемблере.


                      1. den_golub
                        24.05.2017 10:52
                        +1

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

                        Так то попытка смешать мух и котлеты не очень удачная.

                        Или по Вашему все что не используется в вебе сразу низкоуровневое? ИМХО, но так то есть совсем специфичные высокоуровневые языке вообще не используемые в вебе никоим образом, но хотя возможно и могли бы там использоваться, и что они тоже становятся высокоуровневыми?

                        Вопрос изначально стоит не в том, на чем лучше писать сайты, а о том что деление некорректное на высоко- и низко- уровневые языки. Веб это не апогей разработки. тем более если разговаривать о нем в контексте кампании 1С-Битрикс.


                        1. horses
                          24.05.2017 11:36
                          -1

                          Деление на самом деле условное. Когда был ассемблер и си (условно), то все было понятно, какой низкоуровневый, какой высокий. Сейчас же границы очень сильно размыты. А так как статья о веб-разработке, то не веб языки можно считать условно низкоуровневыми (но опять же, это не точная, "научная" формулировка). Понятно, что это не соответствует классическим представлениям.
                          А написать сайт на си не представляет большой проблемы. И пишут какие-то специфичные вещи, с которыми не может справиться PHP.


                        1. AlexSerbul
                          24.05.2017 13:37
                          -3

                          Статья как раз для вас! Избегайте излишней формализации и цепляния к формулировкам, которые поросли паутиной еще 30 лет назад. Эти все вещи мне и не только мне давно известны, но мир меняется. Лучше размышлять уровнем абстракции/алгебры языков и тогда вы поймете, что Haskel с Erlang, частично, Scala, с, думаю Akka, вообще пипец на каком высоком уровне находятся. Раскрепостите сознание, не зацикливайтесь, прошу :-)


                        1. AlexSerbul
                          24.05.2017 13:39
                          -3

                          И, продолжая тему, выбирая правильный язык = алгебру = уровень абстракции и выразительности — вы меняете на порядок вероятность успешности проекта.

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


              1. qMBQx8GH
                24.05.2017 10:55
                +2

                Сборщик мусора у них, в отличие от C++, встроенный.

                Вот не помню когда последний раз писал new/delete в C++ ))


                1. AlexSerbul
                  24.05.2017 13:41
                  -2

                  Макс, ну потому что ты реально очень крут и делаешь сразу правильно. А я дальше учебников и Страуструпа C++ не видел и вот это выделение памяти и ошибки возможные — очень волнуют :-)


            1. AlexSerbul
              23.05.2017 19:12
              -5

              наверно самое большое отличие у них в типизации. Если в php одна динамическая и нестрогая и интерпретатор, то в java — статическая и строгая и все сначала компилируется. Хотя потом да, выполняется и там и там в виртуальной машине.


  1. dgstudio
    23.05.2017 18:42
    +9

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


    1. den_golub
      23.05.2017 18:44
      +2

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


      1. AlexSerbul
        23.05.2017 18:45

        согласен, комментарии и ясные идеи в коде очень важны


    1. AlexSerbul
      23.05.2017 18:45
      -6

      и ты продолжаешь верить, что тесты выявят СРАЗУ любую ошибку через 5 лет и для этого стоит их поддерживать все это время? :-)


    1. Alexeyco
      23.05.2017 20:57
      +1

      Фундаментальная ошибка. Может быть, вместо того, чтобы убеждать их в том, что юниттесты не для идиотов, убедить, что и ремни безопасности в машине — тоже для дураков?


    1. j_wayne
      23.05.2017 23:57

      А я еще тесты пишу, потому что лень прокликивать странички вручную.
      А потом еще и тест остается на случай регрессии. Двойная выгода…


    1. horses
      24.05.2017 10:42

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


  1. xcono
    23.05.2017 22:31
    -3

    Учите jQuery, а не javascript.


    Но все же, кажется, это все добрая шутка, т.к. про тесты как-то толсто вышло.


    1. AlexSerbul
      23.05.2017 22:31
      -2

      ну разумеется, это стебная статья посмеяться и подумать :-)


  1. hardtop
    23.05.2017 23:10
    +1

    Сначала отнёсся скептически, а потом узрел здоровый скепсис и легкое накидывание на вентилятор.

    В принципе, можно сказать, что для веба сейчас важнее не выбор языка программирования, а умение правильно писать. Или, возможно, правильно заниматься раскруткой/поддержкой.


  1. 0xd34df00d
    24.05.2017 03:33
    -2

    Как хорошо, что я не веб-разработчик.


  1. Bandicoot
    24.05.2017 13:21
    -1

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

    Но это не мешает мне зарабатывать на жизнь исключительно веб-разработкой. При всей косячности Битрикса, в статье прозвучали здравые мысли. В первую очередь я стремлюсь писать простой и поддерживаемый код — KISS, DRY, YAGNI для меня знакомые аббревиатуры. Также для меня важно подробно изучить инструменты и технологии, с которыми приходится работать, возможности стандартных библиотек.