Когда то, я задал такой вопрос одному программеру-гуру, о том, что хорошо бы знать разработчику программ (software engineer) в наше нелегкое время.
Месяца два назад, подготавливая очередной ВТэшный диплом на заказ, один из "специалистов" задал вопрос, что ему нужно выучить, чтобы устроиться работать.
И тут родилась идея, составить список того, что нужно знать выпускнику-программеру.
Математика- Алгоритмы, их построение и анализ сложности;
- Стеки, списки, деревья, хеши, массивы и прочие кольца
- Численные методы (выглядит узкоспециально, но встречается);
- Теория Вероятностей (выглядит узкоспециально, но встречается).
Проектирование- Паттерны (по банде четырёх);
- Применение их (для начала можно почитать Александреску);
- UML (без фанатизма);
- ООП (с фанатизмом);
- Знание зачем нужны основные сетевые протоколы и как устроен TCP/IP;
- Иметь представление о функц. языках;
- Понимать многопоточные проги и средства синхронизации);
- Иметь представление о erlang-стилевом параллелизме;
Информатика- Устройство компов - проц, память, железо (на пальцах, уметь объяснить почему если памяти мало, то 100 программ будут медленно тормозить и в чем будет тормоз);
- Потроха проца - регистры и конвееры (от специализации);
- Иметь представление о стеке, фрэймах, исключениях (от специализации);
- Механику выполнения программ на винде/линуксе - загрузка в память, развязка общих символов и выполнение. Уметь сказать, какие регистры за что отвечают и как меняются в процессе (от специализации).
Практическая информатика (там где конкретное - под конкретный язык/платформу, но иметь общие представления)
- Привычка читать документацию;
- Привычка не верить документации на 100% и вытаскивать неясные/неизвестные моменты из сырцов/бинарников;
- Мысленное моделирование - навык прикидки "как программа считает";
- Знание основных затыков (bottlenecks) - и умение их разруливать;
- Работа с многопоточными программами, отловы дедлоков и "races";
- Навыки отладки софта;
- Навыки профилирования софта;
- Умение писать юнит-тесты;
- Умение профилировать софт;
- Умение юзать SVN и CVS;
- Умение писать daily reports;
- Умение юзать багтрекер;
- Умение оценивать время для написания и прогнозировать/определять unknown factors и их влияние;
- Умение (!)
держать ритм и не "расслабляться"/"сжигать себя".
БД- Основы SQL (в общем случае без специфики конкретных DBMS);
- Основы работы DBMS (на уровне представления что такое транзакция и зачем нужны индексы).
Кооперация- Привычка комментировать код и писать документацию;
- Умение равно как аргументированно отстаивать свои предложения, так и "наступать на горло собственной песне" - т.е. придерживаться принятых командой решений и стандартов и отказываться от тех решений, которые ты предлагал, а они, гады все, не оценили и не приняли
Без фанатизма, конечно;
- Умение доходчиво объяснять и учить всему перечисленному в списке.
Не вошедшее в другие разделы- Маркетинг. Как продать то, что получилось (без фанатизма);
- Психология. Сотрудники, подчиненные, заказчики (без фанатизма);
- Динамическое чтение (быстро читать маны, не вникая в суть но запоминая где что лежит);
- Экономика. Оценка выгодности (без фанатизма);
- Эргономика, основы дизайна (знать где удобней поставить кнопку и как объяснить это дизайнеру. Оценить работу дизайнера);
- Английский (вообще по дефолту);
- Ассемблер, с++ (Обязательно!) и .NET/C# (Можно поверхносно).
- Умение встраивать в системы средства health-мониторинга;
- Умение "ремонтировать двигатель на ходу" - smooth-upgrades with minimal downtime;
Дополнения и критика приветствуются (Но только если по существу)
v 1.1 (Используя замечания Sterh и Sochin)