Взрослый человек хочет научиться программированию

6yrop

У нас в конторе есть дизайнер, классно рисует и в фотошопе, и илюстраторе. Он попросил меня назвать книгу, по которой он смог бы освоить азы C#-а. При этом человек никогда не программировал и не знаком ни с одним языком программирования. Я немного растерялся... Какую книгу ему можно посоветовать?

Dasar

Раньше рекоммендовал Троельсен-а, но он еще по первому шарпу. из более новых - не знаю.

sergeikozyr

книгу по лого присоветуй

6yrop

Раньше рекоммендовал Троельсен-а, но он еще по первому шарпу. из более новых - не знаю.
человек вообще не знает ни что такое переменная, ни что такое операторы... Например, там объясняют с нуля, что такое reference/value type? и тому подобные фундаментальные моменты?

sergeikozyr

не знает ни что такое переменная
и хорошо. Присоветуй ему scheme

Dasar

человек вообще не знает ни что такое переменная, ни что такое операторы... Например, там объясняют с нуля, что такое reference/value type? и тому подобные фундаментальные моменты?
объясняют, но бегло

timefim

Цель у него какая? Смена рода деятельности?

6yrop

Цель у него какая? Смена рода деятельности?
скорее чтобы быть "ближе" к программерам, чтобы лучше понимать друг друга.

apl13

Взрослый человек, а хочет научиться программированию!

lubanj

человек вообще не знает ни что такое переменная, ни что такое операторы... Например, там объясняют с нуля, что такое reference/value type? и тому подобные фундаментальные моменты?
какую-нибудь книгу по паскалю

Bibi

сначала основы C, а потом джаваскрипт.

hoha32

причём такие основы, в которых и до ООП придётся дойти.

s507040

в С нет ооп

hoha32

учитывая, что в первом посте упомянут C#, я благодушно решил, что человек употребляет букву С без модификаторов исключительно в целях ускорения написания поста, и не стал ему указывать на столь грубую ошибку.

Bibi

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

SPARTAK3959

Для того чтобы узнать что такое переменная и память можно использовать pascal. Да и C# вполне подходит, после объяснения нескольких магических слов. Вот только книг по C# (в отличие от паскаля) использующих этот подход я не видел.

bleyman

Э нет, в случае сишарпа есть различие между value и reference типами, которое и опытному программисту может парочку неприятных сюрпризов подкинуть. В жаве, кстати, тоже, только там нет пользовательских value types.

Dasar

Э нет, в случае сишарпа есть различие между value и reference типами, которое и опытному программисту может парочку неприятных сюрпризов подкинуть.
если забыть и не вспоминать слово struct, то особых сюрпризов я так сразу и не вспомню.

Hastya

книгу по лого присоветуй
Лого рулит! Прямо воспоминания всколыхнулись :)

Papazyan

Посоветуй ему язык К, сразу перестанет донимать дурацкими вопросами.

bleyman

Слово int ты тоже забудешь и не будешь вспоминать?
Можно, конечно, объявить, что инты на самом деле immutable, операция + создаёт новый инт, ну и так далее. Как будто int a ссылается на один из этих immutable интов, которые где-то лежат. Но от этого, боюсь, крыша у чувака совсем съедет.

Dasar

ну, да, вроде все просто.
где-то в памяти есть данные: числа, строки, классы и т.д.
для того, чтобы с этими данными работать у нас есть именнованные ссылки - переменные.
простые типы(числа, строки и т.д.): после любых операций пересоздаются заново.
ps
про immultable строки все равно же придется объяснять...

Andbar

immultable строки
Кстати, а чем они лучше строк, представляемых массивом символов, каждый из которых можно изменить?

6yrop

простые типы(числа, строки и т.д.): после любых операций пересоздаются заново.
операция i++ в цикле для int-ов приемлема, а вот для строк нежелательна.

Dasar

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

Dasar

