Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

лекция типовые ошибки

935 views

Published on

Слайды к лекции о типовых ошибках при разработке ПО (на русском языке).

Published in: Technology
  • Be the first to comment

  • Be the first to like this

лекция типовые ошибки

  1. 1. Типовые ошибки приразработке ПО, и методы ихпредотвращенияЮрий Зеленский 2011 2012 © Itransition Group. Proprietary and Confidential 1
  2. 2. 2012 © Itransition Group. Proprietary and Confidential 2
  3. 3. Статистика1 (найденная, функциональная) ошибка каждый день количество проектов с issue/fte 10 9 8 7 6 5 4 3 2 1 0 0 4 8 12 16 20 24 28 32 36 40 44 48 52 54 2012 © Itransition Group. Proprietary and Confidential 3
  4. 4. Статистика 20-30 ошибок на kSloc “свежего” кода (1 на 40 строк) 1-5 ошибок на kSloc в тестированном release 10 строк в час – наша производительность Лучшие показатели (embedded в aerospace) 0.1/kSloc 35% изменений в support не вносят ошибок (international conference software maintainers 1998) 16% изменений вносят 15 и более ошибок 2012 © Itransition Group. Proprietary and Confidential 4
  5. 5. ОпределениеСистема возвращает некорректный илинеожидаемый результат фактическим и Расхождение между или ведет себянепредусмотренным результатами ожидаемым образомСинонимы:ошибка, дефект, проблема, отказ, сбой, неисправность, повреждение, несоответствие, особенность, bug, issue 2012 © Itransition Group. Proprietary and Confidential 5
  6. 6. Ошибка?send(to, from, count)register short *to, *from;register count;{ register n = (count + 7) / 8; switch(count % 8) { case 0: do { *to = *from++; case 7: *to = *from++; case 6: *to = *from++; case 5: *to = *from++; case 4: *to = *from++; case 3: *to = *from++; case 2: *to = *from++; case 1: *to = *from++; } while(--n > 0); }} 2012 © Itransition Group. Proprietary and Confidential 6
  7. 7. Так лучше?do { /* count > 0 assumed, “to” pointer have to have “volatile” qualifier */ *to = *from++; /* Note that the to pointer is NOT incremented */} while(--count > 0); 2012 © Itransition Group. Proprietary and Confidential 7
  8. 8. Основные причины ошибок Невежество Безразличие Лень 2012 © Itransition Group. Proprietary and Confidential 8
  9. 9. Основные средства предотвращения Кропотливость Дотошность Аккуратность Внимание к деталям Ответственность 2012 © Itransition Group. Proprietary and Confidential 9
  10. 10. Классификация по источнику Ошибки процессанет времени, нет разработчиков, нет менеджера, нет спецификации, нет issue tracking, нет version control, нет понимания задачи Ошибки проектирования Сложность, «велосипед» и другие design antipatterns. Ошибки программирования Copy paste, неряшливость, и другие подводные камни (aka pitfalls) 2012 © Itransition Group. Proprietary and Confidential 10
  11. 11. Классификация по типу Функциональные Проектирования и программирования: misconception Функциональные ошибки программирования Не функциональные Тестопригодность (модульная, интеграционная) Надежность Простота внесения изменений(читаемость, понятность) Безопасность Эффективность (производительность) Портируемость Пригодность к повторному использованию Сопровождаемость(читаемость, понятность, документиро ванность) 2012 © Itransition Group. Proprietary and Confidential 11
  12. 12. Функциональные ошибки программирования Логические: бесконечные циклы, off-by-one и т.п. Арифметические: деление на нуль, overflow, underflow Синтаксические: = вместо == и т.п. Ресурсные: неинициализированные значения, утечки памяти и ресурсов, переполнения буфера и стека Многопоточности: блокировки, гонки Интерфейсов: некорректное использование API, протоколов, аппаратных возможностей Производительности: алгоритмическая сложность, беспорядочные операции ввода вывода 2012 © Itransition Group. Proprietary and Confidential 12
  13. 13. Антипаттерн: определениеЧасто встречающийся подход к решениюпроблем, приводящий к однозначноотрицательным последствиям.http://c2.com/cgi/wiki?AntiPatternsCataloghttp://en.wikipedia.org/wiki/Antipatterns#Software_design_anti-patterns 2012 © Itransition Group. Proprietary and Confidential 13
  14. 14. Вот такая вот у нас ООПаГлобальные переменныеПоведение без состоянийНеобоснованное наследованиеLCOM4>3Божественный объект 2012 © Itransition Group. Proprietary and Confidential 14
  15. 15. Несколько (вопиющих) примеровНе аккуратненько как-то: не выравнено, неединообразно, при изменении размера всерасползается, не единообразно.Что в имени тебе моем: невнятные, или дажестандартные имена переменных, классов объектов.Button1 на Form1?! Вы что издеваетесь?Английский (можно подсматривать в словарь). Безакронимов! Не экономим символы! 2012 © Itransition Group. Proprietary and Confidential 15
  16. 16. Ещѐ примеры Волшебная кнопка, она же волшебная ASP, волшебная JSP, волшебный сервлет, монолитный сервлет. Неиспользование regexp (мне же, буквально, проверить email это или нет, что ради этого regexp учить?) Отсутствие контроля данных (это же мы сами сформировали параметр, тут не может быть других значений) Не использование кэша или бездумное использование кэша Ручной разбор текстовых форматов (xml, http, и т.п.) Ручная конкатенация данных для формирования текстовых представлений (sql, xml, html, и т.п.) Не использование пула ресурсов(подключений) Манипуляции с immutable объектами Магические константы 2012 © Itransition Group. Proprietary and Confidential 16
  17. 17. Ещѐ примерКомпактно, эффектно, возможно даже эффективно, но не читаемо.IOCCC открыт для всех. Эта программа играет в шахматы, всѐ ещѐгордитесь мастерством владения тернарным оператором?char*l="ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}" " 76Lsabcddcba .pknbrq PKNBRQ?A6J57IKJT576,+-48HLSU"; #define F getchar()&z #define v X(0,0,0,21, #define Z while(#define _ ;if( #define P return--G,y^=8, B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;X(w,c,h,e,S,s){intt,o,L,E,d,O=e,N=-M*M,K =78-h<<x,p,*g,n,*m,A,q,r,C,J,a=y?-x:x;y^=8;G++;d=w||s&&s>=h&&v0,0)>M;do{_ o=I[ p=O]){q=o&z^y _ q<7){A=q--&2?8:4;C=o-9&z?q["& .$ "]:42;do{r=I[p+=C[l]-64]_!w|p ==w){g=q|p+a-S?0:I+S _!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2){_ m=!(r-2&7))PG[1]=O, K;J=n=o&z;E=I[p-a]&z;t=q|E-7?n:(n+=2,6^y);Z n<=t){L=r?l[r&7]*9-189-h-q:0 _ s)L +=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+!(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A<2))+!(E^y^9)_ s>h||1<s&s==h&&L>z|d){p[I]=n,O[I]=m?*g=*m,*m=0:g?*g=0:0;L-=X(s>h|d?0:p,L-N,h+1,G[1],J=q|A>1?0:p,s)_!(h||s-1|B -O|i-n|p-b|L<-M))P y^=8,u=J;J=q-1|A<7||m||!s|d|r|o<z||v 0,0)>M;O[I]=o;p[I]=r;m?*m=*g,*g=0:g?*g=9^y:0;}_ L>N){*G=O _ s>1){_ h&&c-L<0)P L _!h)i=n,B=O,b=p;}N=L;}n+=J||(g=I+p,m=p<O?g-3:g+2,*m<z|m[O-p]||I[p+=p-O]);}}}}Z!r&q>2||(p=O,q|A>2|o>z&!r&&++C*--A));}}}Z++O>98?O=20:e-O);P N+M*M&&N>-K+1924|d?N:0;}main(){Z++B<121)*G++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;Z B=19){Z B++<99)putchar(B%x?l[B[I]|16]:x)_ x-(B=F)){i=I[B+=(x-F)*x]&z;b=F;b+=(x-F)*x;Z x-(*G=F))i=*G^8^y;}else v u,5);v u, 1);}} 2012 © Itransition Group. Proprietary and Confidential 17
  18. 18. А что делать? 2012 © Itransition Group. Proprietary and Confidential 18
  19. 19. Народная мудрость Если что-то может сломаться - оно обязательно сломается (закон Мѐрфи) Сложность – главный враг надежности Самые дешевые, быстрые и надежные компоненты – те, которых нет Два подхода: «так просто, что очевидно нет недостатков» и «так сложно, что нет очевидных недостатков» Сложность программы растет до тех пор, пока не превысит способности программиста Один волос на голове - слишком мало, в супе - слишком много 2012 © Itransition Group. Proprietary and Confidential 19
  20. 20. Практические советы Кропотливость Дотошность Аккуратность Внимание к деталям Ответственность 2012 © Itransition Group. Proprietary and Confidential 20
  21. 21. Ещѐ более практические советыИспользуйте уже отлаженный код. Не пишите свой. Изучайте(стандартные) библиотеки. Повесьте cheetsheet, убедитесьчто вы знаете про свою библиотеку все.Боритесь за простоту. Refactor! Пишите хорошиекомментарии и не пишите плохих, потому что это отнимаетвремя от написания хороших (плеоназмы, тавтологии ничемне лучше отсутствия комментария)Комментарий должен пояснять не что написано, а почему, ипочему именно так. Лучше большой комментарий набольшой кусок, чем много микро-комментариев.Именуйте все (extract method, extract variable).Пользуйтесь шаблонами IDE (как минимум всемистандартными). 2012 © Itransition Group. Proprietary and Confidential 21
  22. 22. И ещѐ советыНе используйте copy & paste – вы копируете ошибки! Do not repeat yourself!Регулярно проверяйте себя и окружающих на предметиспользования copy & paste (при помощи специальныхсредств)Если совсем невмоготу: можно cut & pasteЗапускайте автоформат, пусть ваш код будет (хотя бы)гладким и шелковистымЧитайте чужой код (например код библиотек вашего языка)Читайте свой кодПереведите написанное в коде на натуральный язык(обратная семантическая трассировка)Требуйте проведения code review (Fagan process какапофеоз peer review – это работает!) 2012 © Itransition Group. Proprietary and Confidential 22
  23. 23. И ещѐ советыОблегчите и ускорьте себе отладку. Под рукой должнабыть возможность запустить отладчик, даже если кодна далеком сервере.Экстернализируйте параметры конфигурации.Обеспечьте возможность их менять в runtime.Имейте хоть какой-то интеграционный тест.Используйте модульные тесты.Пользуйтесь edit & continue, hot replace и (или Ruby )Дефекты в последних изменениях. Самый частоменяемый файл – проблемный.Попробуйте time machine debug (intellitrace и подобные) 2012 © Itransition Group. Proprietary and Confidential 23
  24. 24. Последнее но не по значению Статический анализ кода Sonar (требуйте размещения своего проекта на корпоративном sonar сервере) FindBugs, FxCop, lint, PMD, тысячи их: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis Источник информации об antipatterns. 2012 © Itransition Group. Proprietary and Confidential 24
  25. 25. Статический анализ? 2012 © Itransition Group. Proprietary and Confidential 25
  26. 26. Статический анализ? Да, но не так! 2012 © Itransition Group. Proprietary and Confidential 26
  27. 27. Статический анализ! Да! Вот так! 2012 © Itransition Group. Proprietary and Confidential 27
  28. 28. 2012 © Itransition Group. Proprietary and Confidential 28
  29. 29. Физики шутятБорбаг (Bohrbug)Просто баг. Простой какпланетарная модель ядра. 2012 © Itransition Group. Proprietary and Confidential 29
  30. 30. Физики шутятГейзенбаг(Heisenbug)Баг который меняет своеповедение при попыткеего пронаблюдать. 2012 © Itransition Group. Proprietary and Confidential 30
  31. 31. Физики шутятМандельбаг(Mandelbug)Ошибки, чьи причинынастолько сложны инеясны, что кажутсяхаотичными (изавораживающими какодноименное множество). 2012 © Itransition Group. Proprietary and Confidential 31
  32. 32. Физики шутятШрединбаг(Schroedinbug)После того как в текстеобнаруживаетсякритическаяошибка, программа(ранее вполнеработающая) перестаетфункционировать. 2012 © Itransition Group. Proprietary and Confidential 32
  33. 33. Discuss! 2011www.itransition.com y.zelensky@itransition.com 2012 © Itransition Group. Proprietary and Confidential 33
  34. 34. Внеклассное чтение http://tinypaste.com/0659d1a1 2012 © Itransition Group. Proprietary and Confidential 34
  35. 35. Внеклассное чтениеhttp://en.wikipedia.org/wiki/Duffs_devicehttp://en.wikipedia.org/wiki/Software_bughttp://en.wikipedia.org/wiki/Software_bug#Common_types_of_computer_bugshttp://c2.com/cgi/wiki?AntiPatternsBookhttp://dou.ua/lenta/articles/resign-patterns/http://en.wikipedia.org/wiki/Anti-patternhttp://en.wikipedia.org/wiki/Antipatterns#Object-oriented_design_anti-patternshttp://en.wikipedia.org/wiki/Fagan_inspectionhttp://en.wikipedia.org/wiki/Category:Software_engineering_disastershttp://ru.wikipedia.org/wiki/Обратная_семантическая_трассировкаhttp://msdn.microsoft.com/en-us/library/dd264915.aspx //intelliTracehttp://www.lambdacs.com/debugger/ //historical debugger for Javahttp://www.chrononsystems.com/ //another historical debugger for Javahttp://en.wikipedia.org/wiki/SQALE#The_indiceshttp://quotes.cat-v.org/programming/http://lib.ru/ANEKDOTY/marphy.txthttp://www.opennet.ru/opennews/art.shtml?num=19763 //most widespread that lead to SW vulnerabilitieshttp://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/http://en.wikipedia.org/wiki/Toledo_Nanochesshttp://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysishttp://en.wikipedia.org/wiki/Static_program_analysishttp://www.aivosto.com/project/help/pm-oo-cohesion.htmlhttp://www.ozon.ru/context/detail/id/1425895/ //горький вкус Java 2012 © Itransition Group. Proprietary and Confidential 35

×