Взрослый человек хочет научиться программированию
Раньше рекоммендовал Троельсен-а, но он еще по первому шарпу. из более новых - не знаю.
книгу по лого присоветуй
Раньше рекоммендовал Троельсен-а, но он еще по первому шарпу. из более новых - не знаю.человек вообще не знает ни что такое переменная, ни что такое операторы... Например, там объясняют с нуля, что такое reference/value type? и тому подобные фундаментальные моменты?
не знает ни что такое переменнаяи хорошо. Присоветуй ему scheme
человек вообще не знает ни что такое переменная, ни что такое операторы... Например, там объясняют с нуля, что такое reference/value type? и тому подобные фундаментальные моменты?объясняют, но бегло
Цель у него какая? Смена рода деятельности?
Цель у него какая? Смена рода деятельности?скорее чтобы быть "ближе" к программерам, чтобы лучше понимать друг друга.
Взрослый человек, а хочет научиться программированию!
человек вообще не знает ни что такое переменная, ни что такое операторы... Например, там объясняют с нуля, что такое reference/value type? и тому подобные фундаментальные моменты?какую-нибудь книгу по паскалю
сначала основы C, а потом джаваскрипт.
причём такие основы, в которых и до ООП придётся дойти.
в С нет ооп
учитывая, что в первом посте упомянут C#, я благодушно решил, что человек употребляет букву С без модификаторов исключительно в целях ускорения написания поста, и не стал ему указывать на столь грубую ошибку.
я имел ввиду именно С. в первом посте написано про дизайнера, которому надо попрограммировать, чтобы, проще говоря, быть в теме, а про C#, скорее всего, этот человек ничего не знает и это не ключевой момент в его желании.
неплохо хотя бы что-то знать про C и хотя бы что-нибудь написать, чтобы представлять, что такое переменные и память, а в качестве языка более высокого уровня, наверное, можно советовать все, что угодно. просто javascript --- язык настоящего и будущего =)
Для того чтобы узнать что такое переменная и память можно использовать pascal. Да и C# вполне подходит, после объяснения нескольких магических слов. Вот только книг по C# (в отличие от паскаля) использующих этот подход я не видел.
Э нет, в случае сишарпа есть различие между value и reference типами, которое и опытному программисту может парочку неприятных сюрпризов подкинуть. В жаве, кстати, тоже, только там нет пользовательских value types.
Э нет, в случае сишарпа есть различие между value и reference типами, которое и опытному программисту может парочку неприятных сюрпризов подкинуть.если забыть и не вспоминать слово struct, то особых сюрпризов я так сразу и не вспомню.
книгу по лого присоветуйЛого рулит! Прямо воспоминания всколыхнулись
Посоветуй ему язык К, сразу перестанет донимать дурацкими вопросами.
Можно, конечно, объявить, что инты на самом деле immutable, операция + создаёт новый инт, ну и так далее. Как будто int a ссылается на один из этих immutable интов, которые где-то лежат. Но от этого, боюсь, крыша у чувака совсем съедет.
где-то в памяти есть данные: числа, строки, классы и т.д.
для того, чтобы с этими данными работать у нас есть именнованные ссылки - переменные.
простые типы(числа, строки и т.д.): после любых операций пересоздаются заново.
ps
про immultable строки все равно же придется объяснять...
immultable строкиКстати, а чем они лучше строк, представляемых массивом символов, каждый из которых можно изменить?
простые типы(числа, строки и т.д.): после любых операций пересоздаются заново.операция i++ в цикле для int-ов приемлема, а вот для строк нежелательна.
Кстати, а чем они лучше строк, представляемых массивом символов, каждый из которых можно изменить?логика проще.
операция i++ в цикле для int-ов приемлема, а вот для строк нежелательна.это точно - не первый этап обучения, и даже не второй.
Не знаю, насколько сейчас актуальная. В своё время мне очень понравилась.
это точно - не первый этап обучения, и даже не второй.т.е. на первом этапе вводить человека в заблуждение, а на следующих этапах бороться с этим заблуждением? мне такой подход не нравиться. Да же если до следующих этапов дело и не дойдет, все равно как-то нехорошо оставлять человека в заблуждении.
просто имхо, про оптимизацию программы надо говорить не на первом этапе, и даже не на втором.
вот скажи зачем товарищу из начального поста - оптимизация?
ему для начала надо хотя бы уметь составить и записать некий алгоритм,
на втором уметь - чтобы этот алгоритм читался (и им, и сторонним человеком
на третьем уметь - использовать стандартные шняги, а не плодить велосипеды,
и как минимум после этого может пойти речь про оптимизацию программы.
Какое именно заблуждение?заблуждение в том, что при i++ будет создан новый объект, под него будет выделена память.
простые типы(числа, строки и т.д.): после любых операций пересоздаются заново.я не пойму, что ты пытаешься сэкономить? У тебя все равно есть простые типы и составные. В реальности для "простых" типов используются два механизма value type и immultable. Ты же загоняешь все под immultable. Имхо, экономия не шибко большая, а запутывание основ это нехорошо. Мне это напоминает, как в школе пытаются изучать физику (механику) раньше, чем школьники проходят понятие производной на уроках математики. А на уроках математики изучают производную (зубрят правила взытия производных от элементарных функций и т.д.) без осознания понятия предела (понятия предела в учебнике, кажется, вынесено в факультативный раздел, который большинство не читает).
ps
про immultable строки все равно же придется объяснять...
заблуждение в том, что при i++ будет создан новый объект, под него будет выделена память.Ага, а в первом классе - заблуждение в том, что, если один объект летит в одну сторону со скоростью v1, а другой - в противоположную со скоростью v2, то скорость второго объекта относительно первого будет v1+v2.
И ч0?
В реальности для "простых" типов используются два механизма value type и immultableчто дает это твое мифическое знание реальности?
а если ничего не дает - то это знание лишнее. на первых этапах - уж точно.
i++создается новая копия числа с +1, ссылка на которое заносится в i,
старая копия числа возвращается как результат выражения.
заблуждение в том, что при i++ будет создан новый объект, под него будет выделена память.а разве память выделена не будет?
напомню, что эта операция возвращает еще старое число.
ps
то что память реально не выделяется - это уже фишка оптимизатора
а разве память выделена не будет?То есть, ++i на глупых компиляторах будет быстрее, чем i++?
напомню, что эта операция возвращает еще старое число.
Или глупые компиляторы даже при ++i создают новое число, а только потом удаляют старое?
что дает это твое мифическое знание реальности?
нет уж , это ты должен предоставить строгое доказательство, что твоя схема эквивалентна реальности, к тому же выписать все условия, при которых твое доказательство верно. А я что, я просто излагаю реальность, и отвечать на подобные вопросы мне нет необходимости.
1. простой тип (value type/immutable)
2. место в памяти
3. ссылка на эту память
4. переменная - именнованная ссылка
5. сложный тип - класс или массив: это набор ссылок
рассказывается так же хинт: что для того чтобы программа была простой, то лучше и со сложными типами, строить работу как с immutable (этому как раз тот же linq способствует)
То есть, ++i на глупых компиляторах будет быстрее, чем i++?это совсем уж на глупых компиляторах, на каких-нибудь "построчниках" - сейчас таких вроде нет.
это ты должен предоставить строгое доказательство, что твоя схема эквивалентна реальности,мы говорим про обучение или про что?
модель не должна быть полной, модель должна быть как можно простой (достаточно хорошей по показателю полнота/сложность)
модель не должна быть полной, модель должна быть как можно простой (достаточно хорошей по показателю полнота/сложность)эээ, ну это ты такой показатель для оценки выбрал . Сейчас у меня мнение, что модель наиболее оптимальная по этому показателю не всегда хороша. Не стоит экономить на запоминании еще одного пункта, когда речь идет об основах.
вон в каких-нибудь php/js/vb - вообще на эту тему не парятся и нормально пишут программы
что дает это твое мифическое знание реальности?То, что когда ты таки соберёшься объяснить человеку, как же так всё-таки получается, что структуры могут быть не immutable (а случится это раньше, чем ты думаешь, как только он увидит стандартные Point/Rectangle или Complex вся твоя аккуратно выстроенная картина мира, в которой int i = 5; создаёт в хипе иммьютабл объект 5 и присваивает в i на него ссылку (а это уже хитрый оптимизирующий компилятор ничего не создаёт, пользуясь тем, что тип ссылки у него тоже есть вот она вся пойдёт нафиг и чувак начнёт дико мучаться. И поминать тебя нехорошими словами. Ну, я бы расстроился, если бы со мной кто-нибудь такой фокус выкинул.
Всё-таки программирование - это не математика. В программировании важны конкретные механизмы, причём компиляторы в общем-то не должны слишком уж активно в эти механизмы вмешиваться. С математической точки зрения список неотличим от массива, с программистской — это разные структуры данных, реализованные при помощи разных механизмов. Само осознание этого отличия необходимо программисту.
Кстати, возвращаясь к топику: правильней всего начинать изучение программирования с Питона, вот! Он дико простой, намного проще шарпа, в нём вообще нет всей этой лишней инфраструктуры вокруг хелловорлда, объяснение которой приходится отложить на потом, в нём инты на самом деле лежат в хипе, при этом он вполне мощный, в смысле лёгкости выражения мыслей. И прозрачно лежит на своей сишной реализации, то есть после овладёвывания им можно изучить С и увидеть, как он таки работает.
структуры могут быть не immutable (а случится это раньше, чем ты думаешь, как только он увидит стандартные Point/Rectangle или Complexно работать с ними приходится все равно как immutable,
figure.Center.X = 5;//это все равно не работает
figure.Center = new Point(5, figure.Center.Y);//а как immutable работает
поэтому, имхо, проще объяснить - что mutable структуры - это такая выродская ошибка.
и про mutable структуры забыть как о страшном сне.
структуры могут быть не immutable (а случится это раньше, чем ты думаешь, как только он увидит стандартные Point/Rectangle или Complex вся твоя аккуратно выстроенная картина мирав скольки программах, ты использовал знание, что структуры (хотя бы Point, Rectangle - mutable)?
и приведи, пожалуйста, пример кода - который этот факт использует.
ps
имхо, в лучшем случае - это только что-то жутко оптимизационное.
А какие вообще могут быть причины использования структур кроме жутко оптимизационных?
Ни деструкторов, ни оверрайдабл присваивания у них нет, поэтому для RAII какого-нибудь их использовать нельзя (подозреваю, что это сделано специально!)
Везде, где хочется просто иммутабельности, можно использовать классы.
Использовать некую структуру как раз с понтом что юзер на своей стороне может её у нас взять, изменить одно поле (вместо вызова конструктора с кучей параметров) и записать обратно, так, что мы об этом обязательно узнаем... Нет, это тупо.
Ну и вот. В моём коде структуры используются только в оптимизационных целях, поэтому лежат в массивах вместо List<T>, отдаются в интернал доступ как поля, а не как проперти, и так далее. И, конечно, я экономлю на лишних присваиваниях и вовсю использую их мутабельность.
Кстати, на самом деле вся твоя стройная картина поломается ровно в тот момент, когда чувак попытается написать "int i = null" =)
Кстати, на самом деле вся твоя стройная картина поломается ровно в тот момент, когда чувак попытается написать "int i = null" =)так это тип такой (вводится для упрощения написания расчетов) - который проверяет, что ссылка не может быть null.
в какой-нибудь эйфеле это даже можно делать штатными средствами.
Кстати, на самом деле вся твоя стройная картина поломается ровно в тот момент, когда чувак попытается написать "int i = null" =)Может тогда так писать?
int? i = null;
так это тип такой (вводится для упрощения написания расчетов) - который проверяет, что ссылка не может быть null.ты не заметил, что ввел еще одно правило для запоминания? Т.е. количество правил для запоминаний уже сравнялось, то преимущество, ради которого ты это все затеял, уже исчезло, а ты продолжаешь скрывать реальность от чувака.
в какой-нибудь эйфеле это даже можно делать штатными средствами.имхо, не стоит гнаться за необъятным и изучать некий абстрактный язык, как смесь фичей из разных языков (пусть даже каждая из фич крута). Если выбрали C# значит изучаем основы сишарпа. У реального языка есть несомненное преимущество (перед смесью) — он существует, на нем можно писать.
А если закрывать глаза на подобные основы, то получается хреново. Вот у меня знакомый, хорошо соображает, имеет большой опыт в js, и уже около года прогает на C#, но иногда он сильно лажает, потому что смотрит на C# через призму js-а. А нет бы потратил недельку, две на изучение основ сишарпа.
Может ему какой-нибудь Флэш или Сильверлайт освоить?..
Сильверлайт освоить?..тк во втором сильверлайте прогать надо на сишарпе
Плюс еще с десяток языков.
Плюс еще с десяток языков.которые через пару лет перестанут поддерживать, как J#
Как минимум javascript будет жить долго.
Но как минимум это ему ближе как дизайнеру.
Так что может стоит книгу по Сильверлайту почитать?..
Оставить комментарий
6yrop
У нас в конторе есть дизайнер, классно рисует и в фотошопе, и илюстраторе. Он попросил меня назвать книгу, по которой он смог бы освоить азы C#-а. При этом человек никогда не программировал и не знаком ни с одним языком программирования. Я немного растерялся... Какую книгу ему можно посоветовать?