Я тут очень много думал ))) читал, в основном разные университетские курсы и конференции по computer science — как же продуктивнее всего научить(ся) писать ясный код без ошибок, и качественно |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2021-02-24 11:16 Я тут очень много думал ))) читал, в основном разные университетские курсы и конференции по computer science — как же продуктивнее всего научить(ся) писать ясный код без ошибок, и качественно проектировать систему, строить аккуратные и чистые архитектуры? Вроде бы очевидные и абсолютно нужные всем темки, и материалов по ним должно быть множество, ведь так? НО! Их практически ноль! …Конечно, самый мощный метод – через математику и формальную логику: fp, cs/tcs, toc, mltt, hott… Но даже самая короткая тропинка тут — это годы занятий, и то если повезёт, что будет возможность учиться в фоновом режиме, найдётся внятный курс, хороший ментор… Проблема, что в другой крайности — в программной инженерии, в чисто инженерных мэйнстримовских подходах, царит хаос, бессистемность и попса. Да и в целом, по темам даже прозаического code design, code quality, programming in small (про clean architectures я вообще молчу…) на уровне джуниора-миддла, относительно хороших инженерных книг (которые, невзирая на критику, изучить обязательно надо) — ну буквально может десяток, и все их вы наверняка знаете: — "Совершенный код" Стив Макконнелл — "Чистый код" Дядюшки Мартина, ну и другие его книжки ("Идеальный программист", "Чистая архитектура"…) — "Прагматичный программист" Ханта и Томаса — "Паттерны проектирования" от GoF и (лучше) от Фрименов — "Тестирование программного обеспечения" Канера — “Архитектура корпоративных программных приложений” + "Рефакторинг: улучшение существующего кода" Фаулера (про Мартина см ниже!) — "Эффективная работа с унаследованным кодом" Физерса — "Рефакторинг с использованием шаблонов" Кериевски — "Страсть к программированию" https://habr.com/ru/post/206198/ Про вечный десяток книг с наилучшим КПД для опытных программистов я рассказывал тут: https://vk.com/wall-152484379_2952 = = = Я регулярно отслеживаю по теме code design все выходящие книги (ноль в 2020-м) и статьи на конференциях и в блогах (ну может десяток от силы наскрёб),в которых были бы научные исследования, которые можно взять и после небольшого допиливания и обучения сразу применить в своей программистской работе. И это поразительно! что по темам, абсолютно актуальным каждому программисту, сильных материалов практически не найти. А вот по самым разным техническим деталям просто бесконечный поток статей. Думаю, что причина прозаична: действительно, гораздо проще написать статью о том, как запрограммировать АI для Доты в виде контейнерного микросервиса на Java, чем грамотно объяснить разработчикам, а) как писать хороший код и б) как правильно проектировать программу и в) как это делать на основе хороших математических формализмов, чтобы код получался ясным и безошибочным. Ну и, главное, что гораздо проще и гораздо выгоднее :) , клепать курсы «как быстро запилить свою мобильную игру на Godot» и «стань Java-программистом за 90 дней с гарантией трудоустройства», нежели учить, как правильно писать хороший код. С игрой и джавкой есть объективный результат, а вроде как тут не пойми что результатом получается. Точнее, важность good code design, я уверен, понимает любой программист, постоянно мучающийся с запутанностью кода и бесконечными багами. Проблема, что этого не хотят понимать его начальники в том плане, что их вполне устраивает, что если человек предсказуемо гонит 10-20 строк кривого кода в час с разумным уровнем багов, ну и хорошо. Пусть так и сидит годами на своей тысяче евро в месяц :) 80-90% ребят, которые приходят ко мне на курсы не с полного нуля (в том числе и студенты, и кто уже работает после университетов), делают элементарные ошибки в стиле кода (потенциальные баги фактически), избеганию которых я настойчиво учу на курсе с нуля с первых же занятий. Кто только научился у меня программировать, таких детских ошибок стиля не допускают, как те, кто уже давно работает! Правда, я с этим на работе нередко сталкивался, иной парень вроде хороший миддл, а код пишет ну такой кривой… Да что миддлы, у реально крутых сеньоров код тоже бывает, мягко говоря, далеко не идеальный. Так что это очень типичная ситуация. = = = В результате на таком пустынным поле и возникают разные мартины фаулеры, в книгах и курсах которых крупицы полезного намешаны с какими-то невообразимыми абстракциями, никогда не проверявшимися в серьёзных проектах. Но, зато продаются эти темы очень хорошо ))) Фаулер в своей нише фактически вообще один! Конечно, он какие-то сильные идеи постепенно прихватывает, так как годами варится в этой области, и корешится с некоторыми авторитетами, и конечно, я рекомендую его книги поизучать. Попытаюсь объяснить на пальцах, в чём недостаток книг вроде всяких «Рефакторингов». Например есть код function foo(n) : if n=0 then return 100 else if n=1 then return 200 (что нету отдельного итогового return, сейчас не важно) Вообще, if программисты интуитивно не любят, особенно вложенные, есть даже такое движение «программируй без if». И вот вас учат, что рефакторинг – это сделать массив a = [100, 200] и затем return a[n] Но это никакое не удаление IF !!! Ну, с научной точки зрения :) Правильное мышление, правильный code design — когда программист понимает, что никакой это не рефакторинг, потому что оба этих кода эквивалентны не только семантически, но и структурно! Мы по сути вообще НЕ изменили этот код! (есть тут большая теоретическая область — эквивалентные преобразования программ, где ещё в 1960-х гениальный Турчин написал свой Рефал, в чём-то непревзойдённый и по сей день) = = = Ключевая причина неверного code design в том, что вы пишете код просто как абстрактные формулы, и мыслите уровнем инструкций, а правильно — везде надо видеть смысл. Значения 100 и 200, индексы 0 и 1 обязательно несут в себе какой-то конкретный смысл в вашей программе! Поэтому, наглядные имена переменных и констант, и подробные комментарии в частности очень полезны и всегда это надо делать, но это не панацея и не универсальное правило, как его часто преподносят на курсах, а наоборот – логическое следствие правильного подхода, как правильно думать о задаче, что вообще такое хороший code design. Умение мыслить на уровне смысла вашего кода – это и есть ключ к хорошему code desing/quality! Сейчас также в средах разработки предлагаются десятки метрик кода, которые оценивают его «хорошесть», и конечно снижать ту же запутанность, связанность всегда полезно. Однако косвенный эффект метрик в том, что программисты начинают механически подгонять свой код под них, и результат может получиться ещё хуже, потому что рефакторить, развивать, улучшать свой код надо на более высоком абстрактном уровне — на уровне его логического понимания! Сермяга в том, что это логическое понимание напрямую, «физически» в коде воплотить невозможно. А как это делать правильно, этой весной я вас буду учить :) = = = На тему хорошего кода написано, как я говорил, немного — десятки книг, может сотни статей, но везде предлагается чисто инженерный подход, набор best practices, которые были нащупаны интуитивно. Вдобавок везде, особенно в programming in large, предлагаются «оригинальные» конкретные методики или подходы, которым надо специально довольно долго обучаться (тот же набор паттернов проектирования например), но почему они именно такие? Довольно часто они — просто неформальное представление достаточно глубоких формальных описаний, случайное открытие их кусочков вслепую. Короче говоря, я думаю о том, как научить(ся) good code design/quality, programming in small/in large так, чтобы не надо было привязываться к конкретным методикам и долго их изучать. Чтобы это был Jeet Kune-Do – стиль, свободный от стилей, по Брюсу Ли. Чтобы использовать подходящие сильные идеи из математической логики, но не погружаясь во все эти формализмы, не тратя на них время – чтобы сразу сделать просветляющий прыжок к интуитивному пониманию, что такое хороший код и хороший дизайн системы. Чтобы, пройдя 10-часовое обучение, получить результат в плане понимания good code design на 80% такой, какой другие получают, тратя 10 лет на theoretical computer science. (продолжение следует :) Источник: vk.com Комментарии: |
|