операция i++ в цикле для int-ов приемлема, а вот для строк нежелательна.
это точно - не первый этап обучения, и даже не второй.

enochka1145

"Thinking in C#", Bruce Eckel.
Не знаю, насколько сейчас актуальная. В своё время мне очень понравилась.

6yrop

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

Dasar

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

6yrop

Какое именно заблуждение?
заблуждение в том, что при i++ будет создан новый объект, под него будет выделена память.

6yrop

простые типы(числа, строки и т.д.): после любых операций пересоздаются заново.
ps
про immultable строки все равно же придется объяснять...
я не пойму, что ты пытаешься сэкономить? У тебя все равно есть простые типы и составные. В реальности для "простых" типов используются два механизма value type и immultable. Ты же загоняешь все под immultable. Имхо, экономия не шибко большая, а запутывание основ это нехорошо. Мне это напоминает, как в школе пытаются изучать физику (механику) раньше, чем школьники проходят понятие производной на уроках математики. А на уроках математики изучают производную (зубрят правила взытия производных от элементарных функций и т.д.) без осознания понятия предела (понятия предела в учебнике, кажется, вынесено в факультативный раздел, который большинство не читает).

kruzer25

заблуждение в том, что при i++ будет создан новый объект, под него будет выделена память.
Ага, а в первом классе - заблуждение в том, что, если один объект летит в одну сторону со скоростью v1, а другой - в противоположную со скоростью v2, то скорость второго объекта относительно первого будет v1+v2.
И ч0?

Dasar

В реальности для "простых" типов используются два механизма value type и immultable
что дает это твое мифическое знание реальности?
а если ничего не дает - то это знание лишнее. на первых этапах - уж точно.
i++
создается новая копия числа с +1, ссылка на которое заносится в i,
старая копия числа возвращается как результат выражения.

Dasar

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

kruzer25

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

6yrop

что дает это твое мифическое знание реальности?

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

Dasar

мое объяснение нравится тем, что оно вносит минимум понятий для запоминая, а именно:
1. простой тип (value type/immutable)
2. место в памяти
3. ссылка на эту память
4. переменная - именнованная ссылка
5. сложный тип - класс или массив: это набор ссылок
рассказывается так же хинт: что для того чтобы программа была простой, то лучше и со сложными типами, строить работу как с immutable (этому как раз тот же linq способствует)

Dasar

То есть, ++i на глупых компиляторах будет быстрее, чем i++?
это совсем уж на глупых компиляторах, на каких-нибудь "построчниках" - сейчас таких вроде нет.

Dasar

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

6yrop

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

Dasar

я не понимаю, почему способ хранения данных (по месту/через ссылку) надо выносить в основу...
вон в каких-нибудь php/js/vb - вообще на эту тему не парятся и нормально пишут программы

bleyman

