Вечные студенты: когда программирование — это постоянная «учеба»

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

    Фото hackNY.org CC-BY

    Из области очевидного


    Привычка цепляться за старое и игнорировать новое (даже если новое для вас — это Java или Python) рано или поздно может сыграть с разработчиком злую шутку. В этом, например, уверен Джон Грэм-Камминг (John Graham-Cumming), CTO Cloudflare. Рассказывая о том, чему его научили годы программирования, он замечает: «Некоторые чрезмерно увлекаются каким-то определенным языком и пишут только на нем. Это ошибка. Не существует одного-единственного языка, идеального для решения всех задач».

    Джон рекомендует всем, кто связан с разработкой, изучать как можно больше различных решений, языков, библиотек. Его поддерживает разработчик Джош Брэггер (Josh Braegger) в своей подборке «антирекомендаций» о том, как наиболее быстро и эффективно перегореть за написанием кода.

    Стремиться изучать новое — пусть это и очевидный совет, он, тем не менее, важный. И чем более опытным программистом вы становитесь, тем сложнее ему следовать — как справедливо замечает Джон Грэм-Камминг: «Я уже недостаточно молод, чтобы знать [о разработке] все».


    Кто и что изучает: немного статистики


    Сооснователь Stack Overflow Джефф Этвуд (Jeff Atwood) в своей статье на Coding Horror рисует еще более драматичную картину: «Классные разработчики очень хороши в программировании, можно сказать, фантастически хороши. Если они в чем-то похожи на меня, они проводят почти каждую секунду бодрствования за компьютером — на протяжении практически всей жизни».

    Однако, даже если это и так, время, проведенное в работе за компьютером, можно потратить по-разному — кто-то посвящает его только деловым проектам, а кто-то находит время для сторонних задач и учебных упражнений. Первый вариант, по словам уже знакомого нам Джоша Брэггера, запросто может привести к выгоранию: «Вы начали заниматься программированием, потому что вам это нравилось, так почему бы не продолжать в том же духе? Потратьте немного свободного времени на то, чтобы решить задачу, которая вам интересна».



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

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



    Так, например, в «рабочую» группу попали тэги, связанные с технологиями Microsoft (C#, ASP.NET, SQL Server, Excel, VBA).

А в «группе по интересам» оказались относительно новые языки (вроде Swift), а также Node.js, C и C++. Кстати Scala и Ruby on Rails, которые несколько лет назад находились в этой группе, сейчас перешли в категорию «рабочих» языков и стали меньше использоваться по выходным. Еще один пример технологий, интерес к которым просыпается по выходным, — решения для разработки мобильных приложений и игровой движок Unity3D.

    Кроме того, аналитики выяснили, что среди четырех языков (C#, C, Java, Python) C#-программисты наиболее «корпоративные» и работают «преимущественно с 9 до 5», в то время как C-программисты больше похожи на «вольных художников»: встают позже, работают дольше, часто оставляют задачи на поздний вечер. Java и Python оказались где-то между этими двумя крайностями (в этом приложении можно сравнить графики динамики обращений к разным технологиям на Stack Overflow в рамках суток).

    А подробный рассказ о том, как проводилось исследование, можно прочитать здесь и тут.

    Кстати, универсальный «задачник» для разработчика (вне зависимости от выбранного языка) составил один из инженеров-программистов в Google. В списке — задачи на основные разделы программирования, от работы с числами до операций с графикой и мультимедиа-файлами. А поскольку это проект на GitHub, он содержит не только сами задачи, но и варианты решений (чаще всего на Java и Python, но попадаются и решения на Swift, Go и даже Befunge).

    Когда обучение новому — это боль


    Однако, в процессе изучения нового можно столкнуться и с совершенно неожиданными (и даже шокирующими) задачами. Такую историю приводит разработчик Джо Логри (Joe Loughry), написавший текст под названием «Худшая среда программирования в мире». В 1990 году Джо пришел на работу в компанию, где использовался язык BANCStar. Поэтому в первый день работы Джо увидел примерно следующее:

    8607,,,1
    11547,15475,22002,22002
    1316,1629,1,1649
    3001,1316,3,30078
    11528,22052,22002,22002
    9301,0,1528,1528
    31568,10001,800,107
    8560,,,1568
    8550,210,,
    3001,,,
    3100,1316,3,30089
    11547,15475,22002,22002
    3001,1316,3,30089
    3001,1317,3,10000
    8400,,,
    8550,700,801,
    3001,,,
    9301,0,522,522
    3000,1284,3,10001
    8500,,3,
    8500,,5,
    1547,,1,-2301


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

    Как заявил Джо в своей статье об этом языке, впервые опубликованной в 1997 году, — «[Приводя часть исходного кода] я не слишком волнуюсь по поводу распространения внутрикорпоративной информации, так как прочитать этот код смогут от силы десять человек на планете». На самом деле в начале 90-х этим языком действительно пользовались банковские структуры — хотя он и выглядит как эзотерический язык программирования.

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


    По сравнению с BANCStar большинство популярных сейчас языков явно «человечнее» куда проще в изучении и использовании. Хотя, как справедливо отмечает Джон Грэм-Камминг, «[Языковые войны] — по большей части удел лузеров, потому что это «спор не по делу». Например, когда я пишу на PHP, результат оказывается ужасным, зато другие люди могут с помощью этого языка творить чудеса». Кто знает, может быть, среди 1350 файлов, написанных на BANCStar, тоже есть свои шедевры, правда, мало кто способен сейчас оценить их по достоинству.

    Программирование как стиль мышления


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

    Такой позиции придерживается Аллен Доуни (Allen Downey), профессор информатики в колледже Olin College of Engineering в Массачусетсе и автор ряда книг по программированию. Он вспоминает, что раньше для изучения программирования часто использовалась связка «естественный язык—математическая нотация—псевдокод—код».

    Естественный язык экспрессивен и понятен, псевдокод более точен, математическая нотация обеспечивает краткость, а сам код можно непосредственно использовать в работе. С другой стороны, современные языки программирования обладают всеми этими качествами (экспрессивность, точность, краткость и исполняемость) и поэтому сами могут использоваться не только как конечная цель, но и как средство обучения.

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

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



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

    И все же программирование — это не главное


    Даже успешные программисты заявляют: программирование в их работе — это не главное. Джефф Этвуд приводит в пример Билла Гейтса, который в одном из выступлений заявил, что после 3-4 лет в профессии программист уже не сможет радикально улучшить свои навыки — если за 3-4 года он не стал «звездой», то вряд ли «выстрелит» впоследствии.



    Это приводит нас к парадоксу — получается, опыт и знания, которые мы приобретаем с годами, не превратят нас из «крепкого середнячка» в «супер-кодера». Тогда что же определяет такую возможность? Если отбросить врожденную гениальность, Этвуд заявляет следующее: наш уровень во многом определяется тем, как мы воспринимаем все, что не связано напрямую с разработкой — речь идет об изучении пользователей, бизнес-процессов, особенностей индустрии, в которой занят разработчик.

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



    Поделитесь в комментариях своим опытом «непрерывного обучения»: какие языки/фреймворки вы изучаете сейчас и для чего? Какие «сторонние дисциплины», не связанные с программированием, на ваш взгляд, помогают вам лучше справляться с написанием кода?
    Университет ИТМО 110,33
    IT's MOre than a University
    Поделиться публикацией
    Комментарии 12
    • 0
      Сам в выходные искал по Nodejs, но не потому, что изучаю JavaScript, а потому что изучаю транслируемый в него язык и пытаюсь совместить его с одной хитрой библиотекой.
      Интересно, такие как я сильно на популярность Nodejs по выходным влияют? ;-)
      • +4
        Джефф Этвуд приводит в пример Билла Гейтса, который в одном из выступлений заявил, что после 3-4 лет в профессии программист уже не сможет радикально улучшить свои навыки — если за 3-4 года он не стал «звездой», то вряд ли «выстрелит» впоследствии.




        А какими ЯП владеет Билл Гейтс? В Вики нашел только:

        Micro-Soft BASIC: «Пол Аллен написал вспомогательные коды. Билл Гейтс написал исполняемые коды. Монте Давидофф написал математическую библиотеку.»


      • +1
        Фреймворки и языки просто инструменты под разные задачи. Если есть время то да, почему бы и не освоить соответствующие инструменты под задачу? Главное правильно оценить задачу и дедлайн, чтобы не прикручивать технологии ради хайпа по технологиям тратя на это деньги эмплоера.
        Какие «сторонние дисциплины», не связанные с программированием, на ваш взгляд, помогают вам лучше справляться с написанием кода?

        Как правило межпредметные дисциплины непосредственно связанные с проектом, не то чтобы непосредственно помогают писать код, но помогают правильно сгруппировать получаемые данные, построить роутинг в приложении, спроектировать грамотно БД с иерархией и one-many связями. Простейшие примеры, нужно построить дерево живых организмов классифицировав их по формам жизни, родам, видам и пр. Думаю биолог-программист справится лучше). Или приложение с справочной информацией по заболеваниям и травмам — человек с компетенциями в области медицины тоже отлично справится.
        Спасибо за интересные ссылки на статьи про программирование в выходные. Забавно, что в выходные распределение по Haskell в плюсе :)
        • +2
          > Естественный язык экспрессивен и понятен

          Видимо, всё-таки ВЫРАЗИТЕЛЕН и понятен.
          Слово «экспрессивный» — немного не о том. Ложный друг переводчика.
          • 0
            К сожалению, это так. Если раньше искал информацию, то теперь вкладки висят в броузере неделями, только то, что надо бы обязательно прочитать.
          • 0

            Я один вижу квадратики lsep?

            • 0

              Не согласен с автором. Программирование это не вечный студент. Программирование это:
              1) 1 раз выучился нормально кодить, рефакторить/SOLID и всякую алгоритмическую дич
              2) можешь прочитать доку, понять и простить сделать
              Да, я согласен, что в каждый момент времени нужно держать N-й объем информации в голове. Но эта информация довольно конечна и приобретается за 5-7 лет плотной работы. Вечные студенты только те, кто не смог нормально выучиться и вынужден постоянно подтягивать.

              • 0
                Тема очень интересная и довольно специфичная. Но задело вот это BANCStar
                Между прочим, на то, чтобы привыкнуть к языку и начать его активно использовать, у Джо ушло две недели
                Немного google и находим еще пример (один вопрос как ?)
                PDF 2.4mb
                Немного особенностей языка
                3000 предопределенных переменных, все пронумерованы, все глобальные. Нет объявления переменных, без инициализации. Половина из них, разбросанная по всему диапазону, зарезервирована для использования в системе, но вы можете использовать их на свой страх и риск. Сто или около того автоматически заполняются в результате различных операций, и ни один из них не указан. Все они вписываются в 38k байт, и нет никакой защиты для переполнения буфера.

                Профиль самого Джо (Linkedin)

                Прошло 27 лет с момента актуальность и этого языка, просто интересно что будет дальше еще через 27
                • +1
                  Классные разработчики очень хороши в программировании, можно сказать, фантастически хороши. Если они в чем-то похожи на меня, они проводят почти каждую секунду бодрствования за компьютером — на протяжении практически всей жизни

                  Мда. Подскажите, в какую смежную область можно уйти, переучиться? Может кто сам так делал или же наблюдал у знакомых/друзей.
                  • 0

                    Из опыта друзей:


                    1. Продажи софтверные
                    2. Продажи железа
                    3. Фотограф
                    4. CEO + руководить софтовой конторы
                    5. Художник
                    6. Дизайнер-оформитель
                    7. Автомеханик (по отзывам — весьма хороший)

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

                  Самое читаемое