• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
лекция типовые ошибки
 

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

on

  • 749 views

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

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

Statistics

Views

Total Views
749
Views on SlideShare
749
Embed Views
0

Actions

Likes
0
Downloads
9
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Не противопоставляется творческому подходу, но дополняет, усиливает эффект. Позволяет избежать потерь и меньшими силами достичь большего результата.
  • Неотличимые программы, с разным исходным кодом и стоимостью владения, внесения изменений, развития.Безопасность – которую можно эксплуатировать – функциональный дефект. Фактические проблемы с масштабированием – функциональный.Неэффективность, потенциальная угроза безопасности – нефункциональный.Деффект это расхождение реальности с ожиданиями. Для нефункциональных критериев нужно понимать ожиданияНужно четко понимать, на какой компромис мы идем, например: читаемость vs. эффективность
  • Off by one двух типов: из за нумерации с нуля и из за того что интервалов меньше чем вех
  • Пусть лучше бедненько, но зато чистенько.Пусть уж безобразно, но хотя бы единообразноЗаButton1 раньше увольнялиЕсли затрудняетесь подобрать название, то вероятно вообще не понимаете что пишите.
  • Нужно использовать правильно

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

  • Типовые ошибки приразработке ПО, и методы ихпредотвращенияЮрий Зеленский 2011 2012 © Itransition Group. Proprietary and Confidential 1
  • 2012 © Itransition Group. Proprietary and Confidential 2
  • Статистика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
  • Статистика 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
  • ОпределениеСистема возвращает некорректный илинеожидаемый результат фактическим и Расхождение между или ведет себянепредусмотренным результатами ожидаемым образомСинонимы:ошибка, дефект, проблема, отказ, сбой, неисправность, повреждение, несоответствие, особенность, bug, issue 2012 © Itransition Group. Proprietary and Confidential 5
  • Ошибка?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
  • Так лучше?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
  • Основные причины ошибок Невежество Безразличие Лень 2012 © Itransition Group. Proprietary and Confidential 8
  • Основные средства предотвращения Кропотливость Дотошность Аккуратность Внимание к деталям Ответственность 2012 © Itransition Group. Proprietary and Confidential 9
  • Классификация по источнику Ошибки процессанет времени, нет разработчиков, нет менеджера, нет спецификации, нет issue tracking, нет version control, нет понимания задачи Ошибки проектирования Сложность, «велосипед» и другие design antipatterns. Ошибки программирования Copy paste, неряшливость, и другие подводные камни (aka pitfalls) 2012 © Itransition Group. Proprietary and Confidential 10
  • Классификация по типу Функциональные Проектирования и программирования: misconception Функциональные ошибки программирования Не функциональные Тестопригодность (модульная, интеграционная) Надежность Простота внесения изменений(читаемость, понятность) Безопасность Эффективность (производительность) Портируемость Пригодность к повторному использованию Сопровождаемость(читаемость, понятность, документиро ванность) 2012 © Itransition Group. Proprietary and Confidential 11
  • Функциональные ошибки программирования Логические: бесконечные циклы, off-by-one и т.п. Арифметические: деление на нуль, overflow, underflow Синтаксические: = вместо == и т.п. Ресурсные: неинициализированные значения, утечки памяти и ресурсов, переполнения буфера и стека Многопоточности: блокировки, гонки Интерфейсов: некорректное использование API, протоколов, аппаратных возможностей Производительности: алгоритмическая сложность, беспорядочные операции ввода вывода 2012 © Itransition Group. Proprietary and Confidential 12
  • Антипаттерн: определениеЧасто встречающийся подход к решениюпроблем, приводящий к однозначноотрицательным последствиям.http://c2.com/cgi/wiki?AntiPatternsCataloghttp://en.wikipedia.org/wiki/Antipatterns#Software_design_anti-patterns 2012 © Itransition Group. Proprietary and Confidential 13
  • Вот такая вот у нас ООПаГлобальные переменныеПоведение без состоянийНеобоснованное наследованиеLCOM4>3Божественный объект 2012 © Itransition Group. Proprietary and Confidential 14
  • Несколько (вопиющих) примеровНе аккуратненько как-то: не выравнено, неединообразно, при изменении размера всерасползается, не единообразно.Что в имени тебе моем: невнятные, или дажестандартные имена переменных, классов объектов.Button1 на Form1?! Вы что издеваетесь?Английский (можно подсматривать в словарь). Безакронимов! Не экономим символы! 2012 © Itransition Group. Proprietary and Confidential 15
  • Ещѐ примеры Волшебная кнопка, она же волшебная ASP, волшебная JSP, волшебный сервлет, монолитный сервлет. Неиспользование regexp (мне же, буквально, проверить email это или нет, что ради этого regexp учить?) Отсутствие контроля данных (это же мы сами сформировали параметр, тут не может быть других значений) Не использование кэша или бездумное использование кэша Ручной разбор текстовых форматов (xml, http, и т.п.) Ручная конкатенация данных для формирования текстовых представлений (sql, xml, html, и т.п.) Не использование пула ресурсов(подключений) Манипуляции с immutable объектами Магические константы 2012 © Itransition Group. Proprietary and Confidential 16
  • Ещѐ примерКомпактно, эффектно, возможно даже эффективно, но не читаемо.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
  • А что делать? 2012 © Itransition Group. Proprietary and Confidential 18
  • Народная мудрость Если что-то может сломаться - оно обязательно сломается (закон Мѐрфи) Сложность – главный враг надежности Самые дешевые, быстрые и надежные компоненты – те, которых нет Два подхода: «так просто, что очевидно нет недостатков» и «так сложно, что нет очевидных недостатков» Сложность программы растет до тех пор, пока не превысит способности программиста Один волос на голове - слишком мало, в супе - слишком много 2012 © Itransition Group. Proprietary and Confidential 19
  • Практические советы Кропотливость Дотошность Аккуратность Внимание к деталям Ответственность 2012 © Itransition Group. Proprietary and Confidential 20
  • Ещѐ более практические советыИспользуйте уже отлаженный код. Не пишите свой. Изучайте(стандартные) библиотеки. Повесьте cheetsheet, убедитесьчто вы знаете про свою библиотеку все.Боритесь за простоту. Refactor! Пишите хорошиекомментарии и не пишите плохих, потому что это отнимаетвремя от написания хороших (плеоназмы, тавтологии ничемне лучше отсутствия комментария)Комментарий должен пояснять не что написано, а почему, ипочему именно так. Лучше большой комментарий набольшой кусок, чем много микро-комментариев.Именуйте все (extract method, extract variable).Пользуйтесь шаблонами IDE (как минимум всемистандартными). 2012 © Itransition Group. Proprietary and Confidential 21
  • И ещѐ советыНе используйте copy & paste – вы копируете ошибки! Do not repeat yourself!Регулярно проверяйте себя и окружающих на предметиспользования copy & paste (при помощи специальныхсредств)Если совсем невмоготу: можно cut & pasteЗапускайте автоформат, пусть ваш код будет (хотя бы)гладким и шелковистымЧитайте чужой код (например код библиотек вашего языка)Читайте свой кодПереведите написанное в коде на натуральный язык(обратная семантическая трассировка)Требуйте проведения code review (Fagan process какапофеоз peer review – это работает!) 2012 © Itransition Group. Proprietary and Confidential 22
  • И ещѐ советыОблегчите и ускорьте себе отладку. Под рукой должнабыть возможность запустить отладчик, даже если кодна далеком сервере.Экстернализируйте параметры конфигурации.Обеспечьте возможность их менять в runtime.Имейте хоть какой-то интеграционный тест.Используйте модульные тесты.Пользуйтесь edit & continue, hot replace и (или Ruby )Дефекты в последних изменениях. Самый частоменяемый файл – проблемный.Попробуйте time machine debug (intellitrace и подобные) 2012 © Itransition Group. Proprietary and Confidential 23
  • Последнее но не по значению Статический анализ кода 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
  • Статический анализ? 2012 © Itransition Group. Proprietary and Confidential 25
  • Статический анализ? Да, но не так! 2012 © Itransition Group. Proprietary and Confidential 26
  • Статический анализ! Да! Вот так! 2012 © Itransition Group. Proprietary and Confidential 27
  • 2012 © Itransition Group. Proprietary and Confidential 28
  • Физики шутятБорбаг (Bohrbug)Просто баг. Простой какпланетарная модель ядра. 2012 © Itransition Group. Proprietary and Confidential 29
  • Физики шутятГейзенбаг(Heisenbug)Баг который меняет своеповедение при попыткеего пронаблюдать. 2012 © Itransition Group. Proprietary and Confidential 30
  • Физики шутятМандельбаг(Mandelbug)Ошибки, чьи причинынастолько сложны инеясны, что кажутсяхаотичными (изавораживающими какодноименное множество). 2012 © Itransition Group. Proprietary and Confidential 31
  • Физики шутятШрединбаг(Schroedinbug)После того как в текстеобнаруживаетсякритическаяошибка, программа(ранее вполнеработающая) перестаетфункционировать. 2012 © Itransition Group. Proprietary and Confidential 32
  • Discuss! 2011www.itransition.com y.zelensky@itransition.com 2012 © Itransition Group. Proprietary and Confidential 33
  • Внеклассное чтение http://tinypaste.com/0659d1a1 2012 © Itransition Group. Proprietary and Confidential 34
  • Внеклассное чтение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