Стас Выщепан @gandjustas
Умею оптимизировать программы
Information
- Rating
- 300-th
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity
Specialization
Software Architect, Delivery Manager
Lead
C#
.NET Core
Entity Framework
ASP.Net
Database
High-loaded systems
Designing application architecture
Git
PostgreSQL
Docker
Прочитайте SICP, там в первых трех-четырех разделах проходится материал, эквивалентный году обучения в российском вузе. И там вообще нет типизации. Она неявно присутствует, но нигде не объясняется.
Потому уже, при создании интерпретатора вводятся метки типов и vtbl.
Этого достаточно.
Подход со статической типизацией требует изучения системы типов, а это чуть ли не самое сложное в современных языках. Только некоторые ФЯ умудряются прятать сложность системы типов для потребителя, остальные, вроде java и C#, и тем более C++, вываливают эту сложность в самом начале.
Целью начального обучения не является изучение системы типов конкретного яызка. Поэтому динамические языки подходят гораздо лучше статически типизированных.
Ты все еще забываешь, что суть начального обучения не в том чтобы впихнуть как можно больше концепций в голову студента, и не в том чтобы научить его писать взрослые программы.
Важно дать понимание комбинированию, базовым структурам данных, алгоритмам, при этом как можно меньше загружать мозг лишними деталями.
И вот две «куда-то» потерялись. То есть остальные 8 их не видят. Часть приложения видит две ноды, часть видит 8.
Внимание вопрос — продавать билеты? Вариант поставить в очередь не катит, ибо человеку билет нужно напечтать. Откатить естественно тоже нельзя.
Если да, то где гарантия что не продадут два билета? Если нет, то на кой нам 10 шард и MongoDB вообще? Что делать если две ноды потерялись надолго (умерли машины)?
По поводу кешей — все гораздо проще. Ибо если не валить все кеши в кучу, то очень легко разобраться когда и какой кеш нужен и как его инвалидировать.
Я уже писал что кеш нельзя просто включить, нужно думать головой. Кстати стратегия «сбросить кешь по ключу\тегу» при записи работает для среднего приложения всегда. Теги при этом управляются вызывающим кодом и не требуют обработки данных в кеше.
У него много недостатков из-за типизации и модульности, но к обучению программированию это отношения не имеет.
Важный аспект — не должно быть классов и, тем более, виртуальных функций.
ЗЫ. Установка даже одного компонента для обучения — дофига, это сразу у 30% студентов отобьёт желание что-то делать. Кстати я как-то пробовал поставить Netbeans когда учился в универе — не взлетел.
РСУБД на одной машине является CA, а на P насрать, его не бывает. В failover режиме БД становится почти CAP, но A и P нестрогие, то есть при некоторых условиях база становится недоступна. В зависимости от вероятности наступления таких условий и можно гарантировать заданный процент доступности при ACID гарантиях.
Но обычно это дорого, вернее ДОРОГО.
NoSQL предлагают дешевый способ организовать AP, теряя consistency (даже в случае acid гарантий записи).
Тут нужно понимать что C,A и P это не просто атрибут, который есть или нет. Нужно понимать в каких условиях достигаются эти параметры, а в каких нет.
НО. Consistency от этого падает, в некоторых случаях до нуля. Например система по продаже билетов при разделении нод базы потенциально может продать два билета на одно и то же место. Никакая логика приложения не поможет избежать такого случая.
Я изучал разные NoSQL, некоторые приблизились по надежности к SQL, не потеряв удобства. Увы MongoDB не один из них, хотя де-факто это стандарт в мире NoSQL, на который равняются.
Что касается кешей и их инвалидации, то это называется тегами, в некоторых системах поддерживается явно, если не поддерживается явно, то можно прикрутить. Наличие тегов как раз позволяет не лезть внутрь закешированных данных.
1) хранить все джоины
2) вычислять джоины ркуками.
Джоинов в программе пропорционально количеству связей. А количество связей пропорционально квадрату количества сущностей.
Это повышает сложность разработки оооооооооооочень сильно. Прикрутить шардинг к любой SQL базе окажется гораздо легче. Это будет локальное одноразовое изменение.
Кстати апдейт схемы проблема для MySQL, и вовсе не проблема для MSSQL, пока нету миллиардов записей.
Кеширование денормализованных данных и хранение денормализованных данных — две большие разницы. Денормализованные данные — фактически blob, как только вам становится важно что внутри — начинаются проблемы. Кеш обычно данные как есть отдает другому слою, не вникая. Разбираться в структуре кеша при записи не нужно, его можно просто пересобрать из storage.
Классический пример для NoSQL — БД фильмов, которая хранит фильмы, ревью, комменты к ревью. Каждый фильм это документ, которых хранит все связанные данные. Вот проблемы начнутся тогда, когда надо будет показать все комменты одного автора. А эта задача может появится сильно после того как будет выбрана структура данных.
И это простой кейс, могут быть гораздо сложнее, которые и индексами не покроешь.
А если разнести по разным документам, то получает отсутствие джоинов и транзакций, и все проблемы с этим связанные.
Можно хранить несколько документов, один все по фильму содержит, второй все по автору. Но тогда запись будет происходить в N (>> 2 в реальной системе) документов, что медленно и нетразнакционно. А обрабатывать изменения связей становится очень геморройно.
2) посмотри как работает jsfiddle
3) надо учить сразу инициализировать при объявлении, все остальное запретить, кстати JSHint показывает такие места, ну и 'use strict' обязательно. Не забывайте что при обучении код пишется в первую очередь для преподавателя, а потом для компьютера. Естественно преподаватель должен все проблемные места указать и потребовать исправить. В этом и суть обучения — тренировка писать правильный код на уровне моторных навыков.
4) Java, C# и C++ не подходят по причине необходимости установки тонны софта, необходимости знать и понимать систему типов и public-sttaic-void-main-overhead. В качестве языка для продолжения обучения (2 семестр или максимум 2-й год) C# и Java подойдут очень хорошо.
А в начальном обучении надо как можно меньше загружать мозг такими вещами.