Archive for January, 2009

О тупых программистах.

Friday, January 30th, 2009

Осторожно, очень много букв :)

Есть у меня один очень умный друг, которого абсолютно не возможно переспорить :) Причем не из-за того, что он применяет какие-то нечестные метода спора, а просто потому, что количество знаний в его голове помноженные на его умение ими оперировать оставляют меня далеко позади :)

Кстати,  именно он подкинул мне идею (был ее автором) самой моей любимой серии статей про программистский синхрофазатрон.

И вот, собственно, смирившись с невозможность победить в online споре, я решил перейти в offline режим, где смогу детализировано рассмотреть проблему.

Ну, и о проблеме… Этот самый друг, очень хороший программист – высшего пилотажа. И с его высоты большое количество программистов кажутся откровенно плохими. Но суть спора даже не о том, плохие они или нет, а выгодно ли фирме иметь этих программистов или не выгодно. И вот тут у нас как раз и разошлись мнения.

Он высказал идею, что такие программисты приносят только убыль. Я же высказал мнение, что программиста нельзя  так просто отнести к категории приносящих прибыль или убыль (даже если ответ кажется абсолютно интуитивно точным) и что не так уж плохи с точки зрения компаний, даже слабые программисты.

Естественно, в такой формулировке, самая большая проблема определиться, кого мы называем хорошим или плохим программистом, а уж потом взяв плохо пытаться выяснить его ценность для фирмы.

Так, вот, попытаюсь перенести спор чуть в другую плоскость, в которой можно будет не определять границ между плохими и хорошими программистами. Что я попытаюсь показать, что есть определенная категория программистов, которая с точки зрения хорошего программиста приносят только убыль, а с точки зрения предпринимателя приносят прибыль. И второе, что хочу показать, что при определенных условиях эта категория программистов будет достаточно большой. Собственно, в случае такого различия естественно программистская точка зрения о качестве других программистов будет гораздо менее ценной, так как будет является вторичной. Я имею в виду, что если оценка программистов не совпадает с тем, что приносит деньги фирме, то ее можно использовать разве что для самовыражения нелюбви к плохим программистам, но не для принятия бизнес решений (например увольнения).

Итак начнемс…

Приведу три точки зрения. Первая – точка зрения программиста, вторая точка зрения менеджера, третья – точка зрения предпринимателя.

С точки зрения хорошего программиста Пети. Работа выглядит так
- Васе дали задачу, которую Петя мог сделать за 5 часа
- Вася поморочил Пети голову 2.5 часа, чтобы понять как ее сделать
- Вася проработал над задачей 20 часов пока не сделал
- Пете еще 2.5 потом пытается привести в порядок, то что натворил Вася

- Качество результата вышло хуже, чем если бы Петя делал сам.

Из этого следует, что если мы Васю уволим, то Петя потратит на эту задачу 5 часов и сделает (вместо объяснения, как ее делать), а фирма в результате потратит меньше денег. Вывод, Вася плохой программист и имеет отрицательную эффективность (только вытягивает на себя деньги).

Знаю, что есть задачи, которые плохие программисты может вообще не смогут сделать. Но чаще всего процент таких задач небольшой и их таки отдают хорошим программистам.  На остальных задачах чаще всего можно таки найти соотношения сколько часов плохой программист потратит своих и чужих, чтобы решить задачу.

Теперь с точки зрения менеджера, который должен контролировать результаты, бюджет, сроки. Я бы даже сказал, менеджера близкого по духу к предпринимателю.

Менеджер мыслит примерно так (естественно не с такими детальными выкладками)

Итак у нас есть две системы (два программиста), на входе задачи (требования) и деньги и на выходе код выполняющий требую функциональность. Зафиксируем требования (включая функциональность и качество) и будем измерять сколько понадобиться денег пустить в систему, чтобы получить одинаковый результат. Ну и соотношение того, сколько нужно одному программисту денег на выполнение и другому и есть соотношение их эффективности.

