Как видно, существует довольно много причин заниматься исследованием средств безопасности. Но проводить анализ защиты способен далеко не каждый человек. У разных людей могут быть совершенно разные склонности. Кому-то ближе естественные науки, общение с природой. Кто-то предпочитает заниматься социальными вопросами, изучать человека и общество. Кто-то тяготеет к точным наукам. Вариантов очень много. Но если рассматривать людей любой профессии, то их можно разделить на тех, у кого есть способности к программированию, и тех, у кого таких способностей нет. А что отличает программиста от непрограммиста? Какими специальными способностями должен обладать человек, чтобы ему хорошо давалось программирование? Программист занимается тем, что реализует алгоритмы на заданном языке программирования. В его распоряжении есть набор кубиков — разрешенных языком конструкций, и он складывает эти кубики таким образом, чтобы получилась нужная картинка, представляющая собой алгоритм. А критерий правильности картинки заключается в том, что для любых входных данных можно пройти до цепочке от первого до последнего кубика и получить заданный результат.
Разумеется, почти всегда существует более одного способа сложить кубики, но и конечные картинки будут отличаться по многим характеристикам. Будут расхождения в количестве использованных кубиков (в размере кода) и длине цепочки от первого до последнего кубика (в быстродействии). Некоторые кубики могут стоять неправильно (ошибки). И конечно, в результате будет различаться время, которое программист потратит на складывание картинки из кубиков. Программистом обычно становится тот, кому быстро удается складывать кубики. А хороший программист делает это быстро, использует минимальное число кубиков и не допускает при этом ошибок. Программирование — это умение решать задачи синтеза. Исследователем тоже может быть не каждый. Исследования — это решение задач анализа. Когда аналитику показывают целую картинку, он должен уметь быстро разобрать ее на отдельные кубики. Чаще всего, картинка представляется приблизительно — мелкие детали не видны, а некоторых фрагментов просто не хватает. И аналитик додумывает, что должно быть в отсутствующих местах и как именно был реализован тот или иной узел. И, конечно же, пытается найти ошибки, позволяющие заставить картинку вести себя не так, как планировал разработчик.
Почти всегда для того, чтобы понять, как работает программа, требуется начать думать так, как думал программист. И ирония заключается в том, что если программист был хороший и использовал оптимальные решения, то эти решения очень легко предсказать, и тогда даже по очень грубой схеме аналитик будет в состоянии воссоздать все детали. А вот если программу писал человек, не заботившийся о применении наиболее эффективных решений (по незнанию или намеренно), анализ становится значительно сложнее — приходится внимательно разглядывать каждую деталь. Именно по этому при реализации средств защиты требуется уходить от эффективности программирования — это затруднит проведение анализа противником. Кстати, несмотря на то, что исследователь программ должен хорошо представлять себе, как работает программист, совершенно не обязательно, что человеку, склонному к анализу, будет хорошо даваться синтез.
Умение хорошо программировать не является обязательным для аналитика. Точно оценить соотношение людей, способных к синтезу (программистов), и людей, способных к ан&тазу (исследователей), довольно сложно, но можно предположить, что на 95 программистов приходится примерно 5 исследователей. Подобное соотношение неплохо вписывается в существующую индустрию разработки программного обеспечения. Труд программиста требуется очень часто, а значит, у программиста есть шанс найти работу в огромном числе мест. Но хороших исследователей мало, и их переизбытка почти никогда не бывает, а значит, у аналитика меньше шансов потерять работу.