Category: it

Category was added automatically. Read all entries about "it".

moose, transparent

язык программирования и его рамки

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

Я начал урок с нескольких заданий растущей сложности. Ребенок уже знает, что такое PRINT "something", PRINT X, INPUT X, IF/THEN/ELSE, GOTO, и выражения типа X=X+1, хотя я не уверен пока что, что твердо понимает, что такое переменная в отличие от просто числа.

- Итак, начинаем с программы, которая просто печатает имя JULIA.
- Это легко: 10 PRINT "JULIA".
- Теперь пусть программа распечатает это пять раз подряд.
- Тоже легко: 10 PRINT "JULIA JULIA JULIA JULIA JULIA JULIA".
- Нет, пусть каждое имя будет отдельно на своей строке.
- Хорошо, тогда 10 PRINT "JULIA", 20 PRINT "JULIA" итд.

- Теперь следующее задание. Пусть программа спросит у меня число, и если например это 4, то она четыре раза напечатает JULIA.
- Хорошо, начинаем с 10 INPUT X, это мы умеем. А теперь...

И тут ребенок серьезно завис, причем не так, как я ожидал. Мы не учили еще циклы, но она уже знает, как что-то делать снова и снова и остановиться по условию (IF ... THEN END, а потом GOTO назад на нужную строку). Я думал, что она пойдет в эту сторону, но будет сложно переоткрыть идею переменной-счетчика. Оказалось - нет, она пыталась найти способ "сказать" компьютеру сделать именно то, что надо, за один раз. Например, может PRINT X "JULIA"? Нет, так это не работает. А если PRINT "JULIA" * X? Нет, это же умножение, а "JULIA" это не число (да, я знаю про Питон). Папа, а как будет "раз" по-английски, чтобы написать "X раз"?

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

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

- Давай сделаем что-то другое. Начнем с программы, которая просто печатает 1 2 3 4 5, каждое число отдельно.
- Это легко. 10 PRINT 1, 20 PRINT 2 итд.
- Хорошо, теперь, как сделать, чтобы программа печатала 1 2 3 4 5 6 итд. и не останавливалась, до тысячи и дальше?

Тут пришлось подумать. Я напомнил "как мы делали, чтобы программа делала что-то снова и снова, как в игре про 4 2 1?". Да, точно, GOTO. Первая попытка: 10 PRINT 1, 20 GOTO 10. Очевидно неверно. Что нужно делать, чтобы число все время менялось? Да, точно. Следующая попытка: 10 X=1, 20 PRINT X, 30 GOTO 20. Опять не то, да, забыла увеличить число. Следующая попытка:
10 X=1, 20 PRINT X, 30 PRINT X=X+1, 40 GOTO 20. Что-то не так, что? Нет четкого разделения PRINT и присваивания в уме, оба что-то делают с X. Подумай, что надо изменить. Следующая попытка наконец верна: 10 X=1, 20 PRINT X, 30 X=X+1, 40 GOTO 20. Наслаждаемся бегущим рядом чисел. (все это занимает вместе считанные минуты, просто мне показалось интересным записать подробно эти попытки, и первый опыт по сути отладки программы).

- Хорошо, а теперь можешь сделать так, чтобы она печатала не до бесконечности, а когда дойдет например до 20, остановилась?

Подумала, вспомнила про IF ... THEN END, перечитала прошлую программу, где это использовала, и вставила 35 IF X=20 THEN END. Работает!

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

Подумала, вставила 5 INPUT Y, и заменила условие IF X=20 на if X=Y. Работает!

Но не совсем. Если я ввожу 20, она печатает до 19 и останавливается. Что не так? Почитала еще раз программу, подумала, и заменила условие на IF X=Y+1 (лучше было передвинуть условие раньше, перед увеличением, но это уже мелочи).

ОК, теперь у нас есть программа, она работает. Запустили несколько раз, проверили, все хорошо.

- Хорошо, теперь я тебя попрошу сделать небольшое изменение, ты только не пугайся, если это немного взорвет мозг. Попробуй вместо 20 PRINT X написать 20 PRINT "JULIA". Что тогда будет?

Стала изменять это в программе, еще до запуска появилось подозрение. Запустила. Шок, изумление на лице, "Папа, ты взорвал мне мозг! Это же делает то, что ты от меня хотел. Действительно, это же так просто!"
moose, transparent

бейсик

Я не помню, писал ли об этом уже, но без иронии полагаю Бейсик хорошим первым языком программирования. Причем не любой Бейсик, а такой олдскульный, с номерами строк (не QBasic). Например, GW-BASIC, на котором я когда-то сам учился программировать (если не считать язык Лого с "черепашьей графикой", про который было в какой-то книге - предлагаю не считать). Это было на компьютерах Yamaha, которые в большом количестве установили в классах и институтах СССР во второй половине 80-х, и язык формально говоря назывался MSX-BASIC, но почти не отличался от более известного GW-BASIC.