Ну, пожалуй, если хотеть в эту формулу еще можно добавить время. Например за дополнительную длительность выполнения задачи засчитывать какие-то дополнительные штрафные суммы.

Кстати, входные деньги – это не только деньги на зарплату программисту, но и на например покупку книг, или оплату другому программисту время консультаций и т.п.

Как результат, если мы возьмем очень эффективного программиста и начнем относительно него измерять других программистов, мы обнаружим, что другие программисты могут быть скажем от 2 до 50 раз менее эффективны.

Кстати, заметьте я сказал – самого эффективного, а не самого лучшего. Вполне возможно, что лучший программист получает большую зарплату (из-за обширных знаний в разных областях и хорошее знание проекта), но на конкретной задаче не может быть гораздо быстрее чем просто хороший программист. Тогда, соответственно, его эффективность будет чуть ниже (но это не столь важно, чаще всего таки самый лучший программист является и самым эффективным).

Ну и просто, для того, чтобы показать, что значит в 50 раз менее эффективны. Это значит, что хороший программист задачу сделает за 1 неделю, плохой программист за 1 год.

Небольшое замечание по измерению оценки. Программист оценивает других программистах в терминах “на” – Вася сделает туже задачу _на_ X долларов дороже чем я, поэтому Вася не нужен. Менеджер измеряет в терминах “в”. Вася сделает туже задачу _в_ Y раза дороже.

Теперь следующий шаг в оценках менеджера. Пусть мы знаем, что задача которая подается программистам на вход должна принести скажем $10k. Самый эффективный программист на ее решение тратит $1k. Из этого следует, что все кто эффективны менее чем в 10 раз, будут тратить больше $10k и значит, что они приносят фирме уже только убыль. И чем больше они работают, тем большую убыль приносят. Так, что их таки можно увольнять.

Возвращаясь к Васе. Пусть Вася по этой формуле оказался в 4 раза менее эффективным. Тем не менее, с решенной задачи мы все еще имеем $10k – $4k = $6k прибыли.
Хотя безусловно, если Васю уволить, то получится $9k прибыли.

То есть Вася таки малоэффективен, но если он будет поменьше потреблять времени Пети, то почему бы нам и не оставить Васю работать, так как с него идет прибыль.Плюс, Вася подстаховывает нас на случай болезни или ухода Пети.

То есть, если у него эффективность жуткая (в 7 раз хуже, чем у Пети), но работает он автономно и Петю не трогает вообще, то тогда, получается, что они вдвоем могут приносить $10k-$1k (Петя) + $10k-$7k (Вася) = $12k. А если Васю уволить, то прибыль падает до $9k.

Ну и теперь с точки зрения предпринимателя.

Базируем ее на точки зрения точке зрения менеджера. Только введем некоторые дополнительные параметры.

- Во первых требуемое качество – это не константа, а некий диапазон. В целом программа должна находится внутри диапазона, но каждая ее задаче не обязательно должна находиться в нем.

Итого, когда у нас диапазон качества, в абсолютно условных цифрах от 3 до 5. То вполне возможно, Вася сделал бы задачу с качеством 3 с той же эффективность, которое Петя делает задачу с качеством 8 (с одной стороны такое качество просто и не нужно, с другой стороны Петю ругать за дополнительное качество тоже было бы странно, да и плюс именно из-за Пети в целом программа не выпадает из диапазона).

Заметьте, как мыслит программист

а) Берется факт о случившейся ситуации где эффективность другого программиста была низкая

б) Из факта делается индукция, что у программиста всегда эффективность низкая (индукция тут не совсем правильна, но в целом, конечно вывод получается правильный, что у программиста низкая эффективность)

в) Но самое важное, что вся ситуация рассматривается с точки зрения, что плохой программист всегда потребит время хорошего и что еще более важно, ситуация рассматривается в статике. То есть – это выглядит, как будто одновременно происходит расход денег на плохого и хорошего программиста и доход от исполнения задачи.

