LINUX.ORG.RU

Написание свободной(Free as in Freedom) книги-самоучителя по программированию: планы, цели, задачи

 , , ,


17

9

Итак, я решил написать(или как вариант, собрать из кусочков) книгу-самоучилель по программированию, в которой бы не было глупых и нелепых ограничений на распространение. Однако копилефт я все же считаю приемлемым в данном случае. Общественным достоянием это не будет т.к. вполне могут найтись желающие использовать результат в своих проприетарных книгах, а проприетарные книги — плохо. Лицензия самого текста книги-учебника будет или Creative Commons Attribution-ShareAlike (что позволит без каких-либо проблем переиспользовать текст из википедии) или что-то вроде GNU Free Documentation License (без неизменяемых разделов естественно).

Лицензии всяких примитивных программок, написанных мной лично, будут вообще выложены под общественным достоянием, WTFPL или аналогичной лицензией т.к. являются тривиальными. Примерно вот так. Если я буду использовать чужие исходные тексты, они будут как включения, лицензируемые отдельно от всего остального. Проблем тут быть не должно.

Теперь к теме того, на кого книга ориентирована, какие начальные знания предполагаются, чему книга будет учить, какой первый ЯП взять и каков будет авторский самысел: С этим моментом я пока что не определился окончательно, и тут есть что обсудить. В частности, я не вижу особого смысла объяснять какие-то базовые понятия комбинаторики, об этом можно доступным языком прочитать из школьных учебников. Системы счисления(СС), перевод из одной СС в другую - вот это еще можно. One's и two's complement представления знаковых чисел — про это тоже можно написать. Если же человек не понимает комбинаторику, он ее быстро поймет на примере кода, который будет достаточно наглядно это показывать, и который всенепременно будет.
Пока что в качестве первого языка я склоняюсь к Си, и тому есть причины. Все прочие распространенные языки (кроме ассемблера, хотя его трудно назвать распространенным) не настолько близки к аппаратному уровню. Про нужность понимания на низком уровне написано тут http://russian.joelonsoftware.com/Articles/BacktoBasics.html https://habrahabr.ru/company/piter/blog/271347/ , не вижу смысла повторяться. Приведу лишь цитату:

«Просто плохой воркшоп попался», — скажете вы. Но на этом примере я хочу подчеркнуть более масштабную проблему: не изучив для начала C, программист оказывается лишен необходимых орудий, позволяющих понять, что именно происходит в используемой системе. Если вы — умный и пытливый питонщик, то вскоре докопаетесь до плотных пород языка C. Под этими горизонтами, скажут вам, «бойся драконов, костей и отладчиков». Соответственно, если вы не будете достаточно отважны и не проигнорируете предупреждений «да не берись ты за этот C», вы никогда не исследуете глубин, на которые можно забраться просто из любопытства.

Притом еще один важный момент: Си будет изучаться параллельно с ассемблером. Если речь идет об изучении ассемблера, необходимо четко зафиксировать то, на какой архитектуре это все происходит и в какой ОС. Так вот, ОС будет GNU/Linux а архитектура x86-64. Будут постоянно проводиться параллели между тем, что из себя представляет код на Си в текстовом виде, и тем, в какой текст на ассемблере его превращает компилятор. В связи с этим, первым делом будет рассказано о goto и конструкции if(условие) goto метка;. Про конструкции вида

if(условие)
{
  что-то_делаем;
}
else
{
  что-то_другое_делаем;
}
Будет рассказано немного позже, притом это будет рассказано и словами, и через написание эквивалентного кода через if(условие) goto метка;. Циклы, for(){} while{}, do{}while(), конструкция switch-case и break continue внутри них будут так же объясняться через все тот же if(условие) goto метка; притом будет делаться явный акцент на том, что намного лучше использовать нормальные циклы, чем лепить всюду этот условный goto. Кроме того, будет так же рассказано про Labels as Values. Почему так важна эта странная штука, if(условие) goto метка;? Потому что она имеет наипрямейшее отношение к тому, как работают ЭВМ, а всякие циклы СКРЫВАЮТ это. Рекурсия в Си будет объясняться только после того, как будет объяснено, что такое стекфрейм и соглашения вызова, будет сказано про оптимизацию хвостовой рекурсии, и о проблеме забивания стека, если такая оптимизация не происходит, притом это будет наглядно показано в ассемблере. Учиться отлаживать код надо будет тоже «с пеленок», притом отлаживать и ассемблер, и всякие там Си. Будет и про асм-вставки в Си, clobber list. В качестве ассемблера будет рассматриваться GAS, а никакой не NASM т.к. GCC умеет выплевывать ассемблер именно в GAS синтаксисе. Насчет выбора Intel или AT&T синтаксиса - тут я склонюсь пожалуй к тому, что надо ЗНАТЬ И УМЕТЬ ПОНИМАТЬ ОБА. Кроме того, GAS давно уже умеет в оба синтаксиса, так что проблем с этим не будет. Единственная проблема с GAS в том, что это однопроходной ассемблер, так что можно освоить и какой-нибудь NASM, YASM.