Почему я так считаю? Ну скорее всего потому что сам на нем учился, и поэтому он окрашен для меня в теплый ламповый свет ностальгии. Нет, на самом деле у меня есть Аргумент, но вы не обязаны с ним соглашаться, можете считать, что все дело в теплом ламповом. Аргумент такой. Один из главных навыков, которым надо научиться, когда учишься программировать с нуля - возможно, самый главный навык - это следить за исполнением программы в уме, понимать, как исполнение проходит по потоку команд, и что при этом находится в разных переменных (включая сюда понимание того, что такое переменная вообще). Те, кому когда-то это далось легко (или тяжело, но они забыли), часто не понимают, как это - не втыкать в эту идею потока исполнения, плывущего по тексту программы.
Можно начать программировать и как-то продвигаться, так и не поняв это, но далеко не дойдешь.

Бейсик с номерами строк, без блоков, ограниченных скобочками, без подпрограмм с названиями, словно создан для того, чтобы направить внимание ученика в эту сторону (а почему "словно создан", собственно? Наверное, специально именно так и создан для этого, его же придумали, как язык для обучения). Чтобы сделать что-то нетривиальное, ученик обязян отслеживать глазами ход работы программы, а номера строк дают ему конкретные "зацепки", облегчающие это дело поначалу. Есть и еще преимущества. Сознательно бедный язык, никакой тебе богатой стандартной библиотеке, никаких "импортов" как в Питоне, но вместе с тем включает все нужное для простой работы с числами, строками и графикой (чтобы дети могли рисовать и игры придумывать). Но главное преимущество - отказ от структурного подхода, номера строк. Если бы не это, я бы предпочел для первоначального обучения использовать Питон или Джаваскрипт. А так - можно начать с Бейсика, и через какое-то время перейти к более серьезным языкам.

(Да, я знаю, есть Scratch, и есть игры типа CodeMonkey для совсем маленьких, и я в общем-то не против, я только за, но это как язык Лого с черепашками в моем детстве. Не совсем то же самое. Не вполне то, что надо. Так мне кажется. Если вам идеально подходит, я только рад)

Не убедил вас? Наверное, не убедил, но если вдруг заинтересовались, то современная среда GW-BASIC, почти полностью совместимая с оригиналом, называется PC-BASIC; или можно взять настоящий GW-BASIC (легко находится, где скачать) и запустить внутри DOSBOX, тоже вполне работает.

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



Кто помнит, какие простые программы/игры можно с ребенком сварганить на Бейсике? Мы только-только начали. Игру "отгадай число от 1 до 100" тоже уже написали. Завтра буду циклы объяснять, может, на примере проверки, простое число или нет. А дальше я уж и забыл, чего надо. Может, простая графика и прямая дорога оттуда к рисованию движущихся точек/линий на экране. А может, остаться еще в тексте и разбираться дальше с числами/строками, если найду интересные идеи для программ.
moose, transparent

про эффективную разработку

Забавным и интересным показался совет, прозвучавший в дискуссии "Полезные советы для повышения эффективности разработчика" на Hacker News. Перевожу:

"Я записываю себя во время программирования с помощью OBS Studio и притворяюсь, будто я крутой стример (хоть никто это не увидит). Это помогает потому что:

1. Помогает мне не отвлекаться. Есть конкретное задание для этого видео, именно его и выполняю.
2. Я учусь лучше формулировать то, чем занимаюсь, какие есть проблемы, решения итд.
3. Мотивирует. Я же не могу разочаровать свои "тысячи поклонников".
4. Потом могу посмотреть, где я зависал/ошибался и учиться на ошибках.
5. Это прикольно. Я могу шутить, ругаться как хочу (моим зрителям больше 18).
6. Я филиппинец, но записываю по-английски, это помогает практиковать язык."

С моей точки зрения 1 и 3 главное, интересно, насколько такое реально помогает. Я вряд ли буду, но реально интересно. Кто-нибудь пробовал?

Кстати, если у вас есть какие-то неожиданные помогающие вам способы улучшить свою эффективность программиста (любимый редактор? любимая музыка или белый шум? Pomodoro timer? Сложная система самовнушения?), поделитесь в комментариях!
moose, transparent

еще про кубики

В дополнение к предыдущей записи про прекрасную головоломку "кубики Сома".

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

Внутри статьи забавная цитата из Джона Конвея (изобретателя игры "Жизнь", одного из моих персональных героев) за 1961 год: "For a puzzle the size of Soma, it's an admission of defeat to use a computer. If you find the right way of organizing the material, it should take less time to do the whole thing by hand than it does to program the machine." Поскольку именно это я и сделал - не решил вручную и запрограммировал компьютер - ощущаю, что меня строго отчитали через пространство в 48 58 лет. Тем временем и жена, и зашедший в гости друг решили ее вручную минуты за три, и тем самым отчитали меня через пространство в два метра.

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

Я добавил в свой код определение всех уникальных решений (с точностью до поворотов и зеркальных отражений). Как и ожидалось, он находит 240 разных решений (после того, как находил больше и я подчистил несколько багов).
moose, transparent

код для кубиков

Взял со стола у сослуживца головоломку на составление куба 3x3x3 из семи частей. Позже прочитал, что она знаменита, но как-то мне не приходилось решать раньше. Долго тупил и не мог составить.



Наконец это меня так разозлило, что написал сегодня код, который находит решение.

Если кому-то интересно, вот он. Около 50 строк. Если вы программист, то перед чтением кода подумайте несколько минут о том, как бы вы сами такое написали, составьте хотя бы в уме план. Если вы знаете, как это сделать заметно короче и/или элегантнее, чем у меня, расскажите, мне любопытно. У меня получилось заметно проще, чем то, как думал вначале сделать (хранить фигуры как множества из 3 или 4 трехмерных точек, получать варианты вращением и двигать туда-сюда, пересекая с целочисленной решеткой точек куба), но не то чтобы нравится.

P.S. Он находит все решения, включая повороты и отражения; при желании можно додавить, чтобы находил только уникальные, но мне уже лень было.
moose, transparent

куда вы удалились

Синим цветом - продолжение, написанное нейронной сетью, натренированной на корпусе русской литературы. Особенно удачный пример, по-моему:



Можете сами попробовать на чем угодно. seminarist увлекся вот.
moose, transparent

компьютерные ссылки

  1. Ultimate list of all tools we used to create a hit HTML5 game on Steam. Интересно. Можно игру целиком написать в современном джаваскрипте, упаковать с Электроном и распространять через Steam. В обсуждении на HN тоже много полезного.

  2. Interfaces Generally Belong With Users. Хорошее объяснение того, почему полезно иметь duck typing в языке (как в Go и Typescript: объект подходит под тип интерфейса, если воплощает задекларированные в интерфейсе функции; упоминать само название интерфейса и даже знать о его существовании объекту не нужно). Не уверен, что это целиком и полностью добро, но как минимум один весьма полезный тип примеров здесь описан.

  3. The New Illustrated TLS Connection: Every byte explained and reproduced. Исключительно удобное оформление, полезный материал.

    P.S. Да, разумеется, каждый поток TLS 1.3 притворяется потоком TLS 1.2 и даже версию 1.2 указывает в заголовках. А как вы думали эта индустрия работает?

    "Client Version: A protocol version of "3,3" (meaning TLS 1.2) is given. Because middleboxes have been created and widely deployed that do not allow protocol versions that they do not recognize, the TLS 1.3 session must be disguised as a TLS 1.2 session. This field is no longer used for version negotiation and is hardcoded to the 1.2 version. Instead version negotiation is performed using the "Supported Versions" extension below."

  4. Recording Audio from the User. Записывать звук с микрофона внутри веб-приложения стало совсем легко. Я думаю воспользоваться этим для простой системы домашних заданий для ребенка, поэтому искал эту информацию. Пользователь получает подсказку и должен согласиться на запись, это не вопрос прайвеси.

  5. New Tricks for an Old Z-Machine, Part 3: A Renaissance is Nigh Длинная, но очень интересная ностальгическая запись о корнях текстовых интерактивных игр, системы Inform в 90-х, Z-Machine в 80-х итд. Может понравиться и тем, кто не знаком с темой текстовых интерактивных игр (а познакомиться стоит, кстати).
moose, transparent

ссылки

  1. AllSides.com - любопытная попытка представить рядом новости слева и справа, по разным актуальным темам (в основном американским).
    Это лучше, чем читать только новости слева, или только новости справа. Но есть вариант еще лучше: не потреблять новости вообще. Я не следую этому совету, но это лишь потому, что я слаб и поддаюсь соблазнам. Может, эти статьи помогут вам не быть, как я:

    Mr Money Moustache: The Low Information Diet
    Rolf Dobelli: Avoid News

  2. Евреи Биробиджана. Интересный репортаж с фотографиями.

  3. Scoop: A command-line installer for Windows. Интересная попытка дать пользователям Windows нечто похожее на apt-get Убунту/Дебиан. Судя по всему, очень удобно для беспроблемой установки многих полезных программ прямо из командной строки.

    P.S. Я узнал об этом проекте из документации Restic - программы для бэкапов, тоже выглядит интересно; под Windows она устанавливается через Scoop.

  4. Lists of mountains and hills in the British Isles.

    Потрясающая воображение система категоризации холмов в Британии, с названиями типа "Marilyns", "Murdos", "Simms" и "Grahams".

  5. How Life Sciences Actually Work: Findings of a Year-Long Investigation. Очень интересно; об устройстве научной работы в больших лабораториях, о проблемах с качеством исследований и кризисом воспроизведения, и о многом другом.

  6. Hard Comp-Fi Reading List & HN discussion.

    Список художественной литературы, в которой играют важную роль программирование или информатика. Обсуждение на HN интереснее самого списка, но и там и там есть заслуживающие внимания рекомендации.
moose, transparent

вычислить все

Идея для интервью для программистов (не совсем всерьез):

Кандидат получает распечатку команды "man dc" в Линуксе, а также строку

echo 1234 | dc -e '1sm[q]sQ[dlm=Qdlm-lFx*]dsF?rxp'


Через какое-то время кандидат рассказывает интервьюеру, что эта команда напечатает и как именно (в подробностях) это происходит.
moose, transparent

о черных ящиках



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

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

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

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