Мой путь

Ответ читателю на непраздный вопрос:

Как развиваться/развиваешься? Расскажи свой опыт.

Если коротоко:

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

Также процитирую Intenrnet 9000

Отвечаю читателю о том, как научиться кодить. Ответ длинный, рецепт непростой, лайфхаков нет. Просто-напросто нужно потратить 10 000 часов, и все будет.

Успокаивающее слово для нетерпеливых: 10000 часов — это не меньше чем 5 лет, а то и все 10.

Время

Важный секрет: я никогда не работал на основной работе фулл-тайм. Первые три года, ещё в Иссарте, я работал по 30 часов, после этого на всех работах договаривался на 20.

Моё поведение спорно. Я знаю людей, которые наоборот говорят, что работали по 60 часов и именно на работе всему научились.

Глубина важнее ширины

Мне кажется, обилие глубоко прокопаных разделов потом неизбежно сконвертируется в ширину. Обилие ширины тоже помогает глубже понять какие-то вещи, но для этого уже должен быть натренирован сам навык взгляда вглубь. Потом, ширина набивается опытом, а глубину нужно целенаправленно прорабатывать.

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

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

Есть книжка и интерактивный курс: From nand to Tetris, всё хочу пройти, руки не доходят. Это основа основ, как работают компы, и этот курс я считаю, мне надо пройти обязательно. Я не могу даже сформулировать ту цепочку, по которой оно бы пригодилось мне на работе. Вероятно этой цепочки и нет. Но почему-то мне кажется это важным. В этот же раздел отношу MMIX Кнута.

Очень интересный курс на ютубе Programming paradigms. Сам посмотрел и всем рекомендую.

Ну и так далее.

Преподавание

Я с первого курса преподавал в математическом кружке, а с четвёртого работал учителем информатики в школе.

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

В общем, рекомендую начинающим программистам идти в преподаватели.

Чтение по JS

Конкретно для нашей работы я бы порекомендовал для фундамента:

  • Что-нибудь, чтобы знать все основы языка. Обязательно освоить «безсахарное» наследование через прототипы, обязательно разобраться с контекстом «this» у функции. Где лучше учить — не знаю: может MDN, может javascript.ru, может ещё что-то.
  • Всякое про браузер: DOM, события, бабблинг, коллапсинг маргинов, и т. п. Не знаю, как это учить подробно, не будешь же всю спецификацию запоминать, к тому же там всё быстро меняется. Я просто помнил, что в браузере есть какие-то тонкости, с которыми нужно как-нибудь получше разобраться. И когда жизнь выносила какую-нибудь из тонкостей наверх и била ей мне по морде, то это был повод, проштудировать соответствующую тему, а не просто пофиксить багу как-нибудь.
  • Книжку Резига «Javascript ниндзя»
  • Взять какой-нибудь курс по Functional Programming, т. к. функциональная парадигма в современном сайтостроении прёт из всех щелей. Я проходил на курсере курс Мартина Одерски по скале — хороший академичный курс, но наверняка есть курсы и получше, и поближе к практической жизни.

Когда что-то читаешь про фундамент JS и браузерной разработки, то любимый сайт — это about:blank открываешь консоль браузера и фигачишь там эксперименты, чтобы сразу же на практике проверять прочитанное.

И для кругозора:

  • Посмотреть тот самый видос про frp Александра Соловьёва.
  • Проштудировать доку по React.
  • Пробежаться по NextJS, посмотреть, чем от отличается от Gatsby.
  • В 2016-м был прикольный большой мануал по Redux на русском, но сегодня я не в курсе, что там сейчас является каноническим чтивом. В общем, есть смысл разобраться с Redux. Я не знаю, будем ли мы его выпиливать из нашего проекта или просто изменим рекомендуемый способ взаимодействовать с ним. Но что-то будем делать определённо, и поэтому есть смысл понимать, что будет происходить и зачем, а лучше самому становиться инициатором изменений.
  • Проштудировать доку по TypeScript
  • Глянуть на Flow, просто чтобы было с чем сравнить TS, и, кто знает, возможно знание Flow поможет улучшить какие-то практики в использовании TS.
  • Выучить что-нибудь из: Angular, Vue, Ember или <подставьте своё>. Будет с чем сравнить React.
  • О, сегодня только увидел: у Соловьёва свежий доклад

После прохождения раздела «для кругозора» у меня бы в портфолио добавилась пара-тройка домашних проектиков… или один, написанный разными способами.

Чтение вообще

Тут у меня нет рекомендаций, что читать и как. Книжки — не книжки, сайты — не сайты.

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

Я не такой уж большой чтец, но по крайней мере, мой бесконечный список чтения на будущее не только пополняется, но иногда и убывает:

  • то есть, во-первых, этот список у меня есть, что само по себе уже хорошо;
  • а во-вторых, он не write-only, что прям замечательно;
  • конечно, есть гораздо более образованные люди, у них и достижения покруче, не знаю как им это удаётся.

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

Школа:

  • 6 класс: Basic для ZX-Spectrum, кажется, такая: https://zxpress.ru/book.php?id=56 проштудировал её от корки до корки, и понял, что свою игру на бейсике не написать, потому что он тормозит, и нужно писать на ассемблере, поэтому
  • 7 класс: Ассемблер для ZX-Spectrum. В этой книжке была понятна вся теория, но практических навыков книжка не давала. Т.е. ребёнок в моём лице не смог преодолеть пропасть от первого шага до реализации своей грандиозной задумки.

