В свой первый день в Codesmith я был рад начать интенсивно учиться и познакомиться с людьми, с которыми я собирался провести следующие 13 недель за кодированием. Я был счастлив и счастлив узнать, насколько привержены обучению все в моей группе, как для себя, так и друг для друга. Здесь я хотел бы поделиться некоторыми из самых интересных вещей, которые я узнал за неделю 1.

Преимущества парного программирования
Я немного скептически отнесся к тому, что парное программирование появится в Codesmith. Как может быть, что работа на одной машине может быть продуктивнее, чем на двух? Но я обнаружил, что в этом есть реальная польза. Часто при программировании в одиночку вы можете столкнуться с блоком и долго бороться с ним. У вашего партнера по парному программированию могут быть разные идеи о том, что делать, когда вы сталкиваетесь с трудностями, или он может даже иметь опыт решения одной и той же проблемы. Это может сэкономить драгоценное время. PP также дает вам возможность практиковать различные социальные навыки, которые жизненно важны в программной инженерии: техническое общение, тесное сотрудничество с разными людьми, способность хорошо учиться и быть хорошим учителем.

Объектно-ориентированное программирование (ООП) в JavaScript
JavaScript не является готовым языком ООП; у него нет нативных классов и экземпляров (как, например, у Java). В JS есть только объекты.

Однако когда мы создаем объекты, все из которых имеют общую функциональность, мы не хотим хранить общую функциональность для каждого объекта. Например. если у нас есть куча студенческих объектов, каждый из которых может запускать функциональность enroll_in_course(course) и хранить enroll_in_course для каждого учащегося, мы храним множество копий одной и той же функции.

Вместо этого мы можем хранить функцию в отдельном объекте. Объекты ученика могут ссылаться на этот объект, сообщая интерпретатору, что нужно искать там функциональность. На самом деле каждый объект в JS по умолчанию имеет свойство __proto__, которое делает именно это. Когда JS-движок ищет функцию F в объекте O, он сначала ищет сам объект O. Если он не находит F, он ищет F на O.__proto__. Если F тоже нет, он смотрит на O.__proto__.__proto__. Он продолжает искать F таким образом, пока либо не найдет F, либо свойство __proto__ не будет оценено как null. Эта цепочка __proto__ и называется цепочкой прототипов. В примере со студентом мы создадим enroll_in_course для Student.prototype, на который будет ссылаться свойство __proto__ каждого студента. Начиная с ES6, в JS теперь есть ключевое слово class, но внутри он по-прежнему использует прототипы.

Алгоритмы
Учебная программа Codesmith для первой недели затрагивает множество различных структур данных и алгоритмов, которые важно иметь в своем наборе инструментов для разработчиков программного обеспечения. Среди затронутых тем — массивы, стеки, очереди, связанные списки, деревья, хеш-таблицы, алгоритмы сортировки и даже динамическое программирование. Также вводится анализ Big O, с акцентом не только на знание временной и пространственной сложности различных алгоритмов, но и на то, как получить временную и пространственную сложность любого алгоритма. Это происходит из-за общего подхода Codesmith, который заставляет вас находить ответы самостоятельно, а не получать их с ложечки.

Нам пришлось написать функции пузырьковой сортировки и сортировки слиянием, и я подумал о том, чтобы доказать себе, почему каждая из них имеет такую ​​сложность во времени и пространстве, как они. Пузырьковая сортировка проходит через массив, меняя местами соседние элементы, если они не по порядку, пока не достигнет конца массива. Это повторяется до тех пор, пока массив не будет отсортирован. В худшем случае он должен выполнить (n — 1) + (n — 2) + … + 1 = n(n -1)/2 свопов, поэтому его TC равен O(n²). Он не использует дополнительное пространство, поэтому его SC равен O(1). Сортировка слиянием делит массив на левую и правую половины, рекурсивно запускает сортировку слиянием для каждой половины, а затем объединяет две отсортированные половины в один отсортированный массив. Нужно разделить массив ~log(n) раз, а объединение двух отсортированных массивов длины n/2 занимает O(n) времени. Следовательно, его TC равен O(nlogn). Его SC равен O(n) (по крайней мере, в этой наивной реализации), потому что нам нужен новый массив для слияния двух отсортированных половин.