Я начал писать код в моей комнате родительского дома, когда мне было 14. Помню, как читал всё, что мог достать с помощью своего медленного соединения с Интернетом. Затем, когда мне было 20, я подписал первый контракт, став веб-разработчиком и изучая PHP и JavaScript. Мне потребовалось 18 лет, чтобы осознать, что кодинг — только часть профессии. Заметьте, я по-прежнему наслаждаюсь кодингом. Не думаю, что когда-нибудь перестану программировать, даже если это станет просто моим хобби, но есть нечто гораздо большее, чем код. Вот почему я хочу поделиться своим опытом. Я думаю, что иногда разработчики усваивают эти уроки слишком поздно.

У разработчиков раздутое эго. Это факт. Но почему? Я сказал бы, что любой, кто серьёзно относится к своей профессии, считает себя кем-то вроде человека искусства. Да, мы не поём перед миллионами и не рисуем «Мону Лизу», но иногда пишем код, решающий сложные задачи столь эффективно и элегантно, что не можем не гордиться своей работой. Я думаю, что разработчик благодаря подходу к проблемам является человеком искусства настолько же, насколько им является математик. А раз так, мы склонны ползать вокруг кода так же, как мамаша-медведица вокруг своего потомства. Мы пишем его, любим его и терпеть не можем, когда люди вокруг спорят, насколько код ошибочен или нет.
С другой стороны, это ещё никому не помогло. Мы любим свою работу, но должны понимать, что решаем проблемы. В обсуждении наших идей и решений с другими людьми может возникнуть лучшая альтернатива. В этом нет ничего плохого. На самом деле сотрудничество, как правило, даёт лучшие решения. Я наблюдал все разновидности эго, но я ни разу не видел ситуации, когда эго работало бы на разработчика.
Какой совет я могу дать? С той минуты, как вы начнёте работу разработчика, оставьте эго за дверью. Проглотите его и выслушайте то, что другие люди скажут о вашей работе. Примите, что лучшие идеи могут прийти не в вашу голову и что они могут повысить ваш профессионализм. Вы только выиграете, если выслушаете отзыв.
Перестаньте называть себя разработчиком на Java или разработчиком на JavaScript. Да, есть языки, которые нравятся вам из-за синтаксиса или возможностей. Это совершенно нормально. Однако вы выиграете, если какое-то время посвятите изучению чего-то ещё. Изучение новых языков, особенно если они следуют парадигме, отличной от привычной для вас, поможет открыть разум для различных подходов к решению проблем.
У меня даже нет слов, насколько это важно: изучение новых языков и их применение пойдут на пользу вашим навыкам. Я прочитал книгу Seven Languages in Seven Weeks несколько лет назад, и она открыла мне множество вариантов только потому, что показала способы решения задач, доступные в других языках.
Мы разработчики. Мы знаем, как решать проблемы с помощью кода. Не ограничивайте себя. Смотрите за пределы ограничений, думайте нестандартно, узнавайте другие варианты, языки, способы решения проблем. Даже если вы делаете это недолго, вы вернётесь к привычному инструменту со свежими идеями и более широким мышлением.
Некоторые разработчики-новички думают, что должны знать алгоритмы наизусть, так что чувствуют себя плохо в ту минуту, когда осознают, что начали забывать, как пишется цикл for. Это не только нормально. Я бы сказал, что это даже полезно. Просто у нас слишком много всего, что нужно запомнить. Но это тоже не нужно. Нужно принять тот факт, что Интернет — всего лишь ещё один инструмент, столь же необходимый, как наша IDE, для поиска ответов.
Мы все делаем это. И если вы от этого чувствуете себя плохо, не тратьте время на это чувство. Просто поищите ответ в Google и поймите вашу проблему. Подумайте вот о чём. Каждый язык имеет схожие, но немного различающиеся способы реализации паттерна Наблюдатель. Что полезнее? Понимание того, для чего хорош паттерн и какие проблемы он решает, или запоминание того, как реализовать его на каждом языке, с которым вы работаете?
Если вы знаете, что паттерн решит вашу проблему, то вы уже решили её. Всё остальное — просто поиск наилучшего способа его реализации в Google. Такой поиск не отнимает уважения ни к вам, ни к вашей работе, ни к вашему опыту. То же самое относится к любому другому поиску. Сосредоточьтесь на важном, на решении проблемы и позвольте Google подтолкнуть вашу память. Для этого он и существует.
Или, скорее, вы должны учиться всю свою карьеру. Решение, будете ли вы следить за последними разработками в индустрии, зависит от вас. Но лучше делать это, если вы хотите соответствовать требованиям рынка.
Языки и технологии развиваются, и это совершенно нормально. Конечно, некоторые экосистемы меняются быстрее других, и идти с ними в ногу может показаться титанической задачей, но сосредоточьтесь на важных вещах, помните, что вы только человек и не можете знать всего. Поэтому, если вам нужно научиться чему-то одному, я предлагаю научиться учиться.
Я знаю, что это может звучать глупо, но, возможно, у разработчика это навык номер один. Мы должны научиться быстро осваивать новые навыки. Иначе вы рискуете получить ярлык «устарел».
И вот тут вступают в игру некоторые из других уроков этой статьи. Вариативность, изменения, новые задачи, отсутствие эго — это всё поможет вам учиться и расширять спектр ваших навыков. Чем больше вы практикуетесь в этом, тем лучше. В конце концов, вы поймёте, что все языки похожи. Начнёте видеть их общие корни и сможете работать с любым из них. Всё, что вам нужно будет сделать, — это прочитать пару ключевых вещей. Всю свою карьеру вы будете изучать:
Если вы не готовы быть вечным студентом, подумайте, для вас ли такая карьера. Заметьте, я не сказал: «Уходите сразу», но подумайте, готовы ли открыть своё сознание постоянному обучению.
Как менеджер я слышал это слишком много раз. Но как разработчики мы склонны думать, что код перед релизом должен быть совершенен. И это не только неправда, но и потенциально проблема. Ранняя оптимизация является проблемой, потому что в конечном счёте вы тратите много времени и усилий на то, что, возможно, не нуждается в оптимизации. И в некоторых ситуациях при выполнении этой оптимизации вы делаете предположения, которые нарушают работу функций.
Так что сосредоточьтесь на работе, которую нужно сделать, и на проблеме, которую вы пытаетесь решить. После решения проблемы — протестируйте решение, проведите итерацию по результатам и посмотрите, что ваша команда думает о вашем решении, даже если вы уже видите пути его улучшения. Если вы собираетесь потратить ещё два дня только на то, чтобы сделать код идеальным, но он может пойти в производство прямо сейчас, то есть шанс, что он должен быть в производстве прямо сейчас.
В конце концов, вы решаете проблему. Чем быстрее вы решите проблему, тем лучше для ваших пользователей.
В соответствии с некоторыми предыдущими пунктами, не попадайте в чёрную дыру ранней оптимизации. Даже если вы думаете, что сделаете код быстро, как только он выйдет в свет (если когда-нибудь это случится), вы поймёте, что эффект замедления во времени реален.
Ваша первоочередная задача как разработчика программного обеспечения, пишущего новую функцию или исправляющего ошибку, заключается в том, чтобы заставить её работать, независимо от того, насколько уродливым может выглядеть код или насколько неэффективным может быть решение. Если код работает, вы только что доказали, что написать код возможно. Это половина успеха.
Второй шаг — оптимизация. Это необязательный шаг. Детали, которые некоторые люди склонны забывать. Время, имеющееся в вашем распоряжении для оптимизации кода, зависит от множества переменных, которые вы иногда не контролируете. Так что сосредоточьтесь на том, чтобы заставить код работать, а затем выясните, есть ли у вас на самом деле время, чтобы оптимизировать его.
Ранняя оптимизация означает оптимизацию вашего кода в процессе его написания. Это опасная практика, потому что при оптимизации мы делаем предположения о времени выполнения, требованиях к данным, требованиях к памяти и о других факторах, которые мы еще не видели в действии. Любое такое предположение может быть неверным, и в конце концов вы допустите ошибки в своей логике.
Подумайте о рабочем процессе TDD:
Второй шаг обязателен. Сначала нужно позаботиться о тесте, который означает, что функция работает. Тесту не важно, что в алгоритмах вы используете три вложенных инструкции if. Это станет важно, возможно, на этапе ревью кода.
Это особенно важно, если вы работаете один, но команды также страдают от того, что не понимают эту маленькую математическую подробность правильно. То же самое скажет любой, кто закончил проект (и, честно говоря, это относится не только к нашей индустрии). Сначала вы мчитесь через множество деталей, чтобы подумать о них потом.
И это совершенно нормально. Мы склонны сосредотачиваться прежде всего на крупных функциях, оставляя мелкие детали или даже известные баги на самый конец. Но с ними, тем не менее, нужно бороться — и вот здесь появляются дополнительные 90 %. Вы должны протестировать, исправить код, протестировать ещё раз, научить пользователей обращаться с решением, представить финальную версию решения и так далее. Конечно, всё зависит от контекста, от того, кто ваш клиент, и от многих других факторов, но что-нибудь найдется всегда. Так что запомните: когда вы думаете, что почти закончили с кодом, вероятно, вы что-то забыли.
Кодинг — это про поведение абстракций. Абстрагируя общую логику, мы можем повторно использовать её в других местах, но вначале мы забываем о важности абстракций. Вот моё личное правило: если код повторяется в двух местах, он отправляется в функцию (метод, модуль); вы поняли идею. Если два повторения выглядят в ваших глазах небольшим числом, учтите, что в будущем могут найтись другие места для применения только что абстрагированного кода. И, абстрагировав код сразу, вы сразу будете иметь к нему доступ.
Абстракция — это масштабирование. Кусочек абстрагированной логики может использоваться много раз с минимальными усилиями, тогда как копипаста (хотя сделать её легко) — чем больше вы её используете, тем больше усилий она требует. Подумайте, что произойдёт, если из-за бага вам нужно будет изменить часть логики, которая повторяется 5 раз. Чтобы исправить баг, вы буквально 5 раз измените одну и ту же часть кода.
Та же логика применима к повседневным задачам. Если вы делаете что-то больше чем один раз, вероятно, это можно как-то автоматизировать. Это ключ к эффективности, так что смотрите на повторения не только в вашем коде, но и в ваших действиях. Если вы автоматизируете задачу, отнимающую 10 минут в день, то вы сэкономите 5 часов за месяц.
Некоторые говорят, что, если вы хотите быть успешным разработчиком, вам нужны сторонние проекты. Не думаю, что это правда. Я лично знаю многих великолепных разработчиков, которые пишут код только на работе, «с 9 до 17». Честно говоря, я восхищаюсь ими. Они мастера своего дела, а в свободное время они, делая что-то другое, наслаждаются жизнью. В этом нет абсолютно ничего плохого. Однако иногда вам нужна дополнительная практика. Иногда вам кажется, что вы отстаёте от своих коллег; здесь и помогут сторонние проекты.
Я не говорю о революции в индустрии — разработке фреймворка с миллионами пользователей. Напишите его, если хотите, но я говорю о копировании чужих проектов, чтобы учиться на них. Также я говорю о вкладе в проекты других людей, устранении багов и добавлении функциональности.
Вы можете писать сторонние проекты, чтобы испытать другие аспекты разработки, которых обычно не касаетесь. Если вы пишете юнит-тесты 8 часов в день, можно подумать о написании чего-то с нуля или о разработке какой-то функциональности. Если вы устали работать в одиночку, сделайте вклад в существующий проект других людей и ощутите, что значит координировать свою работу с другими. Вы можете писать сторонний проект, чтобы повысить уровень навыков, проработав слабые стороны. Но опять же не думайте, что вам нужно работать над ними, имея зелёную планку активности Github, чтобы считаться серьёзным разработчиком. Это просто глупо.
Вот мои 9 тяжелых уроков, которые я как разработчик получил за последние 18 лет. Надеюсь, поделившись своим опытом, я пролил немного света на вашу будущую или нынешнюю карьеру. Вы научились чему-то другому, чем хотели бы поделиться? Я буду рад услышать вас в комментариях, я хотел бы научиться чему-то у вас.


