Entry tags:
Про говнокод
Один із робочих парадоксів що не перестають мене дивувати і вражати. Як так завжди виходить що говнокод стає успішним? Взяти, наприклад, мій CarWash. Код страшний як ходячий мрець. Купа ручного керування пам’яттю, власна реалізація приорітизованої черги, купа ниток там де достатньо було двох (і як наслідок - ад синхронізації), "C з класами" і все таке. Слава богу я хоч прибрав звідти sleep'и. Мені за нього страшно соромно, мені на нього навіть бридко дивитись. Говнокод як він є, недалекий від еталону. І при цьому код успішно працює уже два роки у, приблизно, сорока екземплярах, шести містах двох країн світу (і це тільки ті екземпляри про які я маю достовірну інформацію - у мене немає інформації щодо динаміки інсталяцій). Чи це не показник успіху?
З іншого боку, є кілька проектів якими я можу пишатися. З красивим кодом, нормальною системою зборки, з використанням сучасних технологій. Частина таких проектів працює в одному екземплярі (і то є у мене підозри що скоро й їх не стане) а інша взагалі "лежить у шухляді". Є кілька кльових і реально корисних штук які я починав писати, але все якось не вистачає часу довести їх до ума.
Звісно, можна списати все на те що коли писався говнокод - я був малий і дурний, але хто ж тоді пускає таких у production?! Тим паче що джерело пізнання невичерпне і деякі речі можна переписувати майже нескінченно.
Зараз мені просто жаль свого часу, який буде витрачено на пошук помилок чи написання тривіальних речей. Якщо це може зробити за мене компілятор - нехай він це і робить, у нього краще вийде.
Може причина у тому що говнокод пишуть для когось, а хороший код пишуть для себе? На хороший код приємно дивитись, він естетичний. І якщо він робить корисні речі - це просто додатковий бонус, не більше.
А може причина в іншому. Коли ти знаєш що ти пишеш, знаєш як воно працює, знаєш усі деталі предметної області, "живеш" проектом, коли ти проникнувся ним і тримаєш у голові усю структуру, без напруження "гуляєш" подумки рівнями абстракції і знаєш як його треба писати - хороший код виходить сам собою. Коли знаєш усі інваріанти то можеш максимально обмежити себе і тим самим спрямувати, не дати вийти за межі вірного русла (да, ви вірно подумали про строгу типізацію). З іншого боку, коли предметна область для тебе майже не знайома, коли просуваєшся навпомацки, постійно експериментуєш, намагаєшся передбачити всі варіанти майбутнього використання, коли на кожному кроці опиняєшся на роздоріжжі а прототип одразу де у життя - так і народжується говнокод. Завжди не вистачає часу на рефакторинг. Ніхто тобі не дасть переписати його "з нуля" (хіба що на свій страх і ризик, але дякую - я вже пробував, більше не хочу).
Реально, хто небуть бачив у software development нормальний цикл розробки: специфікація - прототип - прототип - продукт?
Свіжі приклади із реального світу: "Горбатого могила исправит", "Stop writing good code; start writing good software".
Ну і просто в тему: Transactional Memory in GCC.
З іншого боку, є кілька проектів якими я можу пишатися. З красивим кодом, нормальною системою зборки, з використанням сучасних технологій. Частина таких проектів працює в одному екземплярі (і то є у мене підозри що скоро й їх не стане) а інша взагалі "лежить у шухляді". Є кілька кльових і реально корисних штук які я починав писати, але все якось не вистачає часу довести їх до ума.
Звісно, можна списати все на те що коли писався говнокод - я був малий і дурний, але хто ж тоді пускає таких у production?! Тим паче що джерело пізнання невичерпне і деякі речі можна переписувати майже нескінченно.
Зараз мені просто жаль свого часу, який буде витрачено на пошук помилок чи написання тривіальних речей. Якщо це може зробити за мене компілятор - нехай він це і робить, у нього краще вийде.
Може причина у тому що говнокод пишуть для когось, а хороший код пишуть для себе? На хороший код приємно дивитись, він естетичний. І якщо він робить корисні речі - це просто додатковий бонус, не більше.
А може причина в іншому. Коли ти знаєш що ти пишеш, знаєш як воно працює, знаєш усі деталі предметної області, "живеш" проектом, коли ти проникнувся ним і тримаєш у голові усю структуру, без напруження "гуляєш" подумки рівнями абстракції і знаєш як його треба писати - хороший код виходить сам собою. Коли знаєш усі інваріанти то можеш максимально обмежити себе і тим самим спрямувати, не дати вийти за межі вірного русла (да, ви вірно подумали про строгу типізацію). З іншого боку, коли предметна область для тебе майже не знайома, коли просуваєшся навпомацки, постійно експериментуєш, намагаєшся передбачити всі варіанти майбутнього використання, коли на кожному кроці опиняєшся на роздоріжжі а прототип одразу де у життя - так і народжується говнокод. Завжди не вистачає часу на рефакторинг. Ніхто тобі не дасть переписати його "з нуля" (хіба що на свій страх і ризик, але дякую - я вже пробував, більше не хочу).
Реально, хто небуть бачив у software development нормальний цикл розробки: специфікація - прототип - прототип - продукт?
Свіжі приклади із реального світу: "Горбатого могила исправит", "Stop writing good code; start writing good software".
Ну і просто в тему: Transactional Memory in GCC.