Почему я не советую учиться программированию в Jupyter notebook

23.01.2019

Я рекомендую всем начинающим изучать питон. Но при этом я настоятельно не рекомендую использовать Jupyter notebook или подобные «среды разработки» (в кавычках, потому что на самом деле Jupyter вовсе не среда разработки). Попробую объяснить, почему.

Для начала, что такое Jupyter notebook. Это среда, позволяющая вам писать отдельные куски кода на питоне («ячейки»), а потом в более-менее произвольном порядке их исполнять. Если вы в ней не работали, то довольно сложно представить, что это; возможно, вы существенную часть текста не поймете. Но и не страшно :)

Итак, что мне не нравится в Jupyter в контексте обучения программированию, алгоритмам и в контексте олимпиад.

Во-первых, и, пожалуй, самое главное — это очень сильное размытие понятия «программы». В обычных средах разработки — в том же Wing (который я рекомендую), в том же PyCharm (который многие используют), да в чем угодно — вы создаете файл с программой, и запускаете целиком программу, от начала и до конца.

В Jupyter же вы создаете «ноутбук», в нем много «ячеек», и вы запускаете эти ячейки в более-менее произвольном порядке. Можно, конечно, запустить весь ноутбук от начала до конца, но это делают относительно редко. Обычно напишут одну ячейку, запустят, напишут вторую ячейку, запустят, потом найдут ошибку в первой, перезапустят, и т.д. Понимания того, что программу обычно запускают все-таки всю целиком, у вас не возникает. У меня даже не поворачивается язык назвать то, что вы пишете в Jupyter, программой — это не программа, это набор слабо связанных фрагментов кода.

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

(Конечно, вы можете все делать в одной ячейке, или регулярно запускать весь ноутбук от начала до конца, но тогда, во-первых, зачем вам Jupyter, во-вторых, все равно уже чисто из-за оформления, всех этих In и Out, кажется, это не выглядит как программа.)

В-третьих, «программы» на Jupyter очень плохо переносимы. Если вы написали обычную нормальную программу на питоне, например, в среде Wing IDE, вы ее спокойно можете открыть в PyCharm или где угодно еще; или даже просто запустить из консоли обычным интерпретатором питона. Вы ее можете послать себе на почту и открыть на телефоне (у меня реально школьники пишут программы на телефоне o_O ). С Jupyter это не выйдет.

(В частности, на олимпиадах надо сдавать именно файл с программой; очень плохо понятно, как организовать автоматическую проверку Jupyter notebook’ов на таком же уровне абстракции, как проверяются обычные программы, и именно поэтому на олимпиадах нельзя писать в Jupyter.)

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

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

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

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

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

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

(И даже в машинном обучении все-таки Jupyter, как я понимаю, используется только для прототипирования, продакшен-код, скорее всего, будет написан уже на чистом питоне.)

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

В общем, люди, не учитесь программированию в Jupyter.


Мой курс по алгоритмическому программированию (и подготовке к олимпиадам) для школьников, студентов и всех желающих — algoprog.ru