1. Оставьте эго за дверью
У разработчиков раздутое эго. Это факт. Но почему? Я сказал бы, что любой, кто серьёзно относится к своей профессии, считает себя кем-то вроде человека искусства. Да, мы не поём перед миллионами и не рисуем «Мону Лизу», но иногда пишем код, решающий сложные задачи столь эффективно и элегантно, что не можем не гордиться своей работой. Я думаю, что разработчик благодаря подходу к проблемам является человеком искусства настолько же, насколько им является математик. А раз так, мы склонны ползать вокруг кода так же, как мамаша-медведица вокруг своего потомства. Мы пишем его, любим его и терпеть не можем, когда люди вокруг спорят, насколько код ошибочен или нет.
С другой стороны, это ещё никому не помогло. Мы любим свою работу, но должны понимать, что решаем проблемы. В обсуждении наших идей и решений с другими людьми может возникнуть лучшая альтернатива. В этом нет ничего плохого. На самом деле сотрудничество, как правило, даёт лучшие решения. Я наблюдал все разновидности эго, но я ни разу не видел ситуации, когда эго работало бы на разработчика.
Какой совет я могу дать? С той минуты, как вы начнёте работу разработчика, оставьте эго за дверью. Проглотите его и выслушайте то, что другие люди скажут о вашей работе. Примите, что лучшие идеи могут прийти не в вашу голову и что они могут повысить ваш профессионализм. Вы только выиграете, если выслушаете отзыв.
2. Языки — это инструмент. Вы знаете только молоток? Тогда все проблемы похожи на гвозди
Перестаньте называть себя разработчиком на Java или разработчиком на JavaScript. Да, есть языки, которые нравятся вам из-за синтаксиса или возможностей. Это совершенно нормально. Однако вы выиграете, если какое-то время посвятите изучению чего-то ещё. Изучение новых языков, особенно если они следуют парадигме, отличной от привычной для вас, поможет открыть разум для различных подходов к решению проблем.
У меня даже нет слов, насколько это важно: изучение новых языков и их применение пойдут на пользу вашим навыкам. Я прочитал книгу Seven Languages in Seven Weeks несколько лет назад, и она открыла мне множество вариантов только потому, что показала способы решения задач, доступные в других языках.
Мы разработчики. Мы знаем, как решать проблемы с помощью кода. Не ограничивайте себя. Смотрите за пределы ограничений, думайте нестандартно, узнавайте другие варианты, языки, способы решения проблем. Даже если вы делаете это недолго, вы вернётесь к привычному инструменту со свежими идеями и более широким мышлением.
3. Дело не в запоминании алгоритмов, а в их поиске
Некоторые разработчики-новички думают, что должны знать алгоритмы наизусть, так что чувствуют себя плохо в ту минуту, когда осознают, что начали забывать, как пишется цикл for. Это не только нормально. Я бы сказал, что это даже полезно. Просто у нас слишком много всего, что нужно запомнить. Но это тоже не нужно. Нужно принять тот факт, что Интернет — всего лишь ещё один инструмент, столь же необходимый, как наша IDE, для поиска ответов.
Мы все делаем это. И если вы от этого чувствуете себя плохо, не тратьте время на это чувство. Просто поищите ответ в Google и поймите вашу проблему. Подумайте вот о чём. Каждый язык имеет схожие, но немного различающиеся способы реализации паттерна Наблюдатель. Что полезнее? Понимание того, для чего хорош паттерн и какие проблемы он решает, или запоминание того, как реализовать его на каждом языке, с которым вы работаете?
Если вы знаете, что паттерн решит вашу проблему, то вы уже решили её. Всё остальное — просто поиск наилучшего способа его реализации в Google. Такой поиск не отнимает уважения ни к вам, ни к вашей работе, ни к вашему опыту. То же самое относится к любому другому поиску. Сосредоточьтесь на важном, на решении проблемы и позвольте Google подтолкнуть вашу память. Для этого он и существует.
4. Вы будете учиться всю свою карьеру
Или, скорее, вы должны учиться всю свою карьеру. Решение, будете ли вы следить за последними разработками в индустрии, зависит от вас. Но лучше делать это, если вы хотите соответствовать требованиям рынка.
Языки и технологии развиваются, и это совершенно нормально. Конечно, некоторые экосистемы меняются быстрее других, и идти с ними в ногу может показаться титанической задачей, но сосредоточьтесь на важных вещах, помните, что вы только человек и не можете знать всего. Поэтому, если вам нужно научиться чему-то одному, я предлагаю научиться учиться.
Я знаю, что это может звучать глупо, но, возможно, у разработчика это навык номер один. Мы должны научиться быстро осваивать новые навыки. Иначе вы рискуете получить ярлык «устарел».
И вот тут вступают в игру некоторые из других уроков этой статьи. Вариативность, изменения, новые задачи, отсутствие эго — это всё поможет вам учиться и расширять спектр ваших навыков. Чем больше вы практикуетесь в этом, тем лучше. В конце концов, вы поймёте, что все языки похожи. Начнёте видеть их общие корни и сможете работать с любым из них. Всё, что вам нужно будет сделать, — это прочитать пару ключевых вещей. Всю свою карьеру вы будете изучать:
- Новые языки.
- Новые (и старые) парадигмы программирования.
- Новые подходы к работе.
- Новые пути решения проблем.
- Новые способы взаимодействия с товарищами по команде.
- Новые подходы к ревью и тестированию вашего кода.
Если вы не готовы быть вечным студентом, подумайте, для вас ли такая карьера. Заметьте, я не сказал: «Уходите сразу», но подумайте, готовы ли открыть своё сознание постоянному обучению.
5. Работающее лучше идеального
Как менеджер я слышал это слишком много раз. Но как разработчики мы склонны думать, что код перед релизом должен быть совершенен. И это не только неправда, но и потенциально проблема. Ранняя оптимизация является проблемой, потому что в конечном счёте вы тратите много времени и усилий на то, что, возможно, не нуждается в оптимизации. И в некоторых ситуациях при выполнении этой оптимизации вы делаете предположения, которые нарушают работу функций.
Так что сосредоточьтесь на работе, которую нужно сделать, и на проблеме, которую вы пытаетесь решить. После решения проблемы — протестируйте решение, проведите итерацию по результатам и посмотрите, что ваша команда думает о вашем решении, даже если вы уже видите пути его улучшения. Если вы собираетесь потратить ещё два дня только на то, чтобы сделать код идеальным, но он может пойти в производство прямо сейчас, то есть шанс, что он должен быть в производстве прямо сейчас.
В конце концов, вы решаете проблему. Чем быстрее вы решите проблему, тем лучше для ваших пользователей.
6. Заставьте код работать, затем оптимизируйте
В соответствии с некоторыми предыдущими пунктами, не попадайте в чёрную дыру ранней оптимизации. Даже если вы думаете, что сделаете код быстро, как только он выйдет в свет (если когда-нибудь это случится), вы поймёте, что эффект замедления во времени реален.
Ваша первоочередная задача как разработчика программного обеспечения, пишущего новую функцию или исправляющего ошибку, заключается в том, чтобы заставить её работать, независимо от того, насколько уродливым может выглядеть код или насколько неэффективным может быть решение. Если код работает, вы только что доказали, что написать код возможно. Это половина успеха.
Второй шаг — оптимизация. Это необязательный шаг. Детали, которые некоторые люди склонны забывать. Время, имеющееся в вашем распоряжении для оптимизации кода, зависит от множества переменных, которые вы иногда не контролируете. Так что сосредоточьтесь на том, чтобы заставить код работать, а затем выясните, есть ли у вас на самом деле время, чтобы оптимизировать его.
Ранняя оптимизация означает оптимизацию вашего кода в процессе его написания. Это опасная практика, потому что при оптимизации мы делаем предположения о времени выполнения, требованиях к данным, требованиях к памяти и о других факторах, которые мы еще не видели в действии. Любое такое предположение может быть неверным, и в конце концов вы допустите ошибки в своей логике.
Подумайте о рабочем процессе TDD:
- Напишите тест, чтобы понять всё, что нужно сделать для вашей функции (тест не пройдет).
- Напишите свой код так, чтобы тест прошёл.
- Теперь побеспокойтесь об оптимизации кода.
Второй шаг обязателен. Сначала нужно позаботиться о тесте, который означает, что функция работает. Тесту не важно, что в алгоритмах вы используете три вложенных инструкции if. Это станет важно, возможно, на этапе ревью кода.
7. Последние 10 % проекта занимают 90 % времени
Это особенно важно, если вы работаете один, но команды также страдают от того, что не понимают эту маленькую математическую подробность правильно. То же самое скажет любой, кто закончил проект (и, честно говоря, это относится не только к нашей индустрии). Сначала вы мчитесь через множество деталей, чтобы подумать о них потом.
И это совершенно нормально. Мы склонны сосредотачиваться прежде всего на крупных функциях, оставляя мелкие детали или даже известные баги на самый конец. Но с ними, тем не менее, нужно бороться — и вот здесь появляются дополнительные 90 %. Вы должны протестировать, исправить код, протестировать ещё раз, научить пользователей обращаться с решением, представить финальную версию решения и так далее. Конечно, всё зависит от контекста, от того, кто ваш клиент, и от многих других факторов, но что-нибудь найдется всегда. Так что запомните: когда вы думаете, что почти закончили с кодом, вероятно, вы что-то забыли.
8. Когда вы в команде, нужна абстракция
Кодинг — это про поведение абстракций. Абстрагируя общую логику, мы можем повторно использовать её в других местах, но вначале мы забываем о важности абстракций. Вот моё личное правило: если код повторяется в двух местах, он отправляется в функцию (метод, модуль); вы поняли идею. Если два повторения выглядят в ваших глазах небольшим числом, учтите, что в будущем могут найтись другие места для применения только что абстрагированного кода. И, абстрагировав код сразу, вы сразу будете иметь к нему доступ.
Абстракция — это масштабирование. Кусочек абстрагированной логики может использоваться много раз с минимальными усилиями, тогда как копипаста (хотя сделать её легко) — чем больше вы её используете, тем больше усилий она требует. Подумайте, что произойдёт, если из-за бага вам нужно будет изменить часть логики, которая повторяется 5 раз. Чтобы исправить баг, вы буквально 5 раз измените одну и ту же часть кода.
Та же логика применима к повседневным задачам. Если вы делаете что-то больше чем один раз, вероятно, это можно как-то автоматизировать. Это ключ к эффективности, так что смотрите на повторения не только в вашем коде, но и в ваших действиях. Если вы автоматизируете задачу, отнимающую 10 минут в день, то вы сэкономите 5 часов за месяц.
9. Сторонние проекты не обязательны, но могут помочь
Некоторые говорят, что, если вы хотите быть успешным разработчиком, вам нужны сторонние проекты. Не думаю, что это правда. Я лично знаю многих великолепных разработчиков, которые пишут код только на работе, «с 9 до 17». Честно говоря, я восхищаюсь ими. Они мастера своего дела, а в свободное время они, делая что-то другое, наслаждаются жизнью. В этом нет абсолютно ничего плохого. Однако иногда вам нужна дополнительная практика. Иногда вам кажется, что вы отстаёте от своих коллег; здесь и помогут сторонние проекты.
Я не говорю о революции в индустрии — разработке фреймворка с миллионами пользователей. Напишите его, если хотите, но я говорю о копировании чужих проектов, чтобы учиться на них. Также я говорю о вкладе в проекты других людей, устранении багов и добавлении функциональности.
Вы можете писать сторонние проекты, чтобы испытать другие аспекты разработки, которых обычно не касаетесь. Если вы пишете юнит-тесты 8 часов в день, можно подумать о написании чего-то с нуля или о разработке какой-то функциональности. Если вы устали работать в одиночку, сделайте вклад в существующий проект других людей и ощутите, что значит координировать свою работу с другими. Вы можете писать сторонний проект, чтобы повысить уровень навыков, проработав слабые стороны. Но опять же не думайте, что вам нужно работать над ними, имея зелёную планку активности Github, чтобы считаться серьёзным разработчиком. Это просто глупо.
Заключение
Вот мои 9 тяжелых уроков, которые я как разработчик получил за последние 18 лет. Надеюсь, поделившись своим опытом, я пролил немного света на вашу будущую или нынешнюю карьеру. Вы научились чему-то другому, чем хотели бы поделиться? Я буду рад услышать вас в комментариях, я хотел бы научиться чему-то у вас.

