↑↑↓↓←→←→ⒷⒶ Войти !bnw Сегодня Клубы
УНЯНЯ. У нас есть немножечко инфы об этом пользователе. Мы знаем, что он понаписал, порекомендовал и даже и то и другое сразу. А ещё у нас есть RSS.
Теги: Клубы:

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Wed Jul 29 2020 22:55:23 GMT+0200 (Central European Summer Time) Posted as new post Clubs: Tags: *it *развитие *коучинг *обучение *programming Хочется осветить один важный, но часто незаметный и упускаемый из виду аспект разработки кода ( на самом деле работает и вне кода, но с кодом будет нагляднее ). Многие энтузиасты программирования, в основном конечно джуниоры, но встречается и среди системных архитекторов ( я видел ), начиная разработку очередного продукта как то не задумываются о его lifecycle ( как долго будет разрабатываться? как долго будет востребован? известно ли его "конечное состояние" или можно будет развивать бесконечно? ... ), в итоге на архитектуру конечно не забивают, но стараются не слишком ей заморачиваться на ранних этапах, стремясь побыстрее получить результат или как то балансировать между результатом и проработкой архитектуры ( этому чем-то способствует философия Agile, особенно если человек неправильно её понимает ). Сразу скажу, что здесь речь пойдёт о проектах, которые: 1) технически сложные 2) не имеют ограничений по срокам ( либо сроки очень большие ) 3) потенциально могут стать продуктом, который можно продолжать развивать бесконечно и сейчас не ясно где развитие продукта закончится В самом начале такого проекта нужно понимать, что результаты - не цель ( как парадоксально бы это не звучало ), цель - ускорение/упрощение получения результатов в будущем. Будущем, да. Про настоящее здесь нужно забыть, и расставляя приоритеты - не думать "какой результат это принесёт", а "каким образом это облегчит дальнейшее получение результатов". При этом облегчение получения результатов само по себе является результатом, так что выходит как бы бесконечная рекурсия, но каждый следующий виток упрощает следующие ( да-да, и может наступить момент, когда уже просто нечего оптимизировать/упрощать и вот тогда это самые "результаты" и начинаются, как бы сами собой, быстро, легко и экспоненциально ). Но не будем забегать вперёд. Вот, нарисовал небольшую инфографику для наглядности - https://tinystash.undef.im/il/5BUy29qSa7HaGuKJt6KgbjZ565uaMJMdDghgCNkYswNZiyFZBpEkxjuNd6Ft9HA3mVgMBjZ6hWugK8SQckth8JFz.png , кстати, основано на реальных событиях, конкретные проекты упомянуть пока не буду но оба находятся в начале пути, и, как вы уже наверно догадались, один из них уже имеет _видимый_ прогресс, а во втором пока вообще непонятно что происходит и происходит ли ( да ещё и код закрыт ). Почему так, почему людям так хочется гнаться за результатами? Если это не внешнее ограничение, например, сроки полученные от инвестора ( кстати, одна из причин, почему многие стартап-компании делают продукт "на отьебись", нет нет они не обманывают инвестора умышленно, но он им даёт требования и сжатые сроки и у них нет выбора, а заработать хочется, вот и получается, что инвестор вовремя получает продукт, который он хотел, но чуть позже выясняется, что одно нужно исправлять, другое переписывать, а через какое то время - что выгоднее уже вообще всё переписать, чем платить за постоянный мэйнтенанс ( при этом если первоначальный продукт был достаточно успешен и принёс прибыль то это происходит и дальше всё идёт гладко, но чаще конец печален ) ), то вторая по распространённости причина - неуверенности в себе как программиста. Начиная непривычный, или просто более сложный, чем обычно, проект ( особенно если это проект одного разработчика ( или маленькой команды ) ), человек постоянно ощущает сомнения - а получится ли? а смогу ли?, и чтобы их преодолеть ему нужно регулярно видеть _видимый_ прогресс, а это значит, что первым делом он пытается пробиться к ( если это игра ) геймплею, как к глотку свежего воздуха. Когда это происходит ( если происходит ), выделяется дофамин, человек радуется ( "у меня всё получается!" ), и потом пытается как то "натянуть" на то что есть ( что часто является 'Proof of Concept' и в принципе дальше развиваться не может без переписывания большей части кода ) какую-то архитектуру. Но, вот незадача, дофамин возвращается на место, человек замечает, что вроде работает, тратит время, силы, а визуально ( геймплей ) ничего не меняется, ничего нового не добавляется. Становится грустно и неприятно заниматься архитектурой, а приятно - добавлять больше и больше геймплея или чего-то видимого. И возникает порочный круг - те сопли ( архитектурой это не назвать ), на которых сейчас всё держится, могут выдерживать добавление новых фич только ценой роста технического долга ( который уже и так немаленький ), но если начать заниматься техническим долгом - портится настроение, снижается энтузиазм ( "я не этим скучным переливанием из пустого в порожнее хотел заниматься!" ) и рано или поздно желание продолжать проект заканчивается ( да, это результат 99%, если не 100%, таких проектов основанных на энтузиазме от _видимого_ прогресса ). Некоторые бросают сразу ( иногда начиная новый проект и наступая на те же грабли ), некоторые пытаются выжать из того что есть всё, что можно, ценой многочисленных хаков и прочих отвратительных практик ( а иногда потом ещё и продать ), но результат один. Что делает грамотный системный архитектор? Системный архитектор не спешит. Он _уже_ видит результаты в будущем, потому что понимает, что грамотно и вовремя спроектированная архитектура позволит ускорять скорость дальнейшей разработки экспоненциально ( или близко к этому ). Какая разница, что уже месяц нет видимых результатов? Постоянное улучшение архитектуры ускоряет дальнейшее её улучшение, а также облегчает добавление фич и тех самых результатов, за которыми гонятся неуверенные в себе джуниоры в самом начале проекта. Единственное, что интересно на ранних стадиях проекта - ускоряется ли ускорение разработки? Если ускоряется - всё в порядке. Но когда же начинать добавлять сами результаты? Здесь два способа - либо когда это становится уже настолько легко и быстро, что почти не занимает времени, либо использовать формулу вида "чем ближе архитектура находится к состоянию, в котором она сможет поддерживать добавление всех фич, запланнированных в проекте, тем больше внимания можно уделять добавлению этих самых фич по сравнению с улучшением архитектуры". Второй способ является более сбалансированным и часто оптимальным, но если у проекта нет видимого конца жизни ( или он ещё неизвестен, или выглядит, что проект можно будет развивать бесконечно ) то первый предпочтительнее чтобы такой вот "конец жизни" проекту не создать самому. Конечно, есть здесь и подводные камни. Во-первых, может возникнуть over-engineering архитектуры, вплоть до состояния когда сам автор не в состоянии разобраться, что делает какой-то элегантный, но уж очень хитросплетённый код. Решение - балансировать техническую сложность частей кода, и не давать ей концентрироваться в одном месте, вовремя разделяя на более простые компоненты ( даже ценой потери некоторой элегантности ). Во-вторых, может возникнуть другая крайность - когда код настолько сильно фрагментирован, что изменения приходится делать во многих файлах ( которые ещё надо найти ). Решение - наоборот 'концентрировать' какие-то разрозненные части кода в ключевых местах, желательно там, где возможно какое-то элегантное решение, позволяющее уменьшить общий объём кода. Умение балансировать между этими двумя крайностями приходит только с опытом, здесь нет универсальной формулы. Иногда можно ориентироваться по ощущениям - если ощущается неудобство от постоянных поисков по коду - можно сконцентрировать, если ощущается дискомфорт от необходимости напрягаться, чтобы разобрать хитросплетённый шедевр - можно разбить на более простые части. Есть ещё зависимости от IQ, опыта программирования в целом и в конкретном языке, или в конкретной сфере ( например геймдев или веб ) - чем они выше, тем код продукта может быть сложнее, а, следовательно, элегантнее и его объём будет меньше. Нужно также учитывать других разработчиков, если имеются или если планируется подключить в будущем. Чем сложнее код - тем сложнее будет найти разработчиков ( кстати, вопреки распространённому мнению говнокод - самый простой для понимания вариант кода и разобраться в нём может практически любой ( другое дело что его архитектура ( точнее, её отсутствие ) постоянно способствует появлению багов от любого, казалось бы, несвязанного с этим, изменения ) , просто по ощущениям это как в говне копаться, хотя тут тоже зависит от разницы между уровнем говнокодности и например IQ человека, которому нужно будет с этим возиться, совсем зелёный джуниор может даже и не догадаться, что с кодом что-то не так ). В общем, надеюсь эти небольшие мысли вслух направят начинающих джуниоров-энтузиастов на правильный путь и позволят удасться тем их проектам, которые иначе провалились бы про причинам, описанным выше. ! protected by SuperBnW ( https://github.com/afwbkbc/superbnw ) ! Public key: https://github.com/afwbkbc/gpg/blob/master/5122E95DCC3CF31CE9F75D956AF7D685006F5088.asc -----BEGIN PGP SIGNATURE----- iQGzBAEBCgAdFiEEUSLpXcw88xzp912VavfWhQBvUIgFAl8h4jsACgkQavfWhQBv UIjYEgv/QnMfp3EY0oEyzgmxpEwHZZ75+MULMpUAZC9ey6QMsNYckK5eHcDJ1pki 7J9eZ6Y/6sLuAP0j7GfZhrpPOE8XmigGDsJcvLXvDmWx6LQ3tvWDda4Q0Tzcv3DA 4O+ehwCKafS5z93zHCO1Wlo2gaKyLGvpxGwPSF/yTMBjePcRJ0ibPlp87Il6H2gA 321Y1AcbMf6dmppmHL85jhpM9kA28UjqZSLjWVlELeVBcMzuYJjzQoTIi0k3gu+D Ms8xgCbDc7Hm+Sa6HVko2qIeWdh3TrCD7aYzqWjIlHvTjcP4ahQjY2YFcY9TFX2Z xwblPpoMD06sFmDQ5uY2mOKb+rAKfHaqjFho2iHlRDtFZYZZ8+KA6tFC5jYtXIHA gmk2aP1DaYQKNsIRj3dPYfujGGd+not7SazCEawBz5YvqD15twvn0VkNyzU2XRbE cipsbC7bYj01UNn7w+eBAjwwzI4rMP0dqeeJSyC88G62+yy6DXzIAPWVHyphB6Jy O/a4D0cu =x8Uc -----END PGP SIGNATURE-----
#YFXPYP (0) / @n / 1337 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.