На самом же деле расход и доход динамичен. Он происходит в разные моменты времени.

Вернемся к примеру, который привел программист. Если плохой программист тратит в одной точки времени 5 часов хорошего, 20 часов своих и после этого в какой-то момент получается прибыль $10k, то действительно второй программист паразитирует в прямом смысле слова.

Но, представим себе, что происходит чуть по другом, плохой программист делает кое-как задачу, дальше получается прибыль от новой функциональности, дальше он доводит ее до ума, но она все равно плохо работает, дальше он тратит время хорошего, чтобы понять, как сделать правильно и доделывает сам. По факту, он потратил столько же денег, так что по формулам программиста и менеджера он все еще низкоэффективен. С точки зрения предпринимателя, он уже принес прибыль и только после потратил некоторое дополнительное количество денег на “поддержку” кода.

Для того, чтобы все стало на свои места, возьмем фирму из 30 плохих и 3 хороших программистов. Если мы слушаем 3 хороших, то мы увольняем всех плохих и ждем пока хорошие сделают всю работу которые делали бы плохие. Проблема заключается в том, что плохие хоть и были менее эффективны, но делали ее параллельно. Хорошие более эффективны, но делают ее последовательно. Итого, вместо выпуска через месяц и получения дохода, выпуск происходит через два месяца.

Получается, что фирма, которая увольняет всех плохих программистов в результате выпускает продукт позже и за это получает некий штраф (недополученная прибыль, потеря части рынка).

Естественно, наиболее хороший и логичный ответ, что в фирму из 3 хороших программистов нужно нанять еще 3 и они по быстродействию (даже последовательному)  станут быстрее, чем 30 плохих программистов.

Тут кроется одна проблема, это хорошо масштабируется от 1 до 5 хороших программистов, плохо от 5 до 50 и не масштабируется фактически вообще от 50 до 500 программистов. Поэтому для увеличения прибыли и сокращения сроков, компании проще нанимать 50 хороших программистов и 500 плохих, чем 100 хороших.

И последняя особенность.  В формуле прибыль = доход – расход, и доход и расход на самом деле являются не константами, а функциями.

Во первых, если фирма имеет большие продажи, то тогда доход от одной и той же функциональности может быть разный. И вот возникает интересный эффект. Если доход $10k, при расходах $1k и $7k – то отличие хороших и плохих программистов очень чувствительно (так как это изменяет прибыли от 90% дохода до 30% дохода). А вот если доход составит $100k, то разница между хороших и плохим программистов фактически не чувствуется (99% или 93%).

Важное замечание, которые мне написали: Это естественно более актуально для продуктов, где прибыль зависит от объема продаж. Для попроектной работы, прибыль заранее фиксирован. Более того, чаще всего они сильно прижат конкуренцией за исполнение проекта.

И вторая функция – это расход. Как я уже писал, если плохой программист Вася не сильно теребит Петю, то для фирмы он становится гораздо более выгодный. Так вот, в маленьких фирмах Вася мучает Петю достаточно много, так как нету никаких процессов. В большой же фирме (в правильно построенной большой фирме) есть достаточно большое количество процессов по сбору, обработке требования, тестированию, разработке архитектуры. Все это процессы с одной стороны затратны, с другой стороны, позволяют Васе работать над гораздо более определенной задачей (с готовыми требованиями, архитектурой и т.п.), что уменьшает его необходимость в Пете.

Фух… Подводя к итогам всю эту фигню, которую я написал.

а) Идеальная ситуация – много хороших программистов, нету плохих. Ситуация идеальная, но недостижима из-за плохого масштабирования найма хороших программистов.

б) Из-за пункта а) и больших штрафов при более позднем выпуске продуктов, компаниям выгодно распараллеливать работу нанимая средних и плохих программистов.

в) Да, плохие программисты менее эффективны, но благодаря увеличению продаж и улучшению процессов, они могут приносить прибыль, причем при определенных условия прибыль не многим меньше, чем хорошие программисты.

