о хитром коде (программистское)
May. 21st, 2008 07:49 pmИнтересная блог-запись, подытоживающая фиаско с ssh-ключами в Дебиан.
Кроме того, что там подробно все объясняется, есть еще список советов разработчикам. Из них самый важный, по-моему, и тот, который на практике чаще всего игнорируют --
Don't write clever code.
Год или два назад у меня была подробная запись о том, что я не вполне уверен, что сейчас я лучший программист, чем был, скажем, 10 или 13 лет назад. Не уверен в том, что вообще есть накопление программистского мастерства и умения. Но вот это правило - пример чего-то, что я не знал и не понимал как следует десять и даже пять лет назад, по-моему. Если есть что-то, что я усвоил за последние несколько лет в своей профессии и что можно назвать фундаментально важным, то это оно - последовательное и принципиальное понимание и использование этого правила.
Кроме того, что там подробно все объясняется, есть еще список советов разработчикам. Из них самый важный, по-моему, и тот, который на практике чаще всего игнорируют --
Don't write clever code.
Год или два назад у меня была подробная запись о том, что я не вполне уверен, что сейчас я лучший программист, чем был, скажем, 10 или 13 лет назад. Не уверен в том, что вообще есть накопление программистского мастерства и умения. Но вот это правило - пример чего-то, что я не знал и не понимал как следует десять и даже пять лет назад, по-моему. Если есть что-то, что я усвоил за последние несколько лет в своей профессии и что можно назвать фундаментально важным, то это оно - последовательное и принципиальное понимание и использование этого правила.
no subject
Date: 2008-05-21 05:05 pm (UTC)no subject
Date: 2008-05-21 05:37 pm (UTC)no subject
Date: 2008-05-21 05:39 pm (UTC)no subject
Date: 2008-05-21 05:40 pm (UTC)no subject
Date: 2008-05-21 06:44 pm (UTC)write stupid code
no subject
Date: 2008-05-21 07:42 pm (UTC)code with clear logic
no subject
Date: 2008-05-21 11:07 pm (UTC)no subject
Date: 2008-05-21 05:19 pm (UTC)http://www.ozon.ru/context/detail/id/1927500/
no subject
Date: 2008-05-21 05:36 pm (UTC)no subject
Date: 2008-05-21 06:24 pm (UTC)... Using the Internet still looked and felt a lot like work ...
no subject
Date: 2008-05-21 06:41 pm (UTC)And if you do - document!
no subject
Date: 2008-05-21 11:10 pm (UTC)no subject
Date: 2008-05-21 09:14 pm (UTC)И вот тут-то действительно "засада"...
no subject
Date: 2008-05-21 09:34 pm (UTC)no subject
Date: 2008-05-21 09:44 pm (UTC)no subject
Date: 2008-05-21 11:11 pm (UTC)no subject
Date: 2008-05-22 06:57 am (UTC)no subject
Date: 2008-05-21 09:57 pm (UTC)no subject
Date: 2008-05-21 10:25 pm (UTC)Есть очевидная проблема с Debian - уровень maintainers очень разный и часто, прямо скажем, весьма низкий. Ну не самое интересное занятие-то перепаковывать чужой софт, там обычно молодые сисадмины с избытком свободного времени
Maintainer полез копаться в криптографии не понимая что к чему и сломал. Никто больше этого не сделал, потому что при мало-мальски существующем контроле этот код не достался бы человеку с такой квалификацией и изменение кода "чтобы заткнуть valgrind" никогда никто бы не одобрил
В принципе, это частая проблема с open source который именно пишется толпой, а не строго контролируется, как линуксный кернел, и не пишется на самом деле какой-то конторой с существующим development process
А код нормальный, надо как раз стараться писать clever code если выходит, тупой и так есть кому написать
no subject
Date: 2008-05-21 11:16 pm (UTC)no subject
Date: 2008-05-22 12:22 am (UTC)no subject
Date: 2008-05-22 05:21 am (UTC)Как я понимаю, дебиановец ошибочно решил, что где-то в другом месте зовется нормальный RAND_add() с нормальным источником энтропии.
no subject
Date: 2008-05-22 11:58 am (UTC)Но это все равно moot point, потому что дебиановец не смог понять не почему данные не инициализируют, а как работает RAND_add и убрал из нее главную строчку - где энтропию в дайджест добавляют.
no subject
Date: 2008-05-22 05:17 am (UTC)То есть хороши, конечно, оба - и openssl разработчик, и дебиановский майнтайнер. Но майнтайнера хотя бы можно по человечески понять - я бы тоже не ожидал обнаружить в коде уважаемой библиотеки такую фигню, а если бы обнаружил, то тоже решил бы, что это какая-то очень эзотерическая вещь для какого-нибудь очень эзотерического сочетания ОС, компилятора и требований, которую можно без большого вреда задизаблить. А со стороны OpenSSL это было чистое и ничем не оправдываемое вредительство.
no subject
Date: 2008-05-24 08:08 am (UTC)no subject
Date: 2008-05-21 11:09 pm (UTC)ПыСы: это ж каким смелым надо быть, чтобы лезть править что-то в коде openssl...
no subject
Date: 2008-05-22 05:19 am (UTC)no subject
Date: 2008-05-22 02:50 am (UTC)Есть более древний принцип - KISS (Keep it simple, stupid!)
Как говорил мой бывший начальник: "Будьте проще, и люди к вам потянутся"
no subject
Date: 2008-05-22 06:23 am (UTC)no subject
Date: 2008-05-22 08:01 am (UTC)В чём проблема написать короткую "умную" изящную функцию с чётко определённым поведением? Такие функции обычно сложнее понять, зато гораздо легче доказать их правильность (соответсвие спецификации).
Разумеется их гораздо сложнее менять. И тут главный вопрос, зачем нам их менять? Раз можно легко доказать их правильность, то багов в них скорее всего не будет. Т.е. в основном их изменения будут вызванны требованиями к дополнительной функциональности или изменением существующей.
И тут главный тезис - когда требуется дополнительная функциональность, часто правильней реализовать её в отдельной простой функции, чем делать более сложную исходную.
Ну и да, когда требуется измененить существующую функциоанальность лучше написать новую функцию заново, чем менять "умную". Однако при правильном дизайне дополнительные функции, которыми в данный момент не пользуются скорее всего только сделают библиотеку более богатой, и дальнейшие изменения более лёгкими.
no subject
Date: 2008-05-22 08:37 am (UTC)В чём проблема написать короткую "умную" изящную функцию с чётко определённым поведением? Такие функции обычно сложнее понять, зато гораздо легче доказать их правильность (соответсвие спецификации).
Доказательство правильности в реальном мире никогда не бывает полным, во всех случаях убедительным, да на самом деле его почти никогда и не бывает вообще. Как ты себе представляешь доказательство правильности функции "набрать энтропии из нескольких источников и добавить ее в общий pool"?
Кроме того, дело не только в функциях, и clever code проявляется не только на уровне функций. Я вчера просматривал код, который мне прислали на ревью, и он был clever code потому, что вводил умную, эффективную систему отношений между тремя разными классами - кто кого держит, кто кого освобождает, в некоторых случаях это закручивалось цепочкой, и возможность порочного круга элегантно разрешалась специальными умными проверками в нескольких разных методах. Эти проверки были корректными: после некоторых размышлений я убедился в том, что порочного круга или висящего указателя быть не может. Я предложил автору кода переписать всю систему отношений, сделав ее намного более простой, понятной, и традиционно-иерархичной.
no subject
Date: 2008-05-22 01:30 pm (UTC)Я на 100% согласен с приведённым тобой примером.
Я имел ввиду рекурсивные функции, для которых легко доказывается (ну или точнее показывается) их верность, зато понять их код, просто просматривая строчка за строчкой обычно менее тривиально.
no subject
Date: 2008-05-23 07:50 am (UTC)о памяти и мышление в старости и юности
Date: 2008-05-23 07:40 pm (UTC)Для программиста выводы такие, что изучать новое с возрастом труднее. Но разбираться в привычных вещах проще.
В частном случае, полиглоту, который знает 15 языков, освоить 16-тый несомненно проще, чем первый.