что дает это твое мифическое знание реальности?
То, что когда ты таки соберёшься объяснить человеку, как же так всё-таки получается, что структуры могут быть не immutable (а случится это раньше, чем ты думаешь, как только он увидит стандартные Point/Rectangle или Complex вся твоя аккуратно выстроенная картина мира, в которой int i = 5; создаёт в хипе иммьютабл объект 5 и присваивает в i на него ссылку (а это уже хитрый оптимизирующий компилятор ничего не создаёт, пользуясь тем, что тип ссылки у него тоже есть вот она вся пойдёт нафиг и чувак начнёт дико мучаться. И поминать тебя нехорошими словами. Ну, я бы расстроился, если бы со мной кто-нибудь такой фокус выкинул.
Всё-таки программирование - это не математика. В программировании важны конкретные механизмы, причём компиляторы в общем-то не должны слишком уж активно в эти механизмы вмешиваться. С математической точки зрения список неотличим от массива, с программистской — это разные структуры данных, реализованные при помощи разных механизмов. Само осознание этого отличия необходимо программисту.
Кстати, возвращаясь к топику: правильней всего начинать изучение программирования с Питона, вот! Он дико простой, намного проще шарпа, в нём вообще нет всей этой лишней инфраструктуры вокруг хелловорлда, объяснение которой приходится отложить на потом, в нём инты на самом деле лежат в хипе, при этом он вполне мощный, в смысле лёгкости выражения мыслей. И прозрачно лежит на своей сишной реализации, то есть после овладёвывания им можно изучить С и увидеть, как он таки работает.

Dasar

структуры могут быть не immutable (а случится это раньше, чем ты думаешь, как только он увидит стандартные Point/Rectangle или Complex
но работать с ними приходится все равно как immutable,

figure.Center.X = 5;//это все равно не работает

figure.Center = new Point(5, figure.Center.Y);//а как immutable работает

поэтому, имхо, проще объяснить - что mutable структуры - это такая выродская ошибка.
и про mutable структуры забыть как о страшном сне.

Dasar

структуры могут быть не immutable (а случится это раньше, чем ты думаешь, как только он увидит стандартные Point/Rectangle или Complex вся твоя аккуратно выстроенная картина мира
в скольки программах, ты использовал знание, что структуры (хотя бы Point, Rectangle - mutable)?
и приведи, пожалуйста, пример кода - который этот факт использует.
ps
имхо, в лучшем случае - это только что-то жутко оптимизационное.

bleyman

Интересный вопрос.
А какие вообще могут быть причины использования структур кроме жутко оптимизационных?
Ни деструкторов, ни оверрайдабл присваивания у них нет, поэтому для RAII какого-нибудь их использовать нельзя (подозреваю, что это сделано специально!)
Везде, где хочется просто иммутабельности, можно использовать классы.
Использовать некую структуру как раз с понтом что юзер на своей стороне может её у нас взять, изменить одно поле (вместо вызова конструктора с кучей параметров) и записать обратно, так, что мы об этом обязательно узнаем... Нет, это тупо.
Ну и вот. В моём коде структуры используются только в оптимизационных целях, поэтому лежат в массивах вместо List<T>, отдаются в интернал доступ как поля, а не как проперти, и так далее. И, конечно, я экономлю на лишних присваиваниях и вовсю использую их мутабельность.
Кстати, на самом деле вся твоя стройная картина поломается ровно в тот момент, когда чувак попытается написать "int i = null" =)

Dasar

Кстати, на самом деле вся твоя стройная картина поломается ровно в тот момент, когда чувак попытается написать "int i = null" =)
так это тип такой (вводится для упрощения написания расчетов) - который проверяет, что ссылка не может быть null.
в какой-нибудь эйфеле это даже можно делать штатными средствами.

nawok

Кстати, на самом деле вся твоя стройная картина поломается ровно в тот момент, когда чувак попытается написать "int i = null" =)
Может тогда так писать?
int? i = null;

6yrop

так это тип такой (вводится для упрощения написания расчетов) - который проверяет, что ссылка не может быть null.
ты не заметил, что ввел еще одно правило для запоминания? :smirk: Т.е. количество правил для запоминаний уже сравнялось, то преимущество, ради которого ты это все затеял, уже исчезло, а ты продолжаешь скрывать реальность от чувака. :smirk:

6yrop

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

durka82

Может ему какой-нибудь Флэш или Сильверлайт освоить?..

6yrop

Сильверлайт освоить?..
тк во втором сильверлайте прогать надо на сишарпе

timefim

Плюс еще с десяток языков.

6yrop

Плюс еще с десяток языков.
которые через пару лет перестанут поддерживать, как J# :smirk:

timefim

Как минимум javascript будет жить долго.

durka82

Насчет качества Сильверлайта ничего не скажу - я только на Флэше писал.
Но как минимум это ему ближе как дизайнеру.
Так что может стоит книгу по Сильверлайту почитать?..
Оставить комментарий
Имя или ник:
Комментарий: