beldmit: (Программизм)
[personal profile] beldmit
 

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


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


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


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


Я в принципе согласен, но адекватный уровень понимания для каждого языка и предметной области разный. Если ты пишешь на JavaScript/CSS, то до железа ты не доберёшься близко к совсем, и тебе не актуальны процессорные кеши, но крайне актуально знание размеров экрана и то, как в какой системе отображаются твои виджеты. А на C, да ещё выжимая каждую операцию досуха ради быстродействия, тебе надо знать, например, про векторные инструкции процессоров.

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


Я тут понял, что единственное, для чего C++ хорош в образовательных целях — это для объяснения про классы, темплейты, контейнеры и алгоритмы. Что у нас бывают разные способы хранить кучу плюс-минус однородных данных, и где-то мы за это заплатим неудобством поиска, где-то проблемами со вставкой, где-то чем-то ещё. Но это примерно C++ 2003. Ну то есть это не C++, это C с классами и немного STL. И я не уверен, что C++ — методически самый лучший для этого язык.


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


Вот тут и согласен, и не согласен. Не компетентен судить про Erlang, но по другим языкам — часть граблей программист не заметит, но ими прилетит. 


 Течет память - либа тухлая, другую возьмем! Медленно работает - надо апгрейдиться! Ну а чего вы хотите - оно вот так работает! Скомпилить шаред библиотеку и подключить к своему проекту на Erlang/R/Python? Не ко мне 🙂 Ну хоть понять, что это можно реализовать как полагается на низкоуровневом языке и попросить того, кто умеет! Но это уже детали даже.

Это вполне релевантные детали в целом. А в частности всё сложно. Утечки памяти в современном языке с garbage collector надо очень стараться, чтобы организовать. Критичные по времени места уже реализованы на низкоуровневом языке и оптимизированы. Другой вопрос, что их можно неправильно использовать и править надо именно алгоритм. А для этого ещё и профайлить, о чём и профессионалы не всегда думают. А когда думают, часто получают неожиданный результат в том, где на самом деле находится узкое по времени место.

Самое серьёзное ускорение, которое мне довелось привнести, было в проекте на C++. Там товарищ делал обрезал начальные пробелы в строке, проходя с начала, и для каждого пробела двигал всю строку (довольно большую) на этот пробел влево.


С/С++/Pascal - отличные языки для изучения в школе. А над программерами, которые не считают нужным их знать, позволь мне посмеяться. Я не со зла, просто это действительно смешно.


Я не уверен, что тут надо знать именно языки, а не концепции. O-нотацию, например. А из этой тройки я бы сейчас оставил Паскаль, и сильно концептуально ограниченные подмножества.


Page 1 of 3 << [1] [2] [3] >>

Date: 2020-09-06 10:43 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

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

  1. Как это можно было написать
  2. Как это ревьюер пропустил (при том что ревьюер там один был один из лучших программистов нашей конторы).

Вот человеку который учился на Pascal или на Algol-60 как я, в общем на языке, где параметры можно переменовать и по значению и по ссылке, и на этой разнице обязательно заосторяют внимание, должно быть попросту очевидно, что в языке C, где параметр всегда передается по значению, значение переменной p в результате передачи ее значения параметром в функцию free измениться не может.

А тут вот было написано что-то вроде

if (malloced) {
   free(keyword)
}

Это было в исходном варианте. Потом в порядке борьбы с якобы утечкой найденной каким-то новомодным статическим анализатором добавили

if (keyword) {
  free(keyword)
}

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

Date: 2020-09-06 12:31 pm (UTC)
ufm: (Default)
From: [personal profile] ufm
Как-же это надоело, госссподи.
Друзья, когда вам в голову придёт банальная мысль, что "обучение программированию", и "обучение языку программирования" вещи между собой связанные очень опосредованно - вот только тогда начинайте что-то вещать с умным видом. А пока - не надо, ладно?

Date: 2020-09-06 12:37 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
С древних времён известно, что учить надо сразу двум языкам программирования. Не важно каким, главное чтобы из разных групп.

Date: 2020-09-06 12:39 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

Это как? Учить программированию путем рисования блоксхем на бумаже? Еще в первой половине 80-х годов у нас в школе по этому поводу говорили "Програмизьма без механизьма - разновидность онанизма".

Учить программированию можно ТОЛЬКО давая ученику возможность выполнять написанные им программы на каком-нибдуь вычислительном устройстве. Так что без языка¸ причем языка имеющего реальный компилятор или интерпретатор на имеющемся в наличии железе, в процессе обучения не обойтись.