г) Выгода использование плохих программистов растет с ростом соотношения прибыль/размер задачи и с улучшением процессов. Мне кажется, что это актуально для больших фирм и менее актуально для маленьких

в) Плохие программисты могут применять, когда диапазон требований к качеству достаточно большой и нижний порог достато низкий. При необходимости выпуска супер качественного продукта это не будет работать.

Где же ты – искусственный интеллект?

Tuesday, January 27th, 2009

Я, как и большинство уважающих себя сумасшедших программистов люблю почесать язык на тему искусственного интеллекта.

Увы, естественного интеллекта пока не хватает, для того, чтобы искусственный перешел из разряда чесания языка о нем, в разряд чесания языка с ним.

Так вот, есть у меня пару идей, почему он собственно говоря, воз и ныне там, хотя лет уже 40 достаточно активненько над ним трудятся множеству умных дядек и тетек.

Ну, начнем с начала. Как я уже упоминал, я – эволюционист. Так, что если вы считаете, что на 6 день бог создал человека, а после этого на 7 отдыхал, а на восьмой закапывал по всей планете кучу окаменелых останков, то вероятнее всего читать дальше бессмысленно.

Итак, эволюционирование… Ясно, что очевидцев эволюционирования осталось мало. Тем не менее, мне кажется логичным, то что в какой-то момент появились само реплецирующие себя – простые молекулы, а дальше и более сложные молекулы и структуры и так за эдак миллиард лет добравшись до сложности ДНК, ну а дальше все пошло быстро и просто.

Возвращаясь к искусственному интеллекту.

Первым делом его попытались просто написать. Попытка хороша, результатов – ноль. Если вдуматься, то человеческий мозг (хранящий интеллект) весит 2-3 кг. В пересчете на количество атомов в нем (с некоторой натяжкой – простейших строительных блоков, эквивалентных ну скажем байтам) мы получаем, что-то типа эдак 10^22 команд, что эквивалентно десяти миллиардам 1TB винчестеров.

В общем хороша задачка получается на ассемблере написать весь этот код. Да… Я знаю, там очень много copy-paste. Но даже, чтобы его применить, нужно знать как оно работает внутри, чего пока толком не знают.

Вторым методом, которые попытались применить – это попытаться сформировать структуры похожие на мозг, и ждать, что они станут интеллектуальными. Ну скажем, нейронные сети. Опять ничего не вышло. Да, что-то эти нейронные могут делать (отличить “визуально” цифру один от цифры два), но мягко говоря от распознования цифр до интеллекта ну очень далеко.
Опять же, пару проблем которые всплыли. Не фига не понятно какого вида сети надо строить, разве что стали известны очень общие принципы, да и то в последнее десятилетие. Второе, это то, что количество нейронов (в коре головного мозга) что-то типа 10-20 миллиардов и зачастую у них могут быть до 20 тысяч связей. Итог имеем ну, скажем данных на 10^13 степени связей = всего десять 1TB винтов, но все что мы получим в этому случае, это очень упрощенную модель, только коры мозга и все равно мы не знаем как строить эту сеть.

Третье, это появились генетические алгоритмы. То ест,ь мы делаем что-то (скажем нейронную сеть) или еще какую-ту структуру, которая должна стать умной. Запускаем ее, меряем ум, размножаем самые умные и т.п. И снова мы наступаем на те же грабли, что и в прошлых двух методах. Да, генетические алгоритмы – это здорово, но пытаться построить сразу разум (без промежуточных элементов), полный абсурд, так как с таким же успехом можно было бы ожидать, что на земле путем эволюции появился бы сразу человек, без всяких промежуточных стадий.

Ну и пару дополнительных вещей по поводу всех этих методов. Как по мне все утыкается в три проблемы
- мы не знаем как мозг/интеллект работает
- мы пытаемся синтезировать уже готовый интеллект (который очень большой) без всяких промежуточных звеньев
- мы надеемся, что интеллект будет работать без всякой (или с минимальной тренировкой)