Первые хеллоуворды будут написаны вообще в особом стиле, без использования printf() и вообще без библиотеки Си; Будут использованы куски на ассемблере, которые делают системный вызов write и read, и с ними можно(нужно) будет линковаться, чтоб что-то вывести на экран. Будет рассказано и про printf естественно, но только когда будет совершенно четко ясно, что такое вообще va_list. Будет куча отсылок к драфту стандарта Си (недрафт почему-то платный). Будет так же рассказано про устройство ОС. В конце скорее всего будет дано задание сделать свою игрушечную ОС так что предполагается что человек к тому моменту должен уже отлично понимать всякие там связные списки, графы, очереди, спинлоки-аллокаторы свои уметь делать на асме при желании. Алгоритмы сортировки, обхода графов, хеш-таблицы, все это будет объяснено на языке Си, и плюсов вообще касаться я не буду.

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

Кроме того, после моей книги предполагается, что человек должен уметь заниматься такими ненужными (в GNU/Linux) на первый взгляд вещами, как крякинг, реверсинг, исправление ошибок в бинарниках, не обладая исходным текстом. Восстановление логики работы программы по дизасму. Ну и программирование в машинных кодах (без ассемблера, одним HEX редактором).

Как-то уж слишком дофига, не находите? Может быть не надо так глубоко во все это нырять? Жду предложений и критики по поводу того, что нужно, а чего не нужно писать. Возможно что я слишком много хочу.

cast ASM be_nt_all mister_VA

UPD: Программирование и отладка на C/ASM - Первые программы. Знакомство с C и ассемблером. Компиляция, линковка, код возврата. Вывод текста.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 6)
Ответ на: комментарий от SZT

Вы хотите впихнуть в книгу слишком много. По крайней мере, алгоритмы будут лишними. Сфокусируйтесь на технологиях. Я думаю, у Вас отлично получится книга о системном программировании в среде Unix для программиста, знающего язык си и имеющего базовые знания.

g3nt00
()

прикрутить с2/вики движёк и начать заполнения пустых страниц - а затем сгенерировать выдачу по критерию разной глубины

тогда для «0» глубины будет дайджест для «1» вводный обзор ... и вплоть до несколько тысечастраничного талмуда по правильному использованию инструментов программирования при максимальном включении всех «абзацев».

qulinxao ★★☆
()
Ответ на: комментарий от SZT

https://paste.fedoraproject.org/332708/91779145/ вот например очень «жесткий» код, который был «рожден» в процессе обучения одного человека Си и этому XCB.

--- xcb_sample.c.orig	2016-04-05 03:14:45.899490170 +0200
+++ xcb_sample.c	2016-04-05 03:14:37.907489838 +0200
@@ -379,6 +379,8 @@ int main(int argc, char const *argv[])
     }
     free(event);
   }
+  xcb_disconnect(connection);
+  free(board);
   return 0;
 }

А также:

--- xcb_sample.c.orig	2016-04-05 03:14:45.899490170 +0200
+++ xcb_sample.c.tmp	2016-04-05 03:14:58.695521213 +0200
@@ -281,7 +281,7 @@ int check_win(int (*board)[][BOARD_W], P
   return 1;
 }
 
