На РСДН появился такой текст:
> -- Цитата:
> Сегодня я хочу поговорить о программировании. Если ты ничего не смыслишь в программировании, то я тебя пойму, если ты не станешь читать этот текст.Так уж получилось, как бы я этого не стыдился, но программирую я довольно хорошо. Я почти никогда не делаю ошибок, и уж тем более написанные мной программы никогда не "глючат". Они могут работать неверно, но я по поведению всегда знаю, где нужно исправить, а не мечусь в догадках. И, в ретроспективе, я недавно стал понимать, почему я не допускаю многих трудноуловимых ошибок.﻿Все это потому, что процесс моего программирования контролируется множеством фобий. Я очень боюсь многих программерских штучек, и это бережет мне много нервов. При этом меня очень расстраивает, когда другие знакомые программисты отважно хватаются голыми руками за вызывающие мой страх инструменты, особенно, когда с результатом их работы мне нужно потом работать.У меня накипело, и я выписал себе на досуге их в списочек — получился такой неплохой набор глав книги (возможно, уже написанной). Запишу себе его во вконтактик, чтобы не потерялся. Можешь и ты подумать, чем он может тебе быть полезен.1. Я очень боюсь потоков. Если ты, мой друг, думаешь, что при решении какой-то задачи тебе можно использовать потоки, то ты грубо ошибаешься. Если ты думаешь, что понимаешь, как они работают, и как их синхронизировать, то ты не прав. Если ты умеешь синхронизировать потоки через volatile bool, то это вряд ли.Количество задач, которые решаются потоками, настолько мало, что они уже все решены двадцать лет назад. Если ты нашел еще одну, то ты ошибся.Аккуратно используй файберы, если они предоставляются тебе языком программирования. Смело используй очереди сообщений операционной системы. Используй событийную модель. Используй раздельные процессы.2. Я очень боюсь модальных мессадж боксов. Если ты считаешь, что это хороший способ выводить служебную информацию, то ты заблуждаешься. Если ты думаешь, что это адекватный способ взаимодействия с пользователем, то тебя заочно ненавидят несколько человек. Если тебе кажется, что это удобный способ сообщить об ошибке, то тебе нужно креститься.Это отвратительный способ графического взаимодействия. Придумавший его человек в крайней степени нерукопожатен.Выводи служебную информацию в свой программерский лог. Пусть программа сама обработает ошибку, а не висит в нерабочем состоянии в ожидании "ОК". Не отвлекай пользователя на запрос, на который все равно один вариант ответа.Каждый день делай поиск по всему проекту на предмет "MessageBox" и удаляй все эти строки нещадно.3. Я очень боюсь исключений.﻿ Точнее, исключения, это очень хорошо, конечно, но в самой верхней функции ты должен ловить абсолютно все исключения (как программные, так и сбои в страничной защите, деление на ноль и т.п.). Если ты думаешь, что перечислил все возможные, то на всякий случай поставь еще фильтра на "все".Если ты поймал такое исключение, программа должна осознать, что она более не дееспособна, и отказываться от дальнейшего адекватного взаимодействия с внешним миром. Потому что твои данные уже испорчены (касается библиотек).Используй божественные возможности виндоуз по перехвату всех ошибок (SEH), подчищай за собой временные файлы, пытайся выковырять данные пользователя из умирающей программы. Рассчитывай, что прога должна при ближайшем перезапуске начать сразу же работать без дальнейшей настройки. Всегда отключай отображение операционной системой произошедшего в твоей программе сбоя.4. Я очень боюсь вычислений с плавающей точкой. Если ты с ними работаешь, то ты обязательно ошибешься в равенстве, все твои данные будут не-числами и бесконечностями. И записав такие числа в текстовый файл, ты его испортишь, потому что там будет какая-нибудь чушь, конечно же.Используй целочисленную арифметику всегда. Можешь добавить целочисленную же экспоненту. Не совершай никаких арифметических операций. Совершай их над какими-нибудь другими данными, а потом записывай в режиме read-only в свой double.﻿Если кривая дорога привела тебя к сравнению даблов, бери точность +/- 5%. Лучше 10%.5. Я очень боюсь использовать copy/paste. Его можно использовать только один раз, на второй раз нужно выделить логику в отдельную функцию. Весь скопированный текст должен быть в пределах одного экрана всегда. Если у тебя хорошая память и логика, и ты всегда вспомнишь, куда копировал, то у тебя большие проблемы с логикой и памятью.Постоянный рефакторинг. Визуальная группировка кода. Разделение на независимые модули.6. Я очень боюсь сложных программ. Если ты можешь ориентироваться больше, чем в 20 файлах с кодом, то я тебя тоже боюсь. Если ты организовал логичную и простую структуру папок и пакетов, то у тебя очень нелогичные представления о простоте. В сложных программах сложные ошибки.Нужно разбивать все на маленькие и независимые кусочки. Желательно, взаимодействующие в одном потоке на событийной модели, без мессадж боксов и дробных вычислений, и везде ловятся исключения.﻿7. Я очень боюсь делать то, что уже кто-то сделал. Хочешь написать свою собственную библиотеку с полезной фигней? Ты поплатишься. Придумал супер-крутой протокол? Ты провалишься. Оптимизировал формат файла под свои нужды? Ты уже проиграл.Гугли на code.google.com, sourceforge, github, codeplex готовые куски кода, библиотеки. Плюй на GPLv3, смело встраивай защищенные открытой лицензией куски в свой закрытый код. Потом разберешься. Используй готовые протоколы (даже если они тебе не очень подходят), ищи родные для твоего языка байндинги. Применяй старые добрые человеко-читаемые форматы файлов (и готовые библиотеки для работы с ними).8. Я очень боюсь работать со строками. Всегда используй кодировку только UTF-8. Нормализуй строки. Пропускай лишние непечатные символы (грязно используй для этого какую-нибудь готовую библиотеку регулярных выражений). Игнорируй те данные, которые тебя не интересуют.﻿Аллоцируй буфер в стеке и используй только безопасные функции, если работаешь низкоуровнево (а вообще, никогда не работай низкоуровнево).Всегда используй (специально выставляй, можно раз в пять секунд, для надежности) нейтральную локаль. В качестве разделителей CSV воспринимай как запятые, так и точки с запятой. Даты всегда пиши в формате YYYY-MM-DD.9. Я очень боюсь работать с файлами. Если есть возможность не работать с файлами — не работай. Если такой возможности нет — найди ее. Выставляй таймауты на файловые операции. В случае ошибки чтения, повтори еще пару раз. Позволяй считанным данным быть испорченными. Считай, что их редактировали перед этим в MS Word. Постоянно сохраняй промежуточные результаты. Желательно, в два разных места. Дублируй информацию в логах. После сохранения на всякий случай прочитай — вдруг не сохранилось.10. Я очень боюсь сетевых соединений. Пингуй собеседника как бешеный, раз в секунду. При потери соединения переприсоединяйся, не получается — продолжай пытаться. Проверяй приходящие данные на целостность. Проверяй версию программы-собеседника. Слушай пинги собеседника, если что — паникуй. Не используй низкоуровневые протоколы, ищи библиотеку с прозрачным переподключением и восстановлением данных.11. Я очень боюсь указателей. Если ты используешь язык, где можно использовать указатели — не используй. А лучше смени язык. Ты НЕ умеешь работать с памятью. Если ты используешь кучу, то она второй твой злейший враг (после тебя самого). Лучший способ освободить память — перезапускать программу. Если твоя программа ликает меньше одного мегабайта в час, то все ок, автоматически перезапускай ее каждые сутки в два часа ночи.Забудь об арифметических операциях на указателях. Обходи массивы по индексу. Не существует задачи, которую можно адекватно решить только указателями. Используй ссылки, глобальные переменные, аллоцируй буферы в стеке (в три раза больше, чем тебе нужны). Лови исключения, опять же.* * *Вот. Я боюсь всех этих вещей, поэтому не люблю программировать.
Можно раздербанить на лозунги-цитаты и регулярно повторять студентам на каждой лабе и лекции.