Чуть чуть дополнений по последнему пункту. Большинство живности, которые достаточно интеллектуальны, требуют достаточно долгой “тренировки” родителями перед тем как они таки
обучаются использовать свой интеллект. То бишь, hardware у них есть, ROM уже есть, а вот софт
в них таки еще надо заливать, чтобы все работало хорошо.

Ну и теперь ключевая часть. Собственно говоря, где я вижу решения всех трех проблем.

а) Мы не знаем как оно работает.

Природа тоже не имела понятия как будет работать интеллект. Самое ключевое, что нужно (и в чем правы те, кто занимаются генетическими алгоритмами) – то, что должен быть репликация, мутация и естественный отбор. И эта комбинация вполне таки толкает систему в ту сторону, чтобы она становился все более живучей и похоже, что интеллект одна из серьезных вех повышения живучести, так что до него в какой-то момент должно дойти.

б) Попытка синтезировать готовый интеллект

Это бесполезное занятие. Что нужно делать, это просто создать репликатор с которого начать. И именно он уже должен добраться до того, чтобы суметь собрать из себя более сложную систему больших размеров.

Ведь если вдуматься, весь наш интеллект – те самые 2-3 кг, изначально хранятся в ДНК. Уж не знаю сколько она весит, но явно это цифра на десятки порядков меньшем чем вес всего мозга.

в) Интеллект надо обучать

Вот с этим сложнее. Абсолютно непонятно, как выявить момент когда что-то само реплецирующее достаточно сложно и что его надо обучать. Вероятнее всего, это тоже должно являться частью эмуляции. То есть, обучение должно быть не внешним событие, а возможность коммуникаций реплецирующихся сущностей внутри эмулироемой системы.

Ну и последнее. Боюсь, что интеллект созданный с помощью такого вида искусственной эволюции будет очень не похож на наш и я не представляю критерии по которому вообще можно определить, что это интеллект.

9 параметров хорошего работника.

Friday, January 23rd, 2009

- Ум

Хотя измерить этот параметр, особо не удается (ну может IQ тестом). Тем не менее пообщавшись с человеком вполне можно понять насколько он  умен.

Как по мне это ключевой параметр. В случае отсутствия ума, пиши – пропало, даже все остальные параметры не смогут вытянуть человека, в случае недостатка этого.

-  Увлеченность

Я бы сказал, что этот параметр состоит из двух подпараметров, я специально не хочу их разделять на отдельные верхнеуровневые, так как они очень тесно связанны. Страстность для меня значит – заинтересованность и активность.

Заинтересованность побуждает человека учиться чему-то новому. А активность позволяет человеку активно делать то, что он уже знает.

Страстность, не такой критичный параметр как ум, но он резко уменьшает время менеджера, которые надо тратить на человека. Страстный человек отлично самомотивирован и активен. Аналогичный ему не страстный человек, требует постоянного пинания для движения вперед.

- Мотивированность

В целом, это очень сильно перекликается с увлеченностью. Но увлеченность, чисто внутренний параметр (мало зависит от внешних факторов). Мотивированность гораздо больше зависит от внешних факторов.

Ну и мотивированность включает в себя увлеченность. Но увлеченность не обязательно включает в себя мотивированность.

- Честность

С этим параметром все достаточно сложно. Во первых его тяжело замерять и только по прошествию длительного времени, можно понять насколько человек честен.

Важен параметр тем, что позволяет работать с человеком не ожидая на каждом шагу подковырок и удара в спину.

Я бы сказал, что он по важности стоит на одной ступеньке с страстностью.

Если человек не честен, с ним работать тоже можно, но это будет постоянно потреблять время на перепроверку его слов и намерений.

- Опыт

Это в целом гораздо легче определить, чем ум. Это как раз то, что пишут в резюме: где работал, сколько работал,  где учился и т.п.