А любой языка как инструмент обучения обладает теми или иными достоинствами или недостатками.

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

Date: 2020-09-06 12:40 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

Почему так мало? По идее оптимальным количеством в подобных ситуациях является число e. Следовательно лучше трем, чем двум - три ближе к e.

Date: 2020-09-06 12:43 pm (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Компьютеры работают в бинарной системе :-P

Date: 2020-09-06 01:07 pm (UTC)
ufm: (Default)
From: [personal profile] ufm
"- Почему у вас так много свободного времени, вы такой добродушный и веселый? Как вам это удаётся?
- Я никогда ни с кем не спорю, особенно в интернете.
- Но это-же невозможно!
- Да, вы совершенно правы.
"

Date: 2020-09-06 01:25 pm (UTC)
From: [personal profile] permeakra
>Саша Соболев тут написал большой текст в контексте обсуждения пользы обучения программированию на примере C++.

Можно ссылку?

Date: 2020-09-06 02:40 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

Класс! Ваш комментарий сделал мне ну если не день, то полдня точно. Спасибо!

Date: 2020-09-06 03:39 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

А... я вижу явные приметы маразма "опытного разработчика". Видел это неоднократно. Когда триггеры и ФФЯ были важнее кода. Когда машинные коды были надежней ассемблера (ближе к железу). Когда ассемблер был лучше фортрана и си (ближе к железу).

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

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

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

Date: 2020-09-06 04:13 pm (UTC)
From: [personal profile] permeakra
И тем не менее. Хочется видеть дискуссию целиком.

Date: 2020-09-06 04:54 pm (UTC)
From: [personal profile] permeakra
... Блин. Меня нет в фейсбуке =((((
dememax: (вэлком)
From: [personal profile] dememax
Спасибо за нитку!
Тоже, задался вопросом, а где источник, и тоже - без МордоКниги, да и не хочу, а никто платить не хочет...

Date: 2020-09-06 05:31 pm (UTC)
filin: (Default)
From: [personal profile] filin

C++ для обучения программированию плох тем, что в нём за деревьями не видно леса. Про классы, контейнеры и алгоритмы лучше взять scala. И, кстати, важно помнить, что классы в С++ — это не концепция, и даже не прямое отражение концепции, а особенность реализации. А темплейты — это либо оптимизация алгоритмов, либо работа с алгоритмами «для бедных». В смысле, для тех, у кого язык не умеет переменных типов по-человечески. В первом варианте они нужны уже для профессиональных программистов, оптимизирующих узкие места, найденные профайлингом, как правило, под конкретную архитектуру. При обучении программированию эту тему затрагивать вообще вредно. Ну а во втором — лучше сначала освоить алгоритмы на языках достаточно высокого уровня, а потом уже, если понадобилось оптимизировать, реализовывать освоенное с помощью темплейтов.

Date: 2020-09-06 05:49 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Процедурному, функциональному и на сдачу (.71828) логическому.

А потом — статической и динамической типизации.

Date: 2020-09-06 06:15 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

Если на сдачу, значит в качестве логического используем make?

Date: 2020-09-06 06:15 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

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

Date: 2020-09-06 06:23 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

А мнет тут тем временем дружно пытаются доказать, что Go круче Rust.

А ECMAScript к сожалению, сам по себе ни для чего не пригоден. Чтобы учить детей на нем программировать, мало иметь сам языка, надо еще какую-нибудь объектную модель чего-нибудь к нему приложить.

Причем все сколько-нибудь распространенные - что браузерная модель документа, что WindowsScriptingHost-овская модель системы, что предлагаемая NodeJS - отнюдь не образец простоты и логичности.

Я б если ставить задачу учить детей программированию посредством какого-нибудь извода JavaScript, сначала бы разработал исполнителя. Какого-нибудь робота, желательно чтобы его можно было не только в виртуальной среде гонять, но и собрать физического, из Ардуино с RaspberryPi в черепушке, с простой и понятной объектной моделью, и вот на нем бы учил.

Page 1 of 3 << [1] [2] [3] >>

Profile

beldmit: (Default)
Dmitry Belyavskiy

December 2025

S M T W T F S
 123456
78910111213
14151617181920
2122 2324252627
28 29 3031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 11th, 2026 09:49 pm
Powered by Dreamwidth Studios