В студенчестве и аспирантуре я прочитал:

  • C++ Страуструпа
  • PHP-5
  • ООП Гради Буча
  • QT-4
  • (+) Обе книжки Джоэля нашего Спольски: «о программировании» и «снова о программировании».
  • Кнута я начал читать, но это скорее учебник/задачник по математике, а задач там много и они такие для меня были нехилые. Даже если не решать, а подробно разбираться в написанных решениях, всё равно получается очень медленно. В общем, я сквозь него так и не продрался, оставил на пенсию. Кстати, я не математик, а физик, и вот для этой книжки хиловат оказался.
  • Ководство и техногрет
  • О, ещё я получил такие универские курсы: JS, LaTeX, Databases, Parallel programming, Waterloo Maple.
  • кстати, по ЛаТеХу я целую книжку прочитал: Львовский «LaTeX».

В ИССАрте:

  • (+) Экстремальное программирование (книжка может быть уже устаревшая, но мне кажется её полезно прочитать, чтобы почувствовать эволюцию процессов в нашей индустрии)
  • (+) Рефакторинг Фаулера
  • Паттерны проектирования
  • менеджер Антон меня подсадил на всякое чтиво для менеджеров и тестировщиков: Славу Панкратова, Макса Дорофеева и всякое такое.
  • (+) на этого чувака подсел: https://gaperton.livejournal.com/ только сейчас он на медиум сбежал.

В Лайфтайпинге:

  • (+) Резиг: «JS нинзя»
  • (+) Влад меня подсадил на Радио-Т.
  • (+) Сам подсел на SE-radio. Я там не слушаю всё подряд, но некоторые выпуски цепляют и тогда я их прям внимательно разбираю: переслушиваю по несколько раз, чтобы всё понять.
  • (+) О, да, тот самый видос про clojure
  • конечно же я даже купил книжку про Clojure и прочитал несколько глав. Но там потом такой неплохой материал пошёл, даже не про язык, а вообще, в котором надо было тщательно разбираться, а времени тогда не было, так что я отложил.
  • (+) Первую главу «Структуры и интерпретации компьютерных программ» прочитал, потом стало некогда и пришлось отложить. Но книжка хорошая, особенно рекомендую посвящение (одно предложение) и вступление в первую главу (две странички).

(разумеется, я собираюсь дочитать недочитанные книжки)

В BigBrassBand:

  • (+) книжка Салмана Хана «Весь мир — школа». Она хоть и выбивается из списка, но там про то, как чел сделал свой большой проект, и даже немножко про Билла Гейтса.
  • (+) Настя меня подсадила на советы Артёма Горбунова и на Интернет 9000
  • (+) я сам стал слушать «Запуск завтра»

Есть ещё длинный список того, чего я собираюсь почитать, и даже полочка купленных, но не прочитанных книг. Но не буду их перечислять, т. к. вопрос был про мой путь, а не про путь воображаемого меня в будущем.

Проекты

Есть проекты ради результа. На них нужно работать быстро и эффективно. Но для того, чтобы знать, какие шаги будут эффективными, а какие — нет, надо эти шаги испытать где-то ещё. Проще говоря, нужно много тренироваться на кошках.

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

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

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

Прямо сейчас у меня параллельно идут свеженачатые хобби проекты (кстати, мне бы не помешали помощники):

  • движок своему сайту
  • образовательная система для Школы программиста
  • новая уникальная система планирования, которую я придумал ещё год назад
  • до сих пор время от времени мне прилетают задачки по Personal Notes, хотя я проект передал другой команде и совсем не программирую, но иногда просят потестить, поревьюить.

Почему-то все текущие проекты в списке выше оказались удивительным образом длинными. Многие прошлые проекты были очень быстрыми — от выходных до недели:

  • в 2017 году я нарисовал мультик на конкурс — примерно 4 выходых. И кстати, для него мне пришлось немножко попрограммировать.

  • 2017 — Плагин для Chrome Улучшалка Яндекц.Zen. Прототип я сделал за день, наверное. Но плагин я не доделал, т. к. свой канал забросил и пропала необходимость.

  • 2017 — Personal Notes for Jira. Это я придумал и за недельку сделал прототип, а потом мы с Андреем ещё за недельку выкатили: он переделал бэк, а я — фронт.

  • 2016 — участвовал в тестовом для data-laboratory. Наверное, часов 40 у меня ушло. В общем, за выходные :)

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

  • 2013 — RTM Assistant for Chrome. Тут я даже код не писал.

  • 2011 — Finger Twist for Android — это мы с Настей сделали за двое суток, устроив себе жёсткий хакатон в Политотделе. (Оценки в маркете стрёмные, это потому что мы не занимаемся поддержкой, первые пять лет рейтинг был неплохой).

Я привёл этот список с двумя целями:

  1. Чтобы показать примеры вещей, которые могут вызывать желание попрограммировать, и получившихся проектов. Это далеко не всегда второй инстаграм или гугл, иногда проект — это однострочный bash-скрипт или улучшение уже готового скрипта.
  2. Внимательный читатель мог заметить, что проекты идут довольно редко. То есть, на самом деле это не хваставство, а наоборот самобичевание, ибо куда это годится 7 мелких проектиков на 10 лет? Этим я хочу сказать, что такой плотности легко достичь, если обращать на это внимание.

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

  • ACMP
  • MCCME
  • Euler
  • зареган на Codeforces, но там у меня нет успехов

Что ещё

Пост от том, как учился Internet 9000 (там картинку надо увеличить, на ней основной текст). На мой вкус выглядит разумно, так что я могу его рекомендовать как руководство к действию.