Когда мы менторим людей, которые пришли к нам учиться программированию, очень много времени занимает важный аспект, о котором большинство новичков просто не догадываются. Это перестроение мозгов и способа думать. Мы учим их думать как программист. Что это значит?
Понимание задачи
Этот аспект в первую очередь связан с пониманием того, что от вас хотят. Во многих других профессиях задачи достаточно прямые. Например, вы маляр, вам сказали покрасить стену и вы берете и красите ее. Т.е. вы видели, как это делается, предмет задачи реален. Конечно, тут тоже есть свои тонкости и обесценивать работу маляров, строителей или кого бы то ни было я не намеревался. Однако в программировании задачи ставятся на другом уровне, в чем и состоит вся сложность. Поэтому важно уметь мысли алгоримами. Обычно, примерно 9/10 задачей не описываются. Эти 9/10 задач вам нужно достроить в голове самостоятельно. Для этого нужно разобраться в предметной области: что должна делать программа, для чего она, кто будет ей пользоваться, как часто ею будут пользоваться, насколько это удобно и пр. Да, есть UI/UX дизайнеры, которые занимаются юзабилити программы, но все равно множество мелких аспектов нужно будет додумать самостоятельно.
Задача формулируется гораздо в меньшем объеме от того, что на самом деле нужно сделать. Этот аспект обычно очень бесит новичковых программистов.
Интересно, что многие курсы для программистов при обучении дают людям полностью описанные задачи, что совершенно не соответствует тому, как это происходит на работе. Соответственно, после таких курсов у людей нет никаких навыков самостоятельного продумывания задачи, у них не равивается логика программиста. Додумывать нюансы задачи — это сложно, этому нужно учиться.
Коммуникация
Прошло то время, когда программисты тихонечко работали сами по себе где-то в уголке. Сегодня гораздо важнее те скиллы, которые отвечают за общение. Хороший программист тот, кто умеет получать информацию и передавать ее другим сотрудникам, а его умения кодирования по большому счету значат намного меньше. Уровень программиста определяется именно умением обмениваться информацией. Поэтому программиста можно оценить еще на собеседовании, насколько он хорошо формулирует свои мысли и насколько хорошо понимает твои мысли. Все это сейчас намного важнее, чем умение кодировать. Это только технический навык.
Разделение проблем
Довольно часто к вам приходит задача, в которой все намешано в одну кучу. Если задача сложная, вы не можете решить ее сразу и даже просто осмыслить ее целиком. Поэтому практически все задачи требуют декомпозиции. Программист должен разделить эту одну общую задачу на другие более мелкие задачи. А потом каждую из мелких будет делить еще на более маленькие подзадачи. Особенность мышления программиста как раз в том, чтобы разбивать большие задачи и проблемы, на маленькие, фокусировать конкретно на каждой из них, резать ее на маленькие кусочки, пока каждый из кусочков не станет абсолютно понятным. Когда вы это сделали, каждый из кусочков соединяется вместе, таким образом постепенно поднимаясь вверх по уровням, пока не будет решена самая первая большая задача.
Вот этот процесс, когда разрубили задачу на кусочки, продумали каждый кусочек, а потом слепили их в общую концепцию, по факту и называется мышлением программиста. И на этот процесс уходит очень много времени.
Составление плана
Пока вы разделяете большую задачу на кусочки, вы должны выстроить план, что и в каком порядке будете делать. Потому что если вы будете пытаться удержать все в голове, в большинстве случаев вы просто что-то забудете. Поэтому все опытные программисты держат рядом листочек, на котором что-то себе калякают. Кто-то делает это в электронном варианте, кто-то в бумажном блокноте, кто-то на стикерах. Но в любом случае вам нужно где-то записать план, в каком порядке вы будете выполнять свои задачи. Это очень сильно помогает. Поэтому если вы начинающий программист, просто последуйте такому примеру. Если вам пришло в голову, как что-то сделать, просто возьмите ручку, бумажку и выпишите это.
Искусство отладки
В подавляющем большинстве других отраслей вы можете сказать: у меня не получилось. В программировании это невозможно. Вы либо должны доказать, что это теоретически невозможно (но в большинстве случаев возможно все), либо же сделать это. Ощущение, что вы в любом случае должны это сделать и нет варианта сдаться, очень сильно подрывает боевой дух новичков 🙂 К этому нужно привыкнуть.
Это как в шутке: страшно не то, что мы взрослые, а то, что взрослые — это мы. Так вот и тут, программист всегда взрослый. Именно на программисте заканчивается цепочка ответственности. Эту задачу нужно сделать. Да, у тебя не получается. Возможно, нужно потратить больше времени на поиск решения. Все равно не получается? Значит нужно повертеть проблему и найти другие подходы к решению. Отсюда вывод — если вы что-то не можете сделать, значит эту проблему вертели в руках не достаточно долго.
Программист работает с прозрачным ящиком, в отличие от админа. Админ может сказать: эта программа этот функционал не поддерживает. Программист такого сказать не может, потому что он создает эту программу. Можно также изучить вопрос, сделать эстимейты и сказать, что для добавления нужной функциональности уйдет столько-то времени. И дальше твой PM может обсудить это с клиентом и решить, стоит ли продолжать возиться с этой задачей или нет. Т.е. решение не делать задачу принимает только клиент, но не вы. Вы просто берете и делаете. Никаких других вариантов. Любая задача решаема.
Ощущение, что вы не отступаете никогда, что нет неразрешимых проблем — это основа майндсета программистов.
Практика
Программирование — это практический навык, поэтому все что вы делаете — это практика. Работа с вашей IDE, работа с настройкой базы данных, работа с настройками операционной системы, сети, файрволов и прочее — все это часть работы программисты. Что не часть работы программистов? Ну, например просмотр видео на ютубе 🙂 А если серьезно, получение информации — это не часть работы программиста.
Всегда ваш Сергей Немчинский
Расскажите в комментарях, как вы изменили тип мышления для успешного выполнения задач по программированию.
Добавить комментарий