Другие профессии и курсы
ПРОФЕССИИ
КУРСЫ
- Профессия Веб-разработчик
- Профессия Java-разработчик
- Профессия Frontend-разработчик
- Профессия Этичный хакер
- Профессия C++ разработчик
- Профессия Разработчик игр на Unity
- Профессия iOS-разработчик с нуля
- Профессия Android-разработчик с нуля
КУРСЫ
- Курс «Python для веб-разработки»
- Продвинутый курс «Machine Learning Pro + Deep Learning»
- Курс по Machine Learning
- Курс «Математика и Machine Learning для Data Science»
- Курс по JavaScript
- Курс по аналитике данных
- Курс по DevOps
ChePeter
Автор не усвоил самый тяжелый урок нашего дела:
«Если ты превращаешь реальный мир в матрицы, тензоры, векторы и прочие формализмы, то позаботься о корректности своей формализации. Если ты ошибся в формализации, то тебе не поможет ничего, ни доскональное знание сотни языков, ни детальное знание тысяч библиотек, ни самая навороченная архитектура»
nochkin
#8
ChePeter
Не, речь не про абстракции языка.
Вот пример, исследуете или рассчитываете что-то на балансах предприятий. И вдруг балансы превращаются в вектора чисел. Но именно вот тут вы и выбрасываете суть и ставите палку себе в колесо — цифры баланса это или долг ваш или долг вам, но долга самому себе не бывает. А в ваших векторах это законная конструкция )) — долг самому себе.
Вот именно про это мой пост.
nochkin
Я расценил это как абстракцию в целом, не обязательно в языке или каких-то технических подходах. Абстрагироваться ведь можно на разных уровнях.
owwyye
вам же сказано было умным человеком: оставьте эго за дверью
0xd34df00d
Знание языков, позволяющих доказывать корректность формализации, таки поможет.
Alexufo
любая модель — абстракция, базирующаяся на убеждениях в данный момент постмодернистской философии. Так что доказать что либо из убеждений себе — означает мастурбацию личных убеждений. Как часы которые не показывают время, а измеряют сами себя
chapuza
Корректность формализации неверной модели очень легко доказуема и ничемушеньки не противоречит. И любой агдрис (отличное имя для скандинавского божества, кстати: «Агдрис на Слейпнире, с Мьёльниром в руке джейсон ковыряет на скрипто?вом языке», — простите, вырвалось) радостно прохавает такую формализацию и подтвердит ее корректность.
0xd34df00d
Тогда почему же так получается, что я регулярно ловлю ошибки в этих самых моделях? Ну вот не сходятся типы, не сходятся, начинаешь ковырять — а ты просто потребовал то, что не имеет смысла.
Очень смешно в контексте этой статьи, говорящей, что надо в том числе писать тесты, говорить, что доказательства ничему не помогут.
svr_91
Можно ли в рамках этой модели доказать, что например, пароли в бд хранятся в зашифрованном виде?
0xd34df00d
Если формализовано понятие «зашифрованный вид», то да.
svr_91
А оно формализовано?
0xd34df00d
Так это у разработчика системы надо спрашивать. Я-то пароли в БД вообще не храню, поэтому не знаю.
Впрочем, если это понятие не формализовано, то как вы про него вообще рассуждаете, как вы этот факт проверяете, и так далее?
svr_91
Ну а делать то в итоге что?
Очевидно, что пароли в базе в незашифрованном виде хранить нельзя. Как в этом помогут идрис с агдой?
Про это и говорит предыдущий комментатор — формализовать то можно что угодно, только вот толку от этого…
0xd34df00d
Давайте, чтобы я лучше представлял приемлемый уровень гарантий, обсудим сначала, как в этом убедиться безо всяких идрисов с агдами? Ну там, тесты какие писать будете? Или что вообще делать будете?
А так — люди что-то делают. Верификация паролей и криптографии вне области моей интересов, я верификацией всякой другой ерунды занимаюсь, но вот этот диссер у меня давно отложен на почитать в свободное время, например. Там достаточно релевантные вещи.
svr_91
Ну я и думал, что у вас есть ответ на этот вопрос.
svr_91
Как я понимаю (хотя я даже не начинал читать), этот диссер исследует крипто-протоколы. Но проверить с его помощью факт, что пароли хранятся в базе как надо по прежднему нельзя.
Нет, можно конечно изобрести какой-нибудь протокол, при взаимодействии с пользователем, чтобы посредством пользователя проверялось, что пароли лежат как надо. Какое-нибудь доказательство с нулевым разглашением или типо того. Но во-первых, для этого нужно править код пользователя, во-вторых, это спокойно можно сделать на любом ЯП
0xd34df00d
Он позволяет проверить, что алгоритм шифрования на самом деле шифрует, а не дописывает к паролю единичку (тем самым, удовлетворяя требованию «строка внутри никогда не совпадает со строкой снаружи»).
Как проверить, что в БД кладутся только зашифрованные пароли — зависит от того, какой уровень проверки вас устроит. То, что описал ниже chapuza — вполне себе вариант (с точностью до проблем, которые я упомянул в ответе ему). В принципе, на уровне типов можно даже выразить, что нигде не используется конкретный API низкоуровневой библиотеки для работы с БД, чтобы убедиться, что нигде ничего не кладётся в базу в обход этих проверенных функций.
svr_91
Ну понятно, что любой алгоритм шифрования как-то проверяется перед выкаткой его в продакшн (по крайней мере все на это надеются). Вопрос в том, что делать, когда он уже проверен. Чем в этом помогут сверхсильнотипизированные языки против обычного class CryptoAlgorithm?
Это более интересно. Будет ли это чем-то отличаться от функции, которая принимает только аргументы типа EncryptedData?
0xd34df00d
Они помогут его, собственно, проверить, и убедиться, что в конкретной реализации нет багов.
Да: вы можете гарантировать, что у вас нет функций, которые пишут в БД в эту таблицу и принимает вместо пароля обычную строку.
svr_91
Конкретная реализация — это как правило библиотека. Там уже нечего проверять. Или вы не о том?
Это более интересно
0xd34df00d
Я как раз о написании библиотеки. И постулат о том, что там проверять нечего, и поэтому язык её написания неважен, мне неочевиден.
chapuza
Предыдущий комментатор говорит не совсем про это, и предыдущий комментатор в толк не может взять, с чем именно у 0xd34df00d тут заминка (есть гипотеза, что ни с чем). Тут никакой идрис не нужен, банальной джавы хватит.
Нечистоплотная функция, принимающая данные извне, сразу возвращает тип
Hashed
, с единственным конструктором, который портит входной параметр. В рамках проекта на строго-типизированном языке — (без внезапных вызовов машинного кода по адресу на ровном месте) — до кода, не только до базы, — просто не сможет докатиться исходная строка.Если надо на идрисе — можно доказать, что при проникновении строки внутрь защищенного кода она никогда не совпадает с исходной строкой снаружи.
0xd34df00d
Это вариант, и люди так делают не только для паролей и не только в завтипизированных языках. Проблема с этим подходом в том, что у вас нет гарантий, что у вас нигде не дёргается API БД напрямую, чтобы сохранить туда что-нибудь незашифрованное. Более того, нет гарантий, отличных от «ну я эту функцию
String > Hashed
прочитал, она вроде хеширует», что функция действительно портит входной параметр, что она не ксорит его с0xff
, а делает что-то более сложное, и так далее.Есть формализмы, позволяющие выражать соответствующие требования на формальных языках (мелкомягкий Project Everest во многом про это), но я понятия не имею, как именно они это делают.
Но, в любом случае, тестами вы это всё равно фиг проверите, поэтому я и спрашивал про бейзлайн.
svr_91
Ну вот вас, как глубокого эксперта в формальных доказательствах, приглашают в компанию улучшить (или разработать с нуля) систему хранения пользовательских паролей. Что вы будете делать?
0xd34df00d
Скажу «чуваки, сорян, я не шарю в построении безопасных систем, пригласите лучше спеца по безопасности, а меня лучше повозите, когда вам нужно что-нибудь будет доказать про язык, который вы разрабатываете».
svr_91
Тоесть агдрис подходит только для доказательств корректности нового яп?
0xd34df00d
Ага, а C++ подходит только для написания всякого машинлёрнинга и немного трейдинга, ведь лично я не умею писать на нём игры или там веб-сервисы.
svr_91
А вы используете идрис только для доказательств чего-то о языке, или для написания компиляторов?
0xd34df00d
Лично я сейчас вообще не пишу компиляторы, которые бы генерировали какой-то код, но какие-то утверждения и доказательства про операционную семантику этого языка у меня есть (а оттуда и до интерпретатора рукой подать).
В чуть более прикладных задачах люди пишут:
И idris 2, например, написан на идрисе.
svr_91
Решил объединить 2 треда в один, так как вопросы похожи
А что дает «проверенный» язык по сравнению с «непроверенным»?
Тут вопрос в том, что ок, проверить корректность какого-то криптопримитива можно. Но это делали и до появления агды и идриса. Может, на бумажке доказывали, может какими-то мат.пакетами, или как-то еще. Но както справлялись.
Получается, что идрис в данном случае — это лишь инструмент, один из инструментов для доказательства утверждений, может в чем-то лучше, может хуже каких-то альтернативных инструментов.
А можно ли сделать его больше чем просто инструментом?
Например, вот разработаете вы какой-то новый ЯП. Покажете его кому-то. Этот человек захочет написать компилятор (или интерпретатор) этого языка на javascript. У вас будет возможность как-то верефицировать, что этот компилятор действительно компилирует программы на вашем языке?
Или например, вы приходите к какому-то работодателю и он просит вас улучшить безопасность передачи сообщений по ненадежному каналу. Вы выясняете нужные требования и пишете на идрисе программу по типу:
Дано: Алиса и Боб, которые хотят отправить друг другу сообщение.
Доказать: Кэрол не сможет перехватить и расшифровать сообщение.
Вы пишете такую программу, получаете миллиард долларов и уходите. А дальше, лаборанты за 20000р в месяц доказывают на идрисе все нужные теоремы для используемых протоколов. Нужен протокол TLS — они доказывают ваши утверждения для протокола TLS. Нужен какой-то другой протокол, они пишут доказательство для этого другого протокола. И дальше, любое сообщение, отправленное через такую программу будет отправленно заведомо надежным образом, со всеми прошедшими валидациями.
Такое возможно?
0xd34df00d
«Проверяемый». Даёт возможность формально, машиной проверять реализацию на соответствие спеке.
Так и компьютеры программировали как-то до появления питона, JS и даже C. Но с ними удобнее, быстрее, надёжнее, масштабируемее, етц.
Ну вот бумажке у меня веры нет.
Именно так! Как и любой другой язык программирования.
Да.
Не уверен, что возможно именно такое разделение труда, но вот чтобы написать программу вместе с теоремами, и доказать, что для программы выполняются эти теоремы — это можно.
svr_91
А как это вообще будет выглядеть?
А разве с ЯП не тоже самое? Яп отдельно, компилятор отдельно.
0xd34df00d
Ну, например, как доказательство, что для любой входной программы, которая корректно распарсивается, компилятор что-то выдаёт на выходном языке, и что результат выполнения программы на выходном языке в некотором смысле эквивалентен результату выполнения программы на исходном языке.
Ну вот я сейчас что-то формулирую про транслятор из одного языка в другой, и там у меня есть, например,
svr_91
а, ну тоесть для каждого компилятора придется отдельно доказать, что он удовлетворяет тому, что надо? Ну так не пойдет, я думаю.
Ну например, если я подсуну вам компилятор C#-па, как быстро вы поймете, что он не компилирует ваш язык?
0xd34df00d
А вы думали, что это магия какая-то, типа, написал, что хочешь, а оно там покрутило шестерёнками и выдало «доказано, мамой клянусь!»?
svr_91
Ну я на это и надеялся, на самом деле. В ином случае не вижу смысла во всем этом. Ну тоесть я на самом деле подозревал, что примерно так и есть, но на чудо надеялся
Ну хорошо, а если упростить задачу, и скажем пусть компилятор будет написан также на идрисе (но без оглядки на ваши доказательства, только по спецификации), сможете ли вы в этом случае с минимальными усилиями верифицировать компилятор?
0xd34df00d
Этому чуду не суждено осуществиться как минимум по связанным с Тьюрингом причинам, увы :(
Это будет, конечно, проще. Но доказывать вообще довольно трудоёмко. Десяток лемм, которые на бумаге доказываются в основном утверждением «Straightforward induction on $X», на агде у меня заняли порядка тыщи строк и месяца три работы (но при этом я находил дырки в бумажных доказательствах, недостаточно мощные предпосылки, и так далее, и в результате я вот прям вообще уверен).
svr_91
А в чем тогда смысл комментария
Если все настолько сложно?
И какое всеже выходит преимущество у такого языка?
0xd34df00d
Ну вас же не смущает, что ТЗ может быть на десятке листочков, а реализация — на десяток-сотню тысяч строк? Зачем языки программирования, если всё настолько сложно?
А смысл в том, что машина проверяет доказательство, но, увы, не пишет его (исключая некоторые эффективно разрешимые случаи типа линейной арифметики или некоторых операций с конечными множествами или чем подобным).
А преимущество в том, что когда проверяет машина, то она
svr_91
Ну смотрите. Давайте еще раз. Вот есть 2 сущности: семантика языка, написанная и проверенная на агде, и компилятор непосредственно этого языка, написанный тоже на агде (но без оглядки на первую реализацию). Можно ли между этими 2 сущностями построить третью сущность (не меняя первые 2, или меняя чисто косметически, правда что такое «косметически», придется договариваться отдельно), чтобы она доказывала, что первая сущность соответствовала второй сущности? И как в этом случае проверить, что эта промежуточная сущность действительно проверяет что нужно, а не возвращает всегда true или random(2)?
0xd34df00d
Да, только доказательство вы сами пишете. Тайпчекер только проверит его корректность.
Посмотреть на тип тех функций, которые представляют доказательства искомых утверждений.
Например, утверждение одной из теорем со скринов выше представляется в коде как
Оно достаточно мелкое, чтобы было понятно, что это не всегда true, а его доказательство вам неважно — оно там для тайпчекера.
Или, например, если мы вдруг хотим сделать доказуемую функцию сортировки, то мы сначала определяем понятие упорядоченного списка:
то есть, пустой список по определению упорядочен, список из одного элемента тоже упорядочен по определению, и если мы к непустому упорядоченному списку с элементом x1 в голове допишем спереди элемент x0, не больший x1, то мы снова получим упорядоченный список. Звучит просто и разумно, вроде как.
Потом мы определяем, что значит, что один список является перестановкой другого:
То есть:
Это уже звучит чуть сложнее, поэтому дальше можно доказать, что если два списка являются перестановками друг друга в смысле этого определения, то они являются перестановками и в смыслах вроде «если элемент встречается в одном списке N раз, то и в другом списке он встречается N раз», но не суть.
А дальше, короче, мы пишем, что список, сортированный согласно отношению f — это перестановка исходного списка, являющаяся упорядоченной:
и говорим, что какая-нибудь функция сортировки, скажем,
merge
, выдаёт сортированные списки:Доказательство этого занимает строк 100, но на них можно не смотреть, достаточно глазами пробежаться по этому десятку строк, чтобы вообще понять, что мы там делаем и доказываем.
svr_91
Ну я примерно это и имел в виду.
А если, например, вот вы построили доказательство, что реализация конкретного компилятора соответствует вашему языку, и тут вам приносят еще один компилятор, как сложно будет адаптировать текущее доказательство под него?
chapuza
Потому что «каждая селедка рыба, но не каждая рыба — селедка», как говаривал один капитан дальнего плавания.
Я никогда не утверждал, что никакую ошибку поймать нельзя. Я сказал, что не все ошибки элиминируются таким незамысловатым образом. Модель, пытающаяся складывать яблоки и апельсины, безусловно, будет отбракована. Модель, превращающая в качестве сложения все фрукты в пюре — пройдет любую валидацию.
Контекст статьи тут вообще ни при чем.
0xd34df00d
Не пройдёт валидацию на то, что ноль фруктов является identity.
diakin
Почему не усвоил? Может просто не отметил в статье.
Thoth777
Еще можно добавить то, что надо избегать работать в компании/с людьми, у которых тяп-ляп (и так сойдет, этот код у нас издавна и не надо его трогать) поставлен в систему. MVP — шикарно и нужно, но MVP, превратившийся в легаси- это болото деградации и уныния. Надо быть очень хорошо замотивированным материально, или просто очень голодным программистом, чтобы работать там.
DrPass
… если выплачиваемая вам там зарплата не позволяет закрывать глаза на подобного рода недостатки :)
tyomitch
Thoth777 так и написал в своём последнем предложении.
anonymous
Так это нигде работать нельзя, выходит?
Thoth777
Ну почему же нельзя? Просто надо принять во внимание пару вещей:
1. Когда контора хантит свежего разработчика, она, как правило, ищет человека, знающего современные фишечки, даже если они ей нафиг не нужны. Просто так принято, что даже в самой отсталой конторе, чел на собеседовании будет вас гонять по всяким DRY / SOLID, паттернам, особеностям новых версий языка программирования, просто потому что это так принято.
2. Когда вы занимаетесь лепкой пулек из какулек, поддерживая легаси и не рефакторя его, вы деградируете как разработчик (или же вам надо самообучаться в свободное от работы время). Я прям точно не знаю как в других языках, но в PHP например, регулярно выходят обновления, а фреймворки развиваются еще стремительнее. 3-4 месяца без изучения нововведений — и все, вы устареваете.
Что проще: эволюционировать вместе с компанией, или отдельно от нее, в нерабочее время?
Я вот полтора годика посидел на проекте на устаревшей версии языка, работа + дорога занимала порядка 11 часов в день. А вечером голова уже не способна воспринимать новую инфу, да и отдохнуть хочется. Когда пришло время менять работу, мне пришлось, как студенту, зубрить это все. А мог бы и так знать, применяй я это все на практике.
Следующая моя работа была: свежая стабильная версия PHP, свежая стабильная версия фреймворка.
tyomitch
Бывает и противоположное: я однажды на собеседовании упомянул, что моим первым языком программирования был BASICA, после чего CTO компании стал меня экзаменовать по его особенностям %)
v1000
С оптимизацией вообще веселая штука. Один раз был такой неоптимальный код, что так и просил его оптимизировать. В итоге через пару часов его удалось ускорить в 10 раз. С 0,1 секунды до 0,01. И выполнялся он на форме ручного ввода данных. Один раз.
JustDont
Да, но бывает и обратная штука. Когда в коде (обычный фронтэнд, ничего сверхъестественного) центральное и единственное место, которое вообще только может в этом коде тормозить (вывод списка) — написано в виде огромной свалки жестко связанных частей, и, разумеется, безумно тормозящим образом. И без переписывания начисто большей части проекта с этим ничего не сделать. Зачем так делали? "Ну нам надо было быстро MVP" (с)
И после такого — действительно, последние 10% работы занимают 90% времени. Потому что в эти "последние 10 процентов" на самом деле входит "сделать всё по-новой, только на этот раз вменяемо". Я, кстати, из всего своего трудового стажа примерно половину времени именно на этом и специализируюсь — переделываю чужой говнокод, который "главное — работает!" и "на 90 процентов готов, остались сущие пустяки!".
Barbaresk
Ну так это классика — вывод, например, N карточек продуктов с помощью k*N+с запросов к базе данных.
EVolans
Забавно.
Сижу читаю на хабре разные умные мысли, иногда да, а иногда… вот такие.
Сидит пачка «кого либо» и обсуждает свою профессию, что надо, как надо, что мы могучи и т.п. а по факту эти могучи заменяются… любым со двора, и ничего не падает в плане работы, все продолжает отлично работать.
Нет фактора — меня могучего увоилил и все встало.
Почему?
Потому что, все работает не на вас. И проработает с успехом еще долго, даже если взять сотрудника на пол ставки неуча.
Это просто вот так вот работает, как не парадоксально в большнистве своем, а с учетом прихода и ухода, и меняющегося рынка и требований — это скорее норма чем исключение.
А по фатку в статье очивидные вещи — ты никто и звать тебя никак, и учиться надо всегда, и теперь уже не только в ит. Мир говорит надо быть быстрым, а не опытным.
HEKOT
Вот у нас тут один такой быстрый (в июне бакалавра по электронике получил) взял Питончик и сказал, что ща быстренько сделает приложение для 3D печати. Итог — потеряли полгода, приложение переписывается с нуля, а быстрый валит из конторы.
Просто у него не было ОПЫТА разработки хоть чего-нибудь большего, чем наколенный скрипт, а он быстро решил, что может всё.
EVolans
Именно, он решил, узнал и пошел познавать зная причину, а не сидел еще 5 лет думая «не… ну я еще не опытный, это не для меня, пусть спецов ищут и так всю жизнь»
Таког ОПЫТА и не будет если ты не имея его не будешь делать то где он нужен.
Вы просто были местом где этот человек решил что научитсья, ну не вышло, научитсья в другой конторе «завтра», а не когда нибудь «потом», когда будет все знать.
Virgo_Style
«Мы любим свою работу, но должны понимать, что решаем проблемы»
HEKOT
У него был шанс научиться делать софт. Он он решил, что уже всё знает.
Да, опыт он получил (надеюсь, хотя бы научился, как не надо делать). Негативный опыт — тоже опыт. Собственно, его проблемы меня не волнуют. Неприятный лживый тип.
Меня больше волнуют мои проблемы. Мне теперь эту софтину надо писать самому. И не просто, а быстро. Если бы там было чисто программирование с математикой — нет проблем. Но там ещё и металлургия. Придётся копаться в его коде, разбираться, где бага, где фича. На всё полтора месяца, из них две недели нерабочие. Вот это неприятно.
Кроме этого, наличествует односторонняя личная неприязнь металлурга ко мне, и его активность это ясно демонстрирует. Я уже сейчас вижу, что ничего путного у нас не получится.
SwingoPingo
Ит достаточно редко является бутылочным горлышком в компании и что бы довести его до такого состояния надо действительно постараться. Впрочем даже и такие прецеденты известны.
kaiu
По сути всё верно, а дальше поизвращаю малость:
1. Решая проблемы, не забудьте, чтобы вы своими не оптимизированными кодами их не добавили. Прежде всего, вы работаете во благо цели организации, предприятия, компании…даже если это компания разработчиков и вы хитро ушли от ответственности.
2. Разработчик такой же инструмент и винтик (гвоздь) в механизме бизнеса. Языки хорошо изучать… но может изучить другие бизнес идеи по зарабатыванию?
3. Факт, что если вам не подходит разработчик… то просто меняйте его. Дело не том, что знать алгоритмы, а хотя бы помнить куда копать и где найти, так что как раз это и помогает быстрее решать проблемы. В больших компаниях уже полно готового кода, библиотек кода и там просто шаг влево или вправо уже увольнение.
4. Идите в начальники, там можно абстрактно думать и переливать одно и тоже в разные виды и втирать юзерам, что это такой дизайн и это сейчас модно и тд и тп
5. Цена работы программиста очень большая, так что если самолет летит, то главное чтобы выглядел красиво (как у Макса скафандр и др), а центр тяжести, да двигатели как-то потом доделаем
6. Пройти тест – это важно, оптимальность не главное для большинства случаев, а для передовых компаний нужен и передовой софт, где уже оптимальность будет важнее (забейте об оптимальности, скоро снова ядер компам добавят и как-то это будет работать)
7. Если 10% проекта занимали 90% времени, значит, проектирования и не было. Тут пропущено слово РЕАЛИЗАЦИИ Хорошее проектирование – залог быстрого, четкого и правильного приложения и почти 50% работы. Но вот хорошее проектирование почти не бывает, ну разве что на готовом шаблоне и сказать, что месяц делал :) Ну и чем больше проект, тем БОЛЬШЕ ЖОПА и непредсказуемость того, что наделают кучи программистов. Чем проще – тем надежнее.
8. Абстракция всегда должна быть, просто название приложения уже есть 1 уровень абстракции. Погружаясь дальше, вы все больше и больше опускаетесь в тонкости реализации, до кода, а кто и до ассемблера и до железа доходит.
9. Сторонний проект поможет не сойти с ума…писать тесты каждый день? Пусть этим проектом будет всегда семья и ваши дети.
tyomitch
Ваше предложение сменить род деятельности звучит не лучше, чем «Языки хорошо изучать… но может выучиться на адвоката или на дантиста, ведь они зарабатывают ещё больше?»
kaiu
Не ограничивайте себя — говорит автор. Не мыслите узко, так как словосочетание «бизнес идея» может быть и на вашем языке и вашей деятельности. Проверить, что вам надо очень просто: представьте, что выиграли 10000000 баксов… кажись хватит. Так вот, что вы будете делать, изучать языки, приумножать эти деньги, поделитесь с кем-то и тд и тп. Вот тогда ясно будет, для чего человек сидит на работе и ради чего, что ему приносит радость, какова его цель в жизни?
tyomitch
0xd34df00d
У нас как-то с одним товарищем завязалась дискуссия о важности и профите от развития софт-скиллов…
— Ну не знаю, зачем мне софт-скиллы, я вот от ковыряния $hardskill удовольствие получаю и занимаюсь этим добровольно в личное время.
— А мог бы прокачать софт-скиллы и договориться на работе, чтобы $hardskill качать в рабочее время.
— Даже если бы мне разрешили совершенно не относящиеся к работе занятия — зачем это?
— Чтобы в личное время этим не заниматься!
Murmurianez
-
BalinTomsk
Еще бы добавил.
Каким бы вы круты не были лет через 5-6 вас сократят решением акцинеров, чисто чтобы снизить издержки бизнеса. На моей 20 летней практике кровавого ентерприза — 3 раз по 6 лет. Уйдут или скопом и одним за другим. И каждый раз процесс найма все тяжелее и тяжелее.
Учите оба стека Linux/Windows. C++/C#/Java/Python/SQL. (это мой стек)
У кого-то будет Go/Javascript/…
Со временем эти языки и так будут воспользованы в разных проектах, а в голове будет перманентная каша из синтаксиса.
Поэтому есть 5-6 темплейтов резюме с разными стеками.
Раз в год сдавайте/подтвержадайте сертификат на знание из одного из языков.
Каждые полгода сертификат на новомодное напреавление в технологиях.
Docker/K8/AWS,…
Раз в неделю проходите интервью куда-нибудь на работу. Тем более сейчас все online.
Это должно стать обыденностью. Каждый день решайте задачи на hackerrank и leetcode.
Задачу сабмитте на каждом языке для усвоение материала и поддержания знания языков
Некоторые уже совсем обнаглели и даже перед первым интервью сразу шлют ссылку на
You have been invited to attend the challenge CDN Company Senior Full-Stack Engineer. We wish you all the best!
Дают легкие задачки, но иногда их пишут люди с неродным английским и ужасным описанием.
Если вы не прошли — да и пес ними — звезды на небе не совпали.
Через полгода опять подадите.
Pet проект жалательно иметь. вебсайт с распределенной базой данных, REST сервисами, картой, множеством IoT датчиков и большими обэмами данных.
Некоторые перед интервью спрашивают описать как организована домашняя сеть.
What operating system do you run at home? What does your home computer network look like?
В конце интервью с командой всегда интересуйтесь если девушки среди разработчиков, есть ли музыкальная банда и нет ли спортивной группы типа катания на лыжах или игры в кегли.
От них тоже зависит окончательное решение и должны понять что вы свой.
DrPass
… или заведите вместо всего этого барахла приятное хобби, и получайте удовольствие от жизни, а не от непрерывного выпахивания на свои скиллы, чтобы потом еще больше пахать на свои скиллы.
0xd34df00d
А вдруг у человека хобби — на хакерранке задачи решать и сертификаты получать?
DrPass
А почему у него тогда весь пост пропитан болью и страданием? :)
svr_91
Ну странно в таком случае выставлять хобби как безусловный пункт получения работы. Иначе с тем же успехом он мог написать «Смотреть по 2 серии игры престолов каждый день»
polearnik
Хороший годный план спасибо. Остался маленький нюанс уточнить: А работать когда? а проводить время с семьей когда? А время на хобби остается? ну или хотя бы на поспать?
kenoma
Каждую неделю собесы проходить? Каждый день задачи на hackerrank? А где у вас столько времени?
Daemonis
Видимо, с этим связано
:)
megahertz
Столько времени затрачивать на поддержание своей конкурентоспособности — это перебор. Ну только если это все по фану. Гораздо эффективнее этим заниматься в процессе смены работы. Пару месяцев после увольнения вполне позволят подтянуть навыки до нужного уровня почти в любой смежной области (в том числе и навыки прохождения собеседований). Эти знания будут достаточно актуальны, не успеют еще подзабыться.
apxi
Главное что бы от этого кукуха не поехала, а то будешь со всеми этими знаниями всегда улыбаться и ходить под себя.
tovstalin
Очень верные умозаключения
Только вот система отбора кандидатов у большинства работодателей рассчитана на людей несколько иного склада
Sergunka
На самом деле изучение различных языков очень неплохая тренировка памяти и получение полезных навыков. Но куда важнее разработать свой язык и желательно его реализовать.
yokotoka
Вот только большинство промышленных задач решаются не языками, а экосистемой библиотек в них. По сути, эффективность разработчика зависит в большей степени от количества и качества готовых решений, предложенных в этих экосистемах, нежели от самих языков. А это пласты знаний посерьезнее "7 языков за 7 недель".
chapuza
Есть три типа задач:
Так вот множества задач, решаемых экосистемой (?) и задач, которыми заниматься хочется (?, ?) не пересекаются вообще никак. В нормальных задачах ну вот разве что только хранилище данных и брокер сообщений можно взять готовые, да и то придется напильником полировать.
svr_91
Как же тогда человек, постоянно увлекающийся пунктами 1 и 3, всегда умудряется попасть в пункт 2?
tyomitch
Не соглашусь: например, pandas и NumPy — не часть Питона, но сложно представить датасатанистское исследование класса ? без использования этих библиотек.
chapuza
Ну, скажем, Франсуа Коллету пришлось, и правда, затащить пару библиотек в работу класса ?.
Но «датасатанистское исследование» как таковое — это уже давно класс ?.
iKBAHT
Хорошие советы. Особенно про эго, в первый раз вижу, что кто то об этом написал. Приятно, что где то есть такие люди.
Newbilius
Чтобы обобщать подобные вещи, да ещё представлять их как факт — требуется недюженное эго ;-) Так что выучил ли автор урок номер 1 — тот ещё вопрос.
AN3333
Знаете что я вам скажу… если язык инструмент, то это не язык.
Настоящие языки настолько универсальная штука, что никакого другого не надо. Что русский, что английский, что французский могут все. И эффективно.
tyomitch
SwingoPingo
В своей деятельности приходится констатировать тот факт, что подавляющее большинство людей не могут сказать что либо связанного даже о своей работе. Даже если у них прописано это в должностных обязанностях. И, поверьте, это не мое раздутое эго, к сожалению, это печальный факт. Попробуйте посидеть пару дней в отделе техподдержки — вы заплачете. Крокодильи слезы будут литься по Вашим щекам о том, что человечество обречено, о том кто же нанял всех этих людей, о судьбах людей не на своих местах и о пути, куда катиться этот мир. И да, вишенкой, Ваши попытки, в основном тщетные, исправить это положение дел будут натыкаться на то, что Вас не будут вообще серьезно воспринимать пока вы не продемонстрируете свое (пусть и полностью дутое) чрезмерное Эго. И вот когда Ваше Эго заставит Вас запросить за час сотню юсд, клиенты подумают — а не пора ли собственно попробовать решить свои проблемы самому, ибо че то дорого стало сваливать все свои проблемы, которые я же и генерю, на этих ИТшников. И только в этот момент их проблемы начнут действительно решаться и мир озарит луч надежды.
Отсюда п.0 — никогда не пренебрегайте диалектикой
Igor_90
Тут гораздо больше решает спрос на высокую квалификацию, иначе откажут, а может ещё и поймут что с подводной лодки всё равно не куда, да и вы сами в эти правила игры начали, кстати стрелочка в одну сторону уже не крутится.
Igor_90
В вашем случае поможет расценки в час сделать меняющимися в зависимости от оказываемых услуг. Но хорошо что это дорого считать))
Ermit
Один важный пункт не описан. Постоянный поиск баланса. Когда выбрать brute force, чтобы замастырить дырочку, а когда найти время на создание эффективного и элегантного алгоритма. Когда вывалить спагетти ассоциаций по поводу задачи, а когда структурировать потоки и причесать абстракции. Когда решить расширить функциональность сервиса или выбрать рефакторинг кода. Программирование — это искусство возможного. И хождение по канату.
rudinandrey
опыт разработки чуть больше наверное будет, и под каждым пунктом подпишусь. все совершенно правильно. как говорится, если ты молод и думаешь по другому, через какое то время ты будешь думать так же.
titbit
Очень много правил. Я бы описал все проще и даже безотносительно программистов:
1. Надо любить то, что делаешь.
2. Надо уметь учиться новому.
Все остальное вытекает из этих двух.
S-e-n
Я бы пофиксил первый пункт так:
rkfg
По части абстракций не стоит увлекаться и бросаться в крайности. Немного копипасты лучше, чем огромная зависимость, которая пытается натянуться на всевозможные ситуации в куче разнородных программ, причём, решая их все довольно посредственно. Перед тем, как что-то выносить во внешнюю библиотеку или даже функцию, стоит десять раз себя спросить, настолько ли оно универсально, чтобы надёжно решать эту задачу в будущем? И нужна ли эта универсальность, если решаемая проблема действительно не такая уж и сложная?
Это всё приходит с опытом, конечно. Но часто лучше делать маленькие и функциональные, реиспользуемые блоки, из которых можно собрать решение конкретной задачи (пусть и каждый раз заново!), чем большой, абстрактный и универсальный монолит, который вроде и решает 90% задач, но оставшиеся 10% в него настолько плохо вписываются, что начинаются большие проблемы. Либо копировать и менять под задачу этот монолит (нельзя скопировать лишь кусочек, оно слишком абстрактное для этого), либо продолжать раздувать код для покрытия новых редких случаев, которые в 90% использоваться не будут.
По сути, проблема похожа на композицию и наследование. Первое ты для каждого случая собираешь из частей, зато оно модульное и гибкое, а второе ты получаешь сразу готовым и универсальным, но с сопутствующими головными болями при нестандартных требованиях. Реалии таковы, что требования меняются часто, и конструкторы оказываются более пригодны для решения настоящих задач.
Eldarius38
Не делать, но время от времени смотреть сторонние проекты — маст хэв
alsoijw
Так оптимизация не нужна или всё же костыли не нужны?
grimcap
В начале
5. Работающее лучше идеального
потом
6. Заставьте код работать, затем оптимизируйте
а после внезапно
7. Последние 10 % проекта занимают 90 % времени
В начале делаем тяп-ляп, лишь бы быстрее показать что-то заказчику не вдумываясь в архитектуру и переиспользование элементов
А потом под конец проекта ВНЕЗАПНО его становится очень тяжело поддерживать, добавлять некоторые штуки очень тяжело и вообще скорей бы уже новый, а то этот какое-то г-но
Может быть лучше сразу разрабатывать вдумчиво, пусть и несколько медленнее, за-то сохраняя грамотную структуру?
awfun
Мне кажется, здесь не имеется в виду говнокод в угоду скорости. Приведу два примера с текущего проекта:
5 — оплату картой реализовали, а сохранение карты подождет пару недель
6 — заявки пользователя один раз из десяти обрабатываются неверно, пока что можем позволить вместо автоматизации исправления ошибок обойтись мониторингом и ручной правкой в базе
При этом остается время на тесты и на исправление багов по выкаченным ранее фичам.
noodles
Если только в двух местах — ничего не делать. Отпустить и жить с этим дальше.
Если в трёх — сделать пометку чтобы вынести в абстракцию… потом… когда наступит четвёртый раз.
Если в четырёх местах — вот тут уже в кайф делать эту абстракцию, т.к. видешь её уже чуть выше, чуть больше имеешь контекста, меньше шансов сделать неудачную абстракцию которая будет протекать.
JustDont
Это всё вообще не от количества мест зависит, к слову. А от модели.
Потому что существуют случаи, когда и повторенный 20 раз код ни в коем случае не нужно никуда выносить, потому что корректной доменной абстракции просто не существует (а то, что 20 раз одно и то же — не более, чем редкое совпадение обстоятельств).