-int main(int argc, char const *argv[])
+int main(int argc, char *argv[])
 {
   xcb_connection_t *connection = xcb_connect(NULL, NULL);
   /* Get the first screen */
Этот const мне кажется не каноничным. Например, с ним нельзя спокойно вызвать gtk_init(&argc, &argv).

А можно добавить в main ещё char *envp[].

gag ★★★★★
()

На github'е каком-нибудь начни писать. Народ подтянется может быть.

crutch_master ★★★★★
()

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

Теоретически или на самом деле? Или не «написать», а «начать писать»?

Притом еще один важный момент: Си будет изучаться параллельно с ассемблером.

О! Эт правильно. Хоть ассемблером пользоваться скорее всего практически и не придётся, зато можно будет быстрее понять, зачем и почему в Си эти указатели. И тогда задаться вопросом, а как же тогда в Паскале строки вообще реализованы. (Ведь без ассемблера с непонятками всё наоборот.)

Будут постоянно проводиться параллели между тем, что из себя представляет код на Си в текстовом виде, и тем, в какой текст на ассемблере его превращает компилятор.

А можно ещё и промежуточный LLVM IR.

И про JIT тоже можно мельком что-то написать.

А до этого про маленькую JVM.

Рекурсия в Си будет объясняться только после того, как будет объяснено, что такое стекфрейм и соглашения вызова

И конечно же, как ручками сделать себе стек и на асме передать и получить параметры как через регистры, так и через стек.

А потом и как реализовать свои coroutines.

Будет куча отсылок к драфту стандарта Си (недрафт почему-то платный)

Поощряю. Кстати, мне ещё ни разу не попадались возмущения Столлмана. Ведь как можно писать свободный компилятор к «несвободному» языку.

Насчет выбора Intel или AT&T синтаксиса - тут я склонюсь пожалуй к тому, что надо ЗНАТЬ И УМЕТЬ ПОНИМАТЬ ОБА.

А можно ещё и синтаксис ассемблера Golang.

Кстати, а как с мотивацией? Есть уже «предисловие»: зачем мне всё это? Т.е. когда с этим всем знаком, очень трудно понять тех, кто по другую сторону.

Кроме того, после моей книги предполагается, что человек должен уметь заниматься такими ненужными (в GNU/Linux) на первый взгляд вещами,

С нуля до хакинга? Не представляю, как можно человека настолько мотивировать. Лезть в хакинг не столько хочется, сколько, бывает, приходится. И мотивация тогда как раз уже на месте.

gag ★★★★★
()

Пока что в качестве первого языка я склоняюсь к Си, и тому есть причины. Все прочие распространенные языки (кроме ассемблера, хотя его трудно назвать распространенным) не настолько близки к аппаратному уровню.

Во-первых. Писать на си что-то ты не можешь, да и си ты не знаешь и не понимаешь. Зачем учить тому, чего не знаешь? Си нихрена не близок к аппаратному уровню.

Никому не нужны лс"а заучившие пару операторов - толку с этого? Как дело доходит до практики - все вы обелываетесь.

Притом еще один важный момент: Си будет изучаться параллельно с ассемблером.

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

Сложность в понимании и умении писать, но это не про тебя.

Если речь идет об изучении ассемблера, необходимо четко зафиксировать то, на какой архитектуре это все происходит и в какой ОС.

О, ещё одни куллстори. Никому ассемблер уровня ахритектуры не нужен.

Так вот, ОС будет GNU/Linux а архитектура x86-64.

Скорее 386-й питух, максимум в изменёнными префиксами у регистров. Хотя даже это осилилось только по причине сисколов.

Будут постоянно проводиться параллели между тем, что из себя представляет код на Си в текстовом виде, и тем, в какой текст на ассемблере его превращает компилятор.

Опять враньё. Абстрактная херня для if - никому не нужна. Это понимает любой школьник уровня помойки. Хотя для тебя наверное это достижение.

В связи с этим, первым делом будет рассказано о goto и конструкции if(условие) goto метка;.

О боже - гениально. Уровень обезьяны.

Будет рассказано немного позже, притом это будет рассказано и словами, и через написание эквивалентного кода через if(условие) goto метка;.

О боже - а может ещё в горшок научить ходить?

Циклы, for(){} while{}, do{}while()

Уважаемый эксперт. Если ты до этого объяснил адепту что такое иф, хотя я сомневаюсь что ты можешь, но предположим. И если адепт не потомственный поломой, то что такое циклы понятно по умолчанию.

конструкция switch-case и break continue внутри них будут так же объясняться через все тот же if(условие) goto метка;

О боже. О боже. Ну в целом потуги понятны. Адепт обладает не понимаем, а заучиванием частных случаев - он не учит выводить эти случаи из понимания, ибо сам не умеет.

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

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

О боже. УРовень убогости зашкаливает.

Кроме того, будет так же рассказано про Labels as Values.

Эта фича представляется любым адептом без рассказов о ней, как и остальные фичи. Ну и да, а всё остальное не осилилось?

Почему так важна эта странная штука, if(условие) goto метка;? Потому что она имеет наипрямейшее отношение к тому, как работают ЭВМ, а всякие циклы СКРЫВАЮТ это.

Не имеет никакого отношения.

Рекурсия в Си будет объясняться только после того, как будет объяснено, что такое стекфрейм и соглашения вызова,

Сразу видно 386-го адепта, который вылез из макулатуры лсной прошлого века.

Какой нахрен стек в 2015 - или какой щас год? Какой фрейм. Хотя ладно.

будет сказано про оптимизацию хвостовой рекурсии

Рекурсия + си - смешно. Уровень детсада, который не умеет в том, что ты описывал выше.

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

О боже, забивание стека случилось. Слишком сложная тема - прости, уже засыпался.

Учиться отлаживать код надо будет тоже «с пеленок», притом отлаживать и ассемблер, и всякие там Си.

Сишники не отлаживают код.

Будет и про асм-вставки в Си, clobber list.

А, т.е. рассчитано на дауна - ок.

В качестве ассемблера будет рассматриваться GAS, а никакой не NASM т.к.

О боже. У лсов есть какие-то ассемблеры. Ах да, вы же зубрите синтаксис, как домохозяйки кнопочки. Забыл.

GCC умеет выплевывать ассемблер именно в GAS синтаксисе.

Ну уровень лсности поражает.

Насчет выбора Intel или AT&T синтаксиса - тут я склонюсь пожалуй к тому, что надо ЗНАТЬ И УМЕТЬ ПОНИМАТЬ ОБА.

О, тут надо что-то знать и уметь. Хотя да, прости - я забыл, что мы имеем ввиду обезьянок, а не людей.

Никакой вменяемый человек не будет использовать интел-парашу. Используешь её ты только по той причине, что отрыжка 386-й макулатуры.

Кроме того, GAS давно уже умеет в оба синтаксиса, так что проблем с этим не будет.

Проблемы умеет/не умеет никого, кроме ламерком не интересуют. Пацаны выбирают то, что им нравиться и что выглядить вменяемо. Убогая параша вменяемо не выглядит и никому не нужна.

Единственная проблема с GAS в том, что это однопроходной ассемблер, так что можно освоить и какой-нибудь NASM, YASM.

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

registrant27492
()
Ответ на: комментарий от registrant27492

Первые хеллоуворды будут написаны вообще в особом стиле, без использования printf() и вообще без библиотеки Си;

Отлично - сегфолт обеспечен.

Будут использованы куски на ассемблере, которые делают системный вызов write и read, и с ними можно(нужно) будет линковаться, чтоб что-то вывести на экран.

Подожди - ты же учил пацанов вставкам и гису, но не осилил write/read? Феерический опустим определение.

Ну и «линковаться» - это так по лсному.

Будет рассказано и про printf естественно, но только когда будет совершенно четко ясно, что такое вообще va_list.

Убогий кастыль вызванный убогостью 70-х. Хотя ты же кукарекал, что будешь там учить как оно работает в железе, но уже откуда-то высрался убогий va_list? Где calling convention? Опять пробалаболил?

Будет куча отсылок к драфту стандарта Си (недрафт почему-то платный).

Никого не интересует драфт и стандарт си, ибо ты учишь матчасти, а не кастылям си. Хотя матчасти ты не знаешь. В твоём распоряжение 386-я протухшая макулатура уровня делфятинки + фапанье на портянки стандарта, ибо ничего иное не осилилось.

Умножение на ноль в каждом высере.

Будет так же рассказано про устройство ОС.

Никому это не интересно. Это итак ясно. Ну это учитывая уровень твоих куллрассказов.

В конце скорее всего будет дано задание сделать свою игрушечную ОС

Задание. ОС - примитивная херня. И что ты там сделаешь? Напастишь дерьма с осдева и насрёшь принтф? А дальеше что?

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

О боже, уровень ламерка ещё ниже, чем я думал. Какие списки, какие графы. Что ты несёшь? Ты хотел пацанов учить матчасти - какой жопой ты на уровне матчасти и железа высрал списки?

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

На кой хрен ты высрал «реализацию на асм» и какую реализацию ты можешь сделать? Пасту из макулатуры или примитивную херню? Кому она нужна?

Алгоритмы сортировки, обхода графов, хеш-таблицы, все это будет объяснено на языке Си, и плюсов вообще касаться я не буду.

О, обходы случились, а матчасть не случилась.

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

При этом одной извилины хватило на форы, но дальше не хватило.

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

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

Ну и сокеты - конечно важны для ламерков. Этому api осталось от силы лет 5. Когда твоя аудитория выучится - сокеты сдохнут в адских муках на уровне реального кода.

Может быть не надо так глубоко во все это нырять?

Глубоко? Ты потрогал водичку и обделался от страха. Какое глубоко?

registrant27492
()
Ответ на: комментарий от gag

Теоретически или на самом деле? Или не «написать», а «начать писать»?

Да, на самом деле. Чтобы что-то написать, надо начать писать. Получится или не получиться написать до конца — время покажет. Сейчас составлю план того, что буду писать. Скорее всего буду в какой-нибудь вики пилить.

А можно ещё и промежуточный LLVM IR.

Нет, это как раз не нужно.

А до этого про маленькую JVM.

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

И конечно же, как ручками сделать себе стек и на асме передать и получить параметры как через регистры, так и через стек.

Разумеется.

А потом и как реализовать свои coroutines.

На асме - легко.

А можно ещё и синтаксис ассемблера Golang.

Можно, только зачем? Там, судя по описанию, даже не все инструкции ассемблера поддерживаются. Может быть полезно только для тех, кто этот Go использует.

Кстати, а как с мотивацией? Есть уже «предисловие»: зачем мне всё это?

Например я буду туда тыкать всех, кому буду давать уроки на Си и ассемблере, так что польза для меня несомненно будет. Для других тоже несомненно будет.

Т.е. когда с этим всем знаком, очень трудно понять тех, кто по другую сторону.

Мне не трудно. Бывает трудно объяснить некоторые моменты, например те же указатели

С нуля до хакинга? Не представляю, как можно человека настолько мотивировать. Лезть в хакинг не столько хочется, сколько, бывает, приходится.

Дело в том, что это ИНТЕРЕСНО. Интересно понять, как работает программа, не обладая исходными кодами, интересно изменить логику поведения готовой программы, не обладая исходниками и имея на руках только бинарник без дебаг-инфы. Как заюзать какую-нибудь уязвимость с выходом за границу массива в своих грязных целях. Цель подготовить какого-то крякера-реверсера я не ставлю, но полученные знания должны быть достаточными, чтобы потом человек смог сам спокойно погрузиться в эту тему, прочитав например нечто вроде https://web.archive.org/web/20140627111931/http://exelab.ru/art/?action=view&... . Но там что-то про IDA Pro с виндой рассказывают, это платный проприетарный софт, и я не хочу его пиарить, так что если я нечто захочу по этой теме крякинга-реверсинга рассказывать, это будет через GDB objdump binwalk radare2. https://github.com/dennis714/RE-for-beginners есть еще такое, но там лицензия не очень, и опять таки говорят про IDA. Надо посмотреть в сторону https://www.gitbook.com/book/radare/radare2book/details

Да, кстати. Пилить это дело я скорее всего буду в какой-нибудь вики, какую посоветуете? https://lorwiki.ru/ есть, но там Sorrymak вроде главный, а его тут на лоре банят постоянно, лол. Интересно, какой там у него сейчас ник

SZT ★★★★★
() автор топика
Ответ на: комментарий от registrant27492

О, царь пришел. Твое появление было вполне ожидаемым, но мнение твое мне интересно меньше всего. Даже не буду читать ту бредятину, которую ты тут понаписывал

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Естественно ты не будешь, вернее как - будешь. В любом случае ты понимаешь где твоё место и не важно сознаёшься ты или нет.

А вместо того, чтобы отвечать мне хернёй - попытался бы ответить по-существу, авось и смог бы понять в чём твои ошибки.

Перед тем, как учить - надо ответить на вопрос - что-то можешь? Ну для начала ответить за свои утверждения о том, что ты что-то знаешь и достоин кого-то учить.

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

Ну и как моё мнение может быть не интересно, если я объективно сильнее. Значит ты пришел не совета просить, а бохвалиться. Убого и низко.

registrant27492
()
Ответ на: комментарий от SZT

Например я буду туда тыкать всех, кому буду давать уроки на Си и ассемблере

Я записываюсь к тебе на уроки. Мне даже интересно.

registrant27492
()

Sorrymak the_electric_hand нет ли возражений, если я начну писать на https://lorwiki.ru/ ? Или лучше попробовать в викиучебниках? Там кстати есть какие-то полезные заготовки https://ru.wikibooks.org/wiki/Язык_Си_в_примерах https://ru.wikibooks.org/wiki/Ассемблер_в_Linux_для_программистов_C

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Все перечисленное, и еще больше. На выходе должен получиться человек, способный написать свою ОС, т.е. человек должен уметь делать все то, что нужно чтобы написать свою ОС. Про алгоритмы, структуры данных — должно быть про очереди, связные списки, двусвязные списки, деревья, графы, алгоритмы на графах, хеш-таблицы, всякие там задачи коммивояжера(NP-полные), динамическое программирование. Человек должен быть в состоянии выдумывать свои алгоритмы, про теорию сложности он тоже должен понимать, как и про всякие низкоуровневые штуки, вроде промахов кэша. Человек должен быть в состоянии написать интерпретатор, например придумать свой гипотетический процессор с неким набором инструкций, написать его интерпретатор(эмулятор) на Си и потом уметь писать под него код в машинных кодах в в 16-ричном редакторе.

На изучение этого надо лет 10.

curufinwe ★★★★★
()
Ответ на: комментарий от SZT

Или лучше попробовать в викиучебниках?

Попробуй лучше в gitbook.

theNamelessOne ★★★★★
()
Ответ на: комментарий от SZT

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

да откуда вы беретесь то? что Croco, что Вы, с параллельной реальности?
учить людей, что такое if\else и при этом заливать про ассемблер и свою ОС?

  • никто сейчас не способен написать свою ОС в одну каску, тех. сингулярность не даст
  • какой процент новичков без спец. образования с одной книжкой в руках написали графическое приложение прежде чем устроится на работу по специальности инженер-программист? что за бред про иксы? в вашей реальности всё ещё восьмидесятые?
  • с чего вы оба взяли, что новичкам вообще интересно перемежать на страницах одной книги введение в логику и тут же алгоритмы? да дружище, смотри - if\else, B-tree, а ещё дизасемблер, ты же был готов к этому не зная про информатику раньше.
  • программирование НЁХ редактором! вот что изучает поколение айфонов в вашей реальности сегодня!

и никто из вас даже не подумал о людях, которые ничего не знают или знают поверхностно, возможно уже с синдромом утёнка
даже не задумались о там, что кроме if\else есть ещё системы тикетов, TDD, прочие процессы разработки, что человек после ваших книг будет жестоко обломан _нашей_ суровой реальностью 2016 года
возможно, кто-то даже осознает, что дни за книгами потрачены на странные вещи, на забытые технологии древней цивилизации из параллельного мира.
лучше бы курс на хекслет прошел.

system-root ★★★★★
()

Судя по тому, что я прочел тут, книга будет не для будущих РЕАЛЬНЫХ программистов, а для гнущих пальцы на форумах утырков.

Akamanah ★★★★★
()
Ответ на: комментарий от curufinwe

Нет, это вранье. Всё это примитивное дерьмо, о котором набалаболил адепт выше - это 2-3года пту. Там уровень детсада.

Ну куда не возьми:

Человек должен быть в состоянии написать интерпретатор, например придумать свой гипотетический процессор с неким набором инструкций, написать его интерпретатор(эмулятор) на Си и потом уметь писать под него код в машинных кодах в в 16-ричном редакторе.

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

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

И тут как бэ обыватель видит «линукс - сложно, интел - сложно», наверное и пацаны делают что-то такое же сложное, пусть и не совсем то - чуть полегче, не так технологично, но сложно.

Написание эмулятора убогий херни - дело 5минут. Написание эмулятора суперскалярного процессора с реальными ограничениями - это сложно. Без ограничений - лишь 1/100 сложности.

Кукарекать про «промахи кеша» нихрена не зная о кешах - просто. Понимать в реальном микроахитектуре сложных процессоров и иерархиях и работы их кешей - сложно.

И так во всем. Пастить убогие «алгоритмы» из макулутыры и кукарекать о том, что что-то там в них понимаешь - бесполезно. Сложность в имплементациях, а не в конкретном факте «я спастил готовую реализацию - я смог насрать кусок дерьма еле работающего» - я что-то там знаю.

registrant27492
()
Ответ на: комментарий от SZT
#include <unistd.h>

int main(void)
{
  const char s[] = "Hello World!\n";
  write(STDOUT_FILENO, s, sizeof(s));  
  return 0;
}

Более понятно, а то n даже меня смутило.

AlexVR ★★★★★
()
Последнее исправление: AlexVR (всего исправлений: 1)
Ответ на: комментарий от SZT

Да, кстати. Пилить это дело я скорее всего буду в какой-нибудь вики, какую посоветуете?

Я в последнее время смотрю в сторону Markdown + Pandoc + фильтры для Pandoc. Результат: отформатированный и подсвеченный код, который можно скопировать с отступами; красивые формулы; вспомогательные информационные блоки за счёт div-ов.

AlexVR ★★★★★
()
Ответ на: комментарий от system-root

нужно лишь признать, что сейчас средний уровень программиста много ниже чем таковых в середине 70тых.

при том что индустрия в целом содержить в себе более высококлассных спецов чем тогда.

о каком вообще обучении неофитов может идти речь когда они двузначные числа в уме не способны перемножить.

qulinxao ★★☆
()
Ответ на: комментарий от system-root

никто сейчас не способен написать свою ОС в одну каску, тех. сингулярность не даст

Способен.

какой процент новичков без спец. образования с одной книжкой в руках написали графическое приложение прежде чем устроится на работу по специальности инженер-программист?

На дельфях куча школьников калькуляторы делала, набрасывая кнопочки на формочки

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

А в чем проблема?

да дружище, смотри - if\else, B-tree, а ещё дизасемблер

Именно! Надо понимать все это на всех уровнях.

программирование НЁХ редактором!

Программирование в опкодах это конечно не очень полезный навык, но надо понимать, каким образом можно программировать в опкодах.

даже не задумались о там, что кроме if\else есть ещё системы тикетов, TDD, прочие процессы разработки

Всякие там тикеты, TTD, скармы и канбаны не имеют непосредственного отношения к процессу программирования, т.е. к процессу написания кода. Ни в книге по бейсику, ни в книге по паскалю, ни в книге K&R по Си котораые у меня есть, ни в одной из них эти процессы не описывается. Для этого пусть идут другие книжки читают. Я не говорю что это вообще не нужно, просто не буду об этом писать.

SZT ★★★★★
() автор топика

Тема отлично раскрывает, почему хардкорных технарей (и даже, возможно, очень хороших) нельзя близко подпускать к обучению живых людей.

ovk48 ★★★
()

Как-то уж слишком дофига, не находите?

Действительно, столько букв я не осилил. Возьми ещё Forth, он содержит очень важные концепции метапрограммирования, которых в C нет (если уж не хочешь брать схему или лисп). В ассемблере они, наверное есть, но не так явно выражены, как мне кажется, хотя я на ассемблере практически ничего не кодил. И Forth всё же близок к железу.

И второе: в наше время всё меньше программирования, всё больше работы с существующим кодом. Эта тенденция будет со временем только нарастать. Это два разные вида деятельности. Вот это должен сразу понимать и к этому должен сразу быть готов тот, кто начинает карьеру, чтобы не потратить 10 лет на преодоление своего NIH синдрома.

den73 ★★★★★
()

Ура, новый срачетопик!.

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

Из организационных вопросов было бы полезно организовать новый проект на github или ещё где. Решить кто же будет всё же автором книги, вы или сообщество. (Т.е. кто будет принимать конечное решение включать это в книгу или нет?) В чём она будет написана, в LaTeX?

Что касается содержания, лично мне нравится идея, Croco, первая книга должна быть вводной, понятной даже школьнику, вторая уже с углублением в язык C. Как смотрите на то, чтобы вступительную часть сделать на ruby?

Содержание примерно следующее:

  • История компьютеров
  • Вводный курс по использованию компьютера (bash и тп)
  • Первые программы ЯП
  • Математический лекбез
  • Первые простые графические приложения
  • Тестирование и отладка
  • Углубление в синтаксис языка
  • Игрушка тетрис или что-то подобное
  • Краткий обзор QT/GTK
  • Примеры программ на QT/GTK
  • Базы данных

Вторую книгу уже по вашему сценарию.

Если сформировать все разделы, можно будет независимо друг от друга заполнять разделы.

ASM ★★
()

предлагаю главный тезис от аналитиков ЛОР к этому труду:

программирование ненужно. 

MKuznetsov ★★★★★
()
Ответ на: комментарий от SZT

А какая вообще разница, кто я? Вам важно содержание книги, или тот, кто ее написал(личность автора)? Кроме того, как я уже сказал, книга не будет 100% моим творением

SZT, пожалуйста, не кормите троллей.

ASM ★★
()
Ответ на: комментарий от ASM

Непоследовательно. bash скрипты - это уже программирование. Простые графические приложения до изучения GTK - это как? Qt - вообще плюсы (причем приплюснутые), а речь о C. Если зарыться тут еще в плюсы, можно и не выбраться.

curufinwe ★★★★★
()
Ответ на: комментарий от curufinwe

Непоследовательно. bash скрипты - это уже программирование.

Тут неверно выразился, использование компьютера, включение, выключение, создания каталога, создания файла main.c или main.rb, редактирование, компилирование, запуск.

Простые графические приложения до изучения GTK - это как?

Под графикой имелось введу 2D графика на каком-нибудь не сложном движке. Что то из серии img=loadimage(«image.jpg»); drawimage(img, 10,20);

Qt - вообще плюсы (причем приплюснутые), а речь о C

Как вы могли заметить, я предложил вводную книгу на высокоуровневом языке, а именно Ruby.

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

ASM ★★
()
Последнее исправление: ASM (всего исправлений: 1)
Ответ на: комментарий от curufinwe

Соглашусь с тем, что начинать надо с высокоуровневого языка. Но я бы проголосовал за питон.

Питон более грязный в части синтаксиса. Но в целом он более популярен, так что в этой части я не настаиваю.

ASM ★★
()
Ответ на: комментарий от ASM

А объясни мне пожалуйста, зачем сишнику нужны «Краткий обзор QT/GTK» и прочее, если это всё подмножество лоулевел.

Вот у нас есть домохозяйка - ей надо показывать «краткий обзор в ворд/ексель/меню пуск» - это её уровень. А есть прошаренный пацан - зачем ему экскурс в «меню пуск»? Если у него есть более низкое понимание - он что не сможет нажать и сам изучить/разобраться «меню пуск»?

Если ты готовишь домохозяйку - зачем ей линукс и программирование на пистоне - ей нужно «меню пуск». Если ты готовишь «Линукс-питонщика» - зачем ему «меню пуск»? Тут надо определиться. А у вас всё смешалось в кучу - кони, люди.

Зачем тому, кто понимает матчасть, имплементации и теорию языков - какой-то «углубление в синтаксис языка» - зачем ему это? Она итак понимает любой синтаксис только взглянув на него.

Это разный уровень - понимание как работает и уровень «нажми на кнопку - получишь результат». Изучение синтаксиса, изучение api - это всё не имеет отношение к пониманию - это просто заучиванию набора действий для получения конкретного результата.

Ну научил ты пацана нажимать кнопочки на калькуляторе и решать задачи копипастя условие в калькулятор - он научился считать? А если он умеет считать и умеет в компьютер - он автоматически умеет и в какулятор и в его реализацию, вернее умеет в калькулятор через возможность к его реализации.

registrant27492
()
Ответ на: комментарий от ASM

SZT, хотя потыкался в gitbook, что-то оно уж очень плохо работает. (толи досят сейчас сервак, толи хз) Да и ещё постоянно какие-то ошибки вылезают. ИМХО сыровато. Вероятно стоит всё же на github обычным latex проектом, а потом уже перелесть на gitbook или ещё куда, если это будет иметь смысл...

ASM ★★
()
Ответ на: комментарий от ASM

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

О боже - эта логика не выдерживающая критики и банальной встречи с реальностью.

Хорошо, среди адептов очень популярен миф «появятся вопрос „как это работает?“». Берём реальный мир. Секретарша пишет чиселки в ексельчик - у неё возникает желание в следующие выходные узнать как они работают? Прочитать книгу по БД и программированию?

Школьник тыкаешь мобилку - у него появляется желание и вопросы «как это работает»? У кого-то они вообще появляются? Нет. И не могут появится.

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

registrant27492
()
Ответ на: комментарий от registrant27492

Идея примерно такова.

Ну вот есть человек, у него есть компьютер, он умеет запускать там разные приложения, окошечки, игрушечки и тп. Когда человек вдруг решает, «а не стать ли мне программистом», он берёт в руки книгу и начинает читать. Ему сразу показывают, что всё что он хочет сделать очень легко. Хочешь что-то посчитать, пожалуйста, хочешь игрушечку простую написать, пожалуйста, хочешь окошечки, опять же, пожалуйста.

Человек начинает понимать, что компьютер это очень просто и легко. После чего наступает суровая реальность жизни... Если он захочет углубится в недры системы, то начнёт читать вторую книгу..

ASM ★★
()
Ответ на: комментарий от registrant27492

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

А вы хотите всех людей на планете научить программированию? Если человеку это не интересно, то зачем ему пытаться это объяснить?

Школьник тыкаешь мобилку - у него появляется желание и вопросы «как это работает»? У кого-то они вообще появляются? Нет. И не могут появится.

Где пруфы? Где результаты опроса людей занимающихся программированием, сфигали они полезли в эту область? Если вы программист, ответьте, почему начали заниматься этим?

ASM ★★
()
Последнее исправление: ASM (всего исправлений: 1)
Ответ на: комментарий от ASM

А вы хотите всех людей на планете научить программированию?

Причём тут всех людей. Я говорю не про всех людей.

Если человеку это не интересно, то зачем ему пытаться это объяснить?

Если ему это интеерсно - он никогда и ни при каких обстоятельствах не будет ни трогать, ни кукарекать, ни писать на руби.

Где пруфы?

Пруфы - мильёны школьников не программистов, мильёны домохозяек не программистов.

Где результаты опроса людей занимающихся программированием, сфигали они полезли в эту область?

За едой?

Если вы программист, ответьте, почему начали заниматься этим?

Потому что это развитие предыдущего занятия, да и в целом некстген.

Ну и да, ты путаешь путь и причину. Школьнику интересно и если он попадает сюда через пхп, либо ещё что-то - это не значит, что ему было интересно как работают те же сайты и прочее.

Он просто ничего, кроме сайтов не знал. Вон и пошел в пхп. Или пошел в жабску, если китайфон.

registrant27492
()
Ответ на: комментарий от g3nt00

Книга по программированию

По крайней мере, алгоритмы будут лишними.

Все, порвало, хочу выйти в окно

Без алгоритмов, книга превращается в справочник

anonymous
()
Ответ на: комментарий от registrant27492

Если честно, ни фига не понял суть ваших комментов. Расскажите лучше, как по вашему человек становится программистом? Историю среднестатистического потенциального Васьки в вакууме.

ASM ★★
()
Ответ на: комментарий от ASM

Ну вот есть человек, у него есть компьютер, он умеет запускать там разные приложения, окошечки, игрушечки и тп. Когда человек вдруг решает, «а не стать ли мне программистом», он берёт в руки книгу и начинает читать. Ему сразу показывают, что всё что он хочет сделать очень легко. Хочешь что-то посчитать, пожалуйста, хочешь игрушечку простую написать, пожалуйста, хочешь окошечки, опять же, пожалуйста.

Из такого человека выйдет домохозяйка не более.

Человек начинает понимать, что компьютер это очень просто и легко. После чего наступает суровая реальность жизни... Если он захочет углубится в недры системы, то начнёт читать вторую книгу..

Он не захочет. Зачем, если так работает то, что он делает? Вот рубист/пхпист пишет свои сайтики и ему система твоя никак не упала.

Желание недр системы - оно изначально. Если способности к этому есть - человеку просто не интересны твои хелворды на пхп.

registrant27492
()
Ответ на: комментарий от ASM

Программист и «понимающий» - это разные вещи. Программист - этот тот, кто лутает еду с написания кода. Какой это код - никому не важно.

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

А среднестатистический васька никакого отношения к «как это работает» не имеет, ибо не имеет ни желания, ни возможности это понять.

registrant27492
()
Ответ на: комментарий от SZT

В хеллоувордах с использованием printf код возврата printf тоже никто не обрабатывает.

Обратите внимание, что функция write может быть отмечена как warn_unused_result, в gcc флаг -Wunused-result включён по умолчанию.

Следовательно велика вероятность получить соответствующий ворнинг. Я как человек, предпочитающий использовать Wall и Werror получу факап на этой строчке.

В свою очередь замечу, что использовать Wall и Werror крайне полезная практика, она приучает к дисциплине и помогает сэкономить очень много времени.

ASM ★★
()
Ответ на: комментарий от ASM

В свою очередь замечу, что использовать Wall и Werror крайне полезная практика, она приучает к дисциплине и помогает сэкономить очень много времени.

Нет. Это ведёт только к деградации.

registrant27492
()
Ответ на: комментарий от registrant27492

Я вот до сих пор люблю поиграть в игрушечки. И занялся программированием, когда вдруг захотел в тех окошечках в виндовсе нарисовать что-то иное. Если бы не VisualBasic и VBA ...

Может быть вы пошли другим путём. Из чего можно сделать вывод, что оба варианта имеют шанс на существование.

Вот рубист/пхпист пишет свои сайтики и ему система твоя никак не упала.

Никак, до тех пор пока внезапно его сайт становится популярным. А тут и злобные кулхацкеры со своими DoS атаками, или хомячки которые залайкали проект в соц сети... Вот тут то и начинает формироваться проффесионал... Ко всему прочему проект начинает требовать доп. рабочий силы он начинает не только оптимизировать сам код, но и отладку, работу... В том числе начинает ковыряться в системе чтобы понять где сука тормозит...

ASM ★★
()
Ответ на: комментарий от ASM

Может быть вы пошли другим путём. Из чего можно сделать вывод, что оба варианта имеют шанс на существование.

Да не в этом дело. Кода и кто пошел. Тут изначальное недопонимание в термине «программист» и то, чем является сишник. Я не говорю о рядовых программистах - им ни сишка, ни матчасть не нужна.

Никак, до тех пор пока внезапно его сайт становится популярным. А тут и злобные кулхацкеры со своими DoS атаками, или хомячки которые залайкали проект в соц сети... Вот тут то и начинает формироваться проффесионал...

Нет. Тут начинается гугление и по хауту накатывание примочек на пхп.

Ко всему прочему проект начинает требовать доп. рабочий силы

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

не только оптимизировать сам код

Он не начинает его оптимизировать - он начинает придерживаться требований/советов из интернета/макулатуры. Это не имеет никакого отношения к пониманию.

но и отладку, работу...

Не имеет никакого отношения к пониманию. Сложные проекты нереально никак отладить - они не отлаживаются.

В том числе начинает ковыряться в системе чтобы понять где сука тормозит...

Ничего он не ковыряется - опять же - набор советов по хауту и брутфорсом перебирание кастылей из интернета/макулатуры.

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

Это как с копанием в технике. Один человек копается в машине/технике без всякой причины - это ему интересно. Интересно понять. А то, что у какого-то адепта что-то сломалось и его клюнул жареный питух и он своими кривыми кульяпками что-то там захреначил по мануалу из diy - это не diy - это профанация.

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

registrant27492
()

https://lorwiki.ru/wiki/Программирование_и_отладка_на_C/ASM кое-какие предварительные наброски. Это то, о чем в самом начале планируется писать. Все это в процессе доработки. Потом будет разбито на разделы, главы, параграфы. Жду предложений и адекватной критики. Я не против чтобы кто-то начал что-то менять в этой статье-наброске плана, но тут думаю ясно, какой подход к изложению материала я выбрал, так что советую придерживаться этого подхода.

SZT ★★★★★
() автор топика

Прочитал описание, и понял что хотел бы прочитать такую книгу.

Просто потому что мне не хватает знаний lowlevel на достаточно глубоком уровне.

А это говорит о том, что может Вы все-таки неверно выбрали целевую аудиторию? Если бы я был начинающим школьником, который никогда не программировал, то скорее всего я бы просто не понял зачем мне все это, когда можно взять какой-то учебник в духе как писать игры с нуля на C#.

Понимание, что круто именно то что Вы предлагаете, у ЦА отсутствует. «Дядя застрял в прошлом веке и предлагает какую-то парашу/ программирование сложное и непонятное».

Вы хотите впихнуть в книгу слишком много. По крайней мере, алгоритмы будут лишними. Сфокусируйтесь на технологиях. Я думаю, у Вас отлично получится книга о системном программировании в среде Unix для программиста, знающего язык си и имеющего базовые знания.

Если кратко, то на 100% согласен с последним предложением цитаты. Будет действительно нужная книга, для тех кто понимает что она нужна.

chuemir
()
Ответ на: комментарий от anonymous

Не стоит навешивать такие ярлыки на книги. Вот Дейтелы Программирование на С++, там ведь нет объяснения алгоритмов, и тем не менее она считается достойной «книгой по программированию».

g3nt00
()
Ответ на: комментарий от ASM

Вероятно стоит всё же на github обычным latex проектом

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

SZT ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.