SlideShare une entreprise Scribd logo
1  sur  35
Типовые ошибки при
разработке ПО, и методы их
предотвращения
Юрий Зеленский
                                 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?AntiPatternsCatalog

http://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){int
t,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&&v
0,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))P
G[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!


                              2011
www.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/Duff's_device
http://en.wikipedia.org/wiki/Software_bug
http://en.wikipedia.org/wiki/Software_bug#Common_types_of_computer_bugs
http://c2.com/cgi/wiki?AntiPatternsBook
http://dou.ua/lenta/articles/resign-patterns/
http://en.wikipedia.org/wiki/Anti-pattern
http://en.wikipedia.org/wiki/Antipatterns#Object-oriented_design_anti-patterns
http://en.wikipedia.org/wiki/Fagan_inspection
http://en.wikipedia.org/wiki/Category:Software_engineering_disasters
http://ru.wikipedia.org/wiki/Обратная_семантическая_трассировка
http://msdn.microsoft.com/en-us/library/dd264915.aspx //intelliTrace
http://www.lambdacs.com/debugger/                     //historical debugger for Java
http://www.chrononsystems.com/                       //another historical debugger for Java
http://en.wikipedia.org/wiki/SQALE#The_indices
http://quotes.cat-v.org/programming/
http://lib.ru/ANEKDOTY/marphy.txt
http://www.opennet.ru/opennews/art.shtml?num=19763 //most widespread that lead to SW vulnerabilities
http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/
http://en.wikipedia.org/wiki/Toledo_Nanochess
http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
http://en.wikipedia.org/wiki/Static_program_analysis
http://www.aivosto.com/project/help/pm-oo-cohesion.html
http://www.ozon.ru/context/detail/id/1425895/ //горький вкус Java


                                2012 © Itransition Group. Proprietary and Confidential                 35

Contenu connexe

En vedette

Career Development в Epam Systems
Career Development в Epam SystemsCareer Development в Epam Systems
Career Development в Epam SystemsSQALab
 
внедрение облачных решений HP в компании EPAM
внедрение облачных решений HP в компании EPAMвнедрение облачных решений HP в компании EPAM
внедрение облачных решений HP в компании EPAMZaur Abutalimov
 
It meet up 2015 biology bioinformatics
It meet up 2015   biology bioinformaticsIt meet up 2015   biology bioinformatics
It meet up 2015 biology bioinformaticsVictoria Astapenko
 
Управление проектами в Cactussoft
Управление проектами в CactussoftУправление проектами в Cactussoft
Управление проектами в CactussoftAnna Barzakovskaya
 
Вяххи Н. Обучение биоинформатике. Форматы и опыт
Вяххи Н. Обучение биоинформатике. Форматы и опытВяххи Н. Обучение биоинформатике. Форматы и опыт
Вяххи Н. Обучение биоинформатике. Форматы и опытbigdatabm
 
DESIGN THE PRIORITY, PERFORMANCE 
AND UX
DESIGN THE PRIORITY, PERFORMANCE 
AND UXDESIGN THE PRIORITY, PERFORMANCE 
AND UX
DESIGN THE PRIORITY, PERFORMANCE 
AND UXPeter Rozek
 
Montreal Girl Geeks: Building the Modern Web
Montreal Girl Geeks: Building the Modern WebMontreal Girl Geeks: Building the Modern Web
Montreal Girl Geeks: Building the Modern WebRachel Andrew
 

En vedette (8)

Career Development в Epam Systems
Career Development в Epam SystemsCareer Development в Epam Systems
Career Development в Epam Systems
 
Cactus Soft1.Iphone Programming Begin
Cactus Soft1.Iphone Programming BeginCactus Soft1.Iphone Programming Begin
Cactus Soft1.Iphone Programming Begin
 
внедрение облачных решений HP в компании EPAM
внедрение облачных решений HP в компании EPAMвнедрение облачных решений HP в компании EPAM
внедрение облачных решений HP в компании EPAM
 
It meet up 2015 biology bioinformatics
It meet up 2015   biology bioinformaticsIt meet up 2015   biology bioinformatics
It meet up 2015 biology bioinformatics
 
Управление проектами в Cactussoft
Управление проектами в CactussoftУправление проектами в Cactussoft
Управление проектами в Cactussoft
 
Вяххи Н. Обучение биоинформатике. Форматы и опыт
Вяххи Н. Обучение биоинформатике. Форматы и опытВяххи Н. Обучение биоинформатике. Форматы и опыт
Вяххи Н. Обучение биоинформатике. Форматы и опыт
 
DESIGN THE PRIORITY, PERFORMANCE 
AND UX
DESIGN THE PRIORITY, PERFORMANCE 
AND UXDESIGN THE PRIORITY, PERFORMANCE 
AND UX
DESIGN THE PRIORITY, PERFORMANCE 
AND UX
 
Montreal Girl Geeks: Building the Modern Web
Montreal Girl Geeks: Building the Modern WebMontreal Girl Geeks: Building the Modern Web
Montreal Girl Geeks: Building the Modern Web
 

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

13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...IT-Portfolio
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестированияRina Uzhevko
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.Mad Devs
 
Programmers' Mistakes for Dummies
Programmers' Mistakes for DummiesProgrammers' Mistakes for Dummies
Programmers' Mistakes for DummiesCOTOHA
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDPavel Tsukanov
 
Debunking Risk Management in Software (RUS)
Debunking Risk Management in Software (RUS)Debunking Risk Management in Software (RUS)
Debunking Risk Management in Software (RUS)Alexey Kuznetsov
 
Разработка бизнес приложений (3)
Разработка бизнес приложений (3)Разработка бизнес приложений (3)
Разработка бизнес приложений (3)Alexander Gornik
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокSQALab
 
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17OdessaFrontend
 
Презентация "Анализ, проектирование и разработка корпоративных информационны...
Презентация "Анализ, проектирование  и разработка корпоративных информационны...Презентация "Анализ, проектирование  и разработка корпоративных информационны...
Презентация "Анализ, проектирование и разработка корпоративных информационны...ph.d. Dmitry Stepanov
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноBubon Makabra
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Fwdays
 
Шаги мануальщика к автоматизации на крупном проекте
Шаги мануальщика к автоматизации на крупном проектеШаги мануальщика к автоматизации на крупном проекте
Шаги мануальщика к автоматизации на крупном проектеSQALab
 
История про OpenSource в Яндексе
История про OpenSource в ЯндексеИстория про OpenSource в Яндексе
История про OpenSource в ЯндексеYandex
 
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex PetrovReal-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex PetrovRuby Meditation
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?etyumentcev
 

Similaire à лекция типовые ошибки (20)

13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
 
My presentation for PM-Forum in Ukraine
My presentation for PM-Forum in UkraineMy presentation for PM-Forum in Ukraine
My presentation for PM-Forum in Ukraine
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестирования
 
"Outside In". Web application testing.
"Outside In". Web application testing."Outside In". Web application testing.
"Outside In". Web application testing.
 
Programmers' Mistakes for Dummies
Programmers' Mistakes for DummiesProgrammers' Mistakes for Dummies
Programmers' Mistakes for Dummies
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
Debunking Risk Management in Software (RUS)
Debunking Risk Management in Software (RUS)Debunking Risk Management in Software (RUS)
Debunking Risk Management in Software (RUS)
 
Разработка бизнес приложений (3)
Разработка бизнес приложений (3)Разработка бизнес приложений (3)
Разработка бизнес приложений (3)
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибок
 
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
Частые ошибки при разработке фронтенда | Odessa Frontend Meetup #17
 
Презентация "Анализ, проектирование и разработка корпоративных информационны...
Презентация "Анализ, проектирование  и разработка корпоративных информационны...Презентация "Анализ, проектирование  и разработка корпоративных информационны...
Презентация "Анализ, проектирование и разработка корпоративных информационны...
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важно
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"
 
Шаги мануальщика к автоматизации на крупном проекте
Шаги мануальщика к автоматизации на крупном проектеШаги мануальщика к автоматизации на крупном проекте
Шаги мануальщика к автоматизации на крупном проекте
 
История про OpenSource в Яндексе
История про OpenSource в ЯндексеИстория про OpenSource в Яндексе
История про OpenSource в Яндексе
 
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex PetrovReal-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
Real-Time Error Alerting & Debugging Tools: Rollbar - Alex Petrov
 
idioms C++
idioms C++idioms C++
idioms C++
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 

Dernier (9)

Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 

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

  • 1. Типовые ошибки при разработке ПО, и методы их предотвращения Юрий Зеленский 2011 2012 © Itransition Group. Proprietary and Confidential 1
  • 2. 2012 © Itransition Group. Proprietary and Confidential 2
  • 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. Статистика  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. Определение Система возвращает некорректный или неожидаемый результат фактическим и Расхождение между или ведет себя непредусмотренным результатами ожидаемым образом Синонимы: ошибка, дефект, проблема, отказ, сбой, неиспр авность, повреждение, несоответствие, особен ность, bug, issue 2012 © Itransition Group. Proprietary and Confidential 5
  • 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. Так лучше? 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. Основные причины ошибок Невежество Безразличие Лень 2012 © Itransition Group. Proprietary and Confidential 8
  • 9. Основные средства предотвращения Кропотливость Дотошность Аккуратность Внимание к деталям Ответственность 2012 © Itransition Group. Proprietary and Confidential 9
  • 10. Классификация по источнику Ошибки процесса нет времени, нет разработчиков, нет менеджера, нет спецификации, нет issue tracking, нет version control, нет понимания задачи Ошибки проектирования Сложность, «велосипед» и другие design antipatterns. Ошибки программирования Copy paste, неряшливость, и другие подводные камни (aka pitfalls) 2012 © Itransition Group. Proprietary and Confidential 10
  • 11. Классификация по типу Функциональные  Проектирования и программирования: misconception  Функциональные ошибки программирования Не функциональные  Тестопригодность (модульная, интеграционная)  Надежность  Простота внесения изменений(читаемость, понятность)  Безопасность  Эффективность (производительность)  Портируемость  Пригодность к повторному использованию  Сопровождаемость(читаемость, понятность, документиро ванность) 2012 © Itransition Group. Proprietary and Confidential 11
  • 12. Функциональные ошибки программирования  Логические: бесконечные циклы, off-by-one и т.п.  Арифметические: деление на нуль, overflow, underflow  Синтаксические: = вместо == и т.п.  Ресурсные: неинициализированные значения, утечки памяти и ресурсов, переполнения буфера и стека  Многопоточности: блокировки, гонки  Интерфейсов: некорректное использование API, протоколов, аппаратных возможностей  Производительности: алгоритмическая сложность, беспорядочные операции ввода вывода 2012 © Itransition Group. Proprietary and Confidential 12
  • 13. Антипаттерн: определение Часто встречающийся подход к решению проблем, приводящий к однозначно отрицательным последствиям. http://c2.com/cgi/wiki?AntiPatternsCatalog http://en.wikipedia.org/wiki/Antipatterns#Software_design_ anti-patterns 2012 © Itransition Group. Proprietary and Confidential 13
  • 14. Вот такая вот у нас ООПа Глобальные переменные Поведение без состояний Необоснованное наследование LCOM4>3 Божественный объект 2012 © Itransition Group. Proprietary and Confidential 14
  • 15. Несколько (вопиющих) примеров Не аккуратненько как-то: не выравнено, не единообразно, при изменении размера все расползается, не единообразно. Что в имени тебе моем: невнятные, или даже стандартные имена переменных, классов объектов. Button1 на Form1?! Вы что издеваетесь? Английский (можно подсматривать в словарь). Без акронимов! Не экономим символы! 2012 © Itransition Group. Proprietary and Confidential 15
  • 16. Ещѐ примеры  Волшебная кнопка, она же волшебная ASP, волшебная JSP, волшебный сервлет, монолитный сервлет.  Неиспользование regexp (мне же, буквально, проверить email это или нет, что ради этого regexp учить?)  Отсутствие контроля данных (это же мы сами сформировали параметр, тут не может быть других значений)  Не использование кэша или бездумное использование кэша  Ручной разбор текстовых форматов (xml, http, и т.п.)  Ручная конкатенация данных для формирования текстовых представлений (sql, xml, html, и т.п.)  Не использование пула ресурсов(подключений)  Манипуляции с immutable объектами  Магические константы 2012 © Itransition Group. Proprietary and Confidential 16
  • 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){int t,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&&v 0,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))P G[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. А что делать? 2012 © Itransition Group. Proprietary and Confidential 18
  • 19. Народная мудрость  Если что-то может сломаться - оно обязательно сломается (закон Мѐрфи)  Сложность – главный враг надежности  Самые дешевые, быстрые и надежные компоненты – те, которых нет  Два подхода: «так просто, что очевидно нет недостатков» и «так сложно, что нет очевидных недостатков»  Сложность программы растет до тех пор, пока не превысит способности программиста  Один волос на голове - слишком мало, в супе - слишком много 2012 © Itransition Group. Proprietary and Confidential 19
  • 20. Практические советы Кропотливость Дотошность Аккуратность Внимание к деталям Ответственность 2012 © Itransition Group. Proprietary and Confidential 20
  • 21. Ещѐ более практические советы Используйте уже отлаженный код. Не пишите свой. Изучайте (стандартные) библиотеки. Повесьте cheetsheet, убедитесь что вы знаете про свою библиотеку все. Боритесь за простоту. Refactor! Пишите хорошие комментарии и не пишите плохих, потому что это отнимает время от написания хороших (плеоназмы, тавтологии ничем не лучше отсутствия комментария) Комментарий должен пояснять не что написано, а почему, и почему именно так. Лучше большой комментарий на большой кусок, чем много микро-комментариев. Именуйте все (extract method, extract variable). Пользуйтесь шаблонами IDE (как минимум всеми стандартными). 2012 © Itransition Group. Proprietary and Confidential 21
  • 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. И ещѐ советы Облегчите и ускорьте себе отладку. Под рукой должна быть возможность запустить отладчик, даже если код на далеком сервере. Экстернализируйте параметры конфигурации. Обеспечьте возможность их менять в runtime. Имейте хоть какой-то интеграционный тест. Используйте модульные тесты. Пользуйтесь edit & continue, hot replace и (или Ruby ) Дефекты в последних изменениях. Самый часто меняемый файл – проблемный. Попробуйте time machine debug (intellitrace и подобные) 2012 © Itransition Group. Proprietary and Confidential 23
  • 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. Статический анализ? 2012 © Itransition Group. Proprietary and Confidential 25
  • 26. Статический анализ? Да, но не так! 2012 © Itransition Group. Proprietary and Confidential 26
  • 27. Статический анализ! Да! Вот так! 2012 © Itransition Group. Proprietary and Confidential 27
  • 28. 2012 © Itransition Group. Proprietary and Confidential 28
  • 29. Физики шутят Борбаг (Bohrbug) Просто баг. Простой как планетарная модель ядра. 2012 © Itransition Group. Proprietary and Confidential 29
  • 30. Физики шутят Гейзенбаг (Heisenbug) Баг который меняет свое поведение при попытке его пронаблюдать. 2012 © Itransition Group. Proprietary and Confidential 30
  • 31. Физики шутят Мандельбаг (Mandelbug) Ошибки, чьи причины настолько сложны и неясны, что кажутся хаотичными (и завораживающими как одноименное множество). 2012 © Itransition Group. Proprietary and Confidential 31
  • 32. Физики шутят Шрединбаг (Schroedinbug) После того как в тексте обнаруживается критическая ошибка, программа (ранее вполне работающая) перестает функционировать. 2012 © Itransition Group. Proprietary and Confidential 32
  • 33. Discuss! 2011 www.itransition.com y.zelensky@itransition.com 2012 © Itransition Group. Proprietary and Confidential 33
  • 34. Внеклассное чтение http://tinypaste.com/0659d1a1 2012 © Itransition Group. Proprietary and Confidential 34
  • 35. Внеклассное чтение http://en.wikipedia.org/wiki/Duff's_device http://en.wikipedia.org/wiki/Software_bug http://en.wikipedia.org/wiki/Software_bug#Common_types_of_computer_bugs http://c2.com/cgi/wiki?AntiPatternsBook http://dou.ua/lenta/articles/resign-patterns/ http://en.wikipedia.org/wiki/Anti-pattern http://en.wikipedia.org/wiki/Antipatterns#Object-oriented_design_anti-patterns http://en.wikipedia.org/wiki/Fagan_inspection http://en.wikipedia.org/wiki/Category:Software_engineering_disasters http://ru.wikipedia.org/wiki/Обратная_семантическая_трассировка http://msdn.microsoft.com/en-us/library/dd264915.aspx //intelliTrace http://www.lambdacs.com/debugger/ //historical debugger for Java http://www.chrononsystems.com/ //another historical debugger for Java http://en.wikipedia.org/wiki/SQALE#The_indices http://quotes.cat-v.org/programming/ http://lib.ru/ANEKDOTY/marphy.txt http://www.opennet.ru/opennews/art.shtml?num=19763 //most widespread that lead to SW vulnerabilities http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ http://en.wikipedia.org/wiki/Toledo_Nanochess http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis http://en.wikipedia.org/wiki/Static_program_analysis http://www.aivosto.com/project/help/pm-oo-cohesion.html http://www.ozon.ru/context/detail/id/1425895/ //горький вкус Java 2012 © Itransition Group. Proprietary and Confidential 35

Notes de l'éditeur

  1. Не противопоставляется творческому подходу, но дополняет, усиливает эффект. Позволяет избежать потерь и меньшими силами достичь большего результата.
  2. Неотличимые программы, с разным исходным кодом и стоимостью владения, внесения изменений, развития.Безопасность – которую можно эксплуатировать – функциональный дефект. Фактические проблемы с масштабированием – функциональный.Неэффективность, потенциальная угроза безопасности – нефункциональный.Деффект это расхождение реальности с ожиданиями. Для нефункциональных критериев нужно понимать ожиданияНужно четко понимать, на какой компромис мы идем, например: читаемость vs. эффективность
  3. Off by one двух типов: из за нумерации с нуля и из за того что интервалов меньше чем вех
  4. Пусть лучше бедненько, но зато чистенько.Пусть уж безобразно, но хотя бы единообразноЗаButton1 раньше увольнялиЕсли затрудняетесь подобрать название, то вероятно вообще не понимаете что пишите.
  5. Нужно использовать правильно