Мой путь
Ответ читателю на непраздный вопрос:
Как развиваться/развиваешься? Расскажи свой опыт.
Если коротоко:
- уделяю этому много времени помимо основной работы. Пожалуй даже несколько больше, чем основной работе.
- в изучении технологий я стараюсь копать поглубже. При ограниченном времени глубина важнее ширины.
- когда я что-то читаю, книгу или документацию новой технологии, то я сразу представляю, как с учётом новых знаний мне надо переделать старые проекты, или просто придумываю новый проект, который уже руки горят начать делать.
- также, я сразу придумываю, как проведу на эту тему (хоть и новую для меня) серию занятий на кружке с детьми, даже если тема кажется совсем не детской.
- когда я пользуюсь софтом, я придумываю как его можно было бы улучшить минимальными затратами. Если софт допускает плагины, то грех не потратить пару дней и не намутить свой плагин.
- не могу сказать, что я много читаю, но наверное и не мало.
Также процитирую 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 — это мы с Настей сделали за двое суток, устроив себе жёсткий хакатон в Политотделе. (Оценки в маркете стрёмные, это потому что мы не занимаемся поддержкой, первые пять лет рейтинг был неплохой).
Я привёл этот список с двумя целями:
- Чтобы показать примеры вещей, которые могут вызывать желание попрограммировать, и получившихся проектов. Это далеко не всегда второй инстаграм или гугл, иногда проект — это однострочный bash-скрипт или улучшение уже готового скрипта.
- Внимательный читатель мог заметить, что проекты идут довольно редко. То есть, на самом деле это не хваставство, а наоборот самобичевание, ибо куда это годится 7 мелких проектиков на 10 лет? Этим я хочу сказать, что такой плотности легко достичь, если обращать на это внимание.
Следующий список, это не проекты, но тоже работа в копилку тех пресловутых «10000 часов». Довольно много задач я решил из задачников, и для этого нужно было учить некоторую матчасть:
Что ещё
Пост от том, как учился Internet 9000 (там картинку надо увеличить, на ней основной текст). На мой вкус выглядит разумно, так что я могу его рекомендовать как руководство к действию.