Это фактически единственный из всех параметров, который изменяется по ходу жизни.

- Коммуникативность

Частенько люди, любят закрываться в своем мирке и с удовольствием там что-то делать. Зачастую даже это увеличивает их продуктивность, но чаще всего эффективность команды в целом падает, при том, что все делают все по отдельности.

-  Лидерство

Хотя это очень близко к предыдущему параметру, но все же одно дело – просто общаться, другое дело общаться активно и быть связующим звеном в команде.

Как точно замечено Yurich, высокое значение этого параметра нужно не всем хорошим работникам.

- Рискованность

Это обоюдоострый параметр. С одной стороны, если работник не берет никаких рисков и готов только выполнять решения идущие сверху – это плохо, тем что тратиться большое количество дополнительно времени на согласование даже небольших решений. С другой стороны, если работник начинает самостоятельно принимать решения на слишком больших вопросах, то это значительно увеличивает риски.

Вот такие вот параметры… Что еще можно сюда добавить?

- Трудолюбие

Важный параметр, но с двумя подводными камнями.

Первый камень – это то, что он достаточно тесно связан с увлеченностью. Да, трудолюбие может существовать без увлеченности, но случай достаточно редкий.

Второй камень – это то, что лично я ратую за результат, а не за количество работы. В этом смысле, если человек не трудолюбив, но при этом справляется с задачами – то он вполне хороший работник.

Программист vs QC

Thursday, January 15th, 2009

В нескольких статья меня пнули ногой (и правильно), что я путаю QA и QC. Ну, слава богу, уже разобрался.

Хотя как показала практика, не один я такой. В Google ищем “QA engineer” – получаем 1M результатов, “QC engineer” – 200k. Судя по всему, большинство таки людей хотя сказать QC используют QA.

Но, я собственного говоря не об этом. Я совсем о другом.
Почему-то в последнее время повеяла такая мода программистам побольше QC задач подкидывать и пытаться размыть границу между программистами и QC engineer (я дальше буду писать тестировщиком, хотя это и не идеально выражает то, что делают QC engineer’ы).

Проще говоря, когда менеджер говорит, ты код напиши и оттестируй полностью, чтобы после тебя тестировщам не надо было тратить много времени.

Или например, в Scrum, есть попытка ввести понятие Team member, без разделения на программиста и тестировщика. И типа, что нужно то и делай для окончания задачи.

Честно говоря, я не в восторге от обоих инициатив. Разобью по пунктам, собственно в чем состоит мое недовольство.

а) Разделение труда

Достаточно странно, что везде идет разделение труда для повышения эффективности, тут же наоборот начинают смешивать труд.

б) Квалификация

Квалификация среднего тестировщика может быть (и обычно бывает) гораздо ниже чем у программиста.

Само по себе это ничего не значит, но влияет на следующий пункт.

в) Стоимость работы

Спрос на программистов и более высокие требования к квалификации удерживают зарплаты программистов выше чем зарплаты тестировщиков.

Можете бросаться в спор. Мне уже пытались доказывать обратное. Однако, цены на сайтах по предложений работы подтверждают именно мою теорию.

г) Односторонняя взаимозаменяемость

Да, программист может выполнять тестирование и достаточно легко может научиться писать планы тестирования и придумывать стресс тесты.

В обратную сторону, тестировщик чаще всего либо не может программировать вообще, либо является очень слабым программистом.

Опять же из этой асимметрии следует, что программисты должны таки работать над той задачей, которую тестировщики не могут решить.

В личных спорах мне говорили, что я типа зараза пытаюсь программистов выделить в высшую касту и что типа это ужас как плохо. На самом деле никакой высшей/нижшей касты нету – есть работа, которую делают и программисты и тестировщики и программисты просто (как по мне) являются более дорогим ресурсом.

Никаких супер привелегий у них нету, просто они делают работу которую тестировщик не умеет делать.

Как пример, нейрохирург вполне может вполне знать педиатрию. Но это же не значит, что он должен работать по этому поводу педиатром.

Суммируя. В целом, я не против некоторого количество тестирования на стороне программистов, которые уменьшает суммарное бюджет необходимый для доведения до ума. Но я категорически против того, когда из разряда “некоторое количество” это пытаются перевести в раздел – программист обязан делать полное регрессионное тестирование.

Дописал большой P.S.
Дисскусия в нескольких ветках упала в сторону, кто быстрее выучиться программист – тестировщиком или тестировщик программистом.

Откинем вопрос, хотят ли они учиться и примем за данность, что у обоих есть голова на плечах.

Плюс, сразу выкинем из рассуждения фразы типа “я вот знал тестировщика, который стал хорошим программистом, а наоборот не знаю ни одного”.

Мы будем говорить о статистической сложности переучивания, а не разбирать конкретный пример Васи или Пети.

Возьмем двух человек
а) Хорошего программиста
б) Хорошего тестировщика

Начнем с того, что хороший тестировщик вполне может не уметь программировать вообще (оставим на секунду автоматизированное тестирование за бортом). Он может заниматься написание планов тестирования, стресс тестированием, обучение молодежи как тестировать,тестировать безопасность, тестировать usability и т.п.

То есть, тестировщик знает как тестировать, но при этом легком может не иметь даже базовых знаний программирования.

В обратную же сторону -хороший программист НЕ может работать без базовых знаний тестирования. Он в общих чертах понимает, что такое план тестирования (просто за X лет работы он уже с ним не раз сталкивался), он делает минимальное тестирование сам перед отдачей тестерам. Я не говорю, что программист отлично понимает, но базовые понятие у него уже есть.

Таким образом, когда программиста нужно обучить тестированию, то по большему счету ему нужно углубить свои знания в
а) Стресс тестировании
б) Почитать несколько книг по планированию тестирования
в) Поменять мышление, для того, мыслить не с точки зрения “вот, что надо сделать, чтобы оно работало” а на “вот, что надо сделать, чтобы оно НЕ работало”.
г) Изучить некоторое количество инструментов для тестирования
д) Потестировать, чтобы разобраться что правильно, а что неправильно

То есть, как по мне, база знаний необходимая тестировщику не слишком большая, частично программист ей владеет. Ему нужно ее углубить и получить опыт.

Теперь тестировщику нужно обучиться программированию.
И вот тут база оказывается достаточно большой
а) Изучить основы программирования
б) Изучить язык программирования
в) Изучить API операционной системы/browser/базы данных
г) Изучить инструменты для программирования
д) Изучить такие вещи как ООП
е) Пописать программы, чтобы понять, что правильно, а что неправильно

То есть база знаний больше. А знание основ этой базы у тестировщика меньше.

Проблема в сложности изучения программирования (по сравнению с тестирование в двух вещах)
- В программировании гораздо больше информации нужно просто запомнить, которая не поддается логическому объяснению (на начальных этапах учебы). В тестировании же больше вещей логичны с самого начала
- В программировании результат работы гораздо медленней становится видим (например можно неделю работать над кусочком программы) и поэтому ошибки и опыт накапливаются медленнее.

Уже через неделю программист может выполнять простые элементы тестирования на __РЕАЛЬНЫХ__ (это ключевое слово) проектах.

В обратную же сторону, тестировщик сможет в этот момент только учиться на маленьких программках, которые не являются настоящими проектами. И только через долгое время сможет делать даже простые задачи на реальном проекте.

И возвращаясь к автоматизированному тестированию. Да, безусловно у тестировщика занимающегося автоматизацией, очень хорошая фора перед тестировщиком. Тем не менее скрипты по автоматизации на порядок проще, чем реальный код.
Таким образом тестировщик, который занимался автоматизацией имеет уже некий задел в основах программирования и может быть языке. Тем не менее все остальные пункты все еще остаются той базой, которую ему придется выучить до того, как стать программистом, приносящим пользу.