I am happy to announce that I and my team of experienced speakers will teach the “High Quality Code Construction” course again starting in February. The course will be held in Sofia University at the Faculty of Mathematics and Informatics and in parallel in the Telerik Academy (for students from TU-Sofia, NBU and UNIBIT). Students from all universities and even school students are invited to attend this course. The course is free and is open, without any obligations for the attendees.
The course “High-Quality Programming Code” provides fundamental principles and practices for building high-quality software with focus on the source code, unit testing and refactoring. The course is held as elective training in few Bulgarian universities and targets the students from the computer science related specialties.
Course Annotation
The „High-quality programming code” course objective is to introduce the students to the principles of high-quality programming code construction during the software development process. The quality of the code is discussed in its most important characteristics – correctness, readability and maintainability. The principles of construction of high-quality class hierarchies, classes and methods are explained. Two fundamental concepts – “loose coupling” and “strong cohesion” are defined and their effect on the construction of classes and subroutines is discussed. Some advices for correctly dealing with the variables and data are given, as well as directions for correct naming of the variables and the rest elements of the program. Best practices for organization of the logical programming constructs are explained. Some methodologies for testing, debugging and code optimization are introduced. Special attention is given also to the “refactoring” as a technique for improving the quality of the existing code, unit testing and test-driven development. The principles of good formatting of the code are defined and explained. The concept of “self-documenting code” as a programming style is introduced. The techniques and practices for constructing high-quality programming code discussed in the course are independent of the programming languages. To graduate the course students are assigned two practical projects and a test examination. The practical projects consist of refactoring existing low-quality code, making the code testable, adding unit tests and measuring the code coverage to ensure the code is well tested.
Certification and Awards
Best students will get certification signed by the trainers team and will be awarded by our sponsor – Telerik Corp.
Curriculum
Course Overview. Introduction to High-Quality Programming Code. Entrance Project
Fundamentals of Software Engineering
Naming Identifiers in the Source Code. Naming Classes, Methods, Variables, Parameters and Other Elements of the Code
Designing High-Quality Classes and Class Hierarchies. Best Practices in the Object-Oriented Design
High-Quality Methods. Strong Cohesion and Loose Coupling
Using Variables, Data, Expressions and Constants Correctly
Using Control Structures, Conditional Statements and Loops Correctly
Correctly Formatting the Code. Code Documentation, Comments and Self-Documenting Code. Code Conventions
Defensive Programming. Using Exceptions Correctly. Performance Tuning and Code Optimization
Code Integration. Refactoring Existing Code to Improve Its Quality
Software Quality Assurance. Testing and Debugging. Unit Testing. Test-Driven Development
Development Tools. Development Environments. Change Management Systems. Code Analysis Tools. Automated Testing Tools. Automated Build Tools. Continuous Integration Tools
Test Covering the All Studied Topics
Course Projects: Assignment, Guidelines and Discussion
The course will be held in parallel for students in the following universities:
Faculty of Mathematics and Informatics (FMI), Sofia University “St. Kliment Ohridski” (SU)
Technical University – Sofia
New Bulgarian University (NBU)
University of Library Studies and Information Technologies (UNIBIT)
Timetable
The course will be held:
Every Tuesday, 18:00-21:00 h, starting from 22.02.2011 at FMI, lab 101 (Sofia, James Baucher 5 -http://goo.gl/maps/MnXR)
Every Wednesday, 18:00 – 21:00 h, starting from 16.02.2011 at Telerik Academy’s training lab (Sofia, Mladost-1, bul. Alexander Malinov 33, ground floor – http://goo.gl/maps/mCZE)
Last Saturday I was speaker in the VUZF university as part of the lectures of the Java EE open course that we teach each Saturday. I presented few lectures about JDBC, XML and XML parsers. Students came from Sofia University, TU-Sofia, NBU and even school students and professionals from the industry came to learn and practice how to access databases with JDBC and how to parse and build XML documents with Java and the JAXP parser.
During this long training day we had several lecture sessions and several exercises sessions. Students were well motivated to learn Java EE but most of them were beginners so I needed to put lost of energy and passion during the practical sessions of exercises.
I hope this course will be really helpful to all people who want to learn Java and Java EE and use these technologies as basis for their career development.
През последните две седмици записахме две много полезни демонстрационни лекции, свързани с практическата разработка на динамични уеб приложения със C#, .NET Framework, ASP.NET, SQL Server, ADO.NET Entity Framework, HTML и CSS. Лекциите са част от курса “Разработка на уеб приложения с ASP.NET”, който се провежда през изминалия семестър паралелно във ФМИ на Софийски университет и в Технически университет – София.
В последните две лекции от курса беше демонстрирана разработката на проста блог система, в която автентикирани потребители могат да публикуват статии, а всички посетители могат да разглеждат статиите и да добавят коментари към тях. Приложението се създава от нулата, стъпка по стъпка и включва разработка на прототип на потребителски интерфейс, дизайн на база данни, изграждане на Entity Framework модел на данните, работа с master pages, HTML и CSS, работа с контроли за визуализиране на данни и свързване на данни (data binding) и много други тънкости, с които се сблъскваме при разработката на уеб приложения с ASP.NET.
В периода 17-19 януари 2011 г. в Националния център за подготовка на ученици за олимпиади се проведе поредната тридневна сбирка на Академията на Телерик за ученици, в която безплатно се обучават на разработка на софтуер и съвременни софтуерни технологии ученици от цялата страна. Темата този път беше “Бази данни, SQL и технологии за достъп до данни в .NET”. Бяха разгледани в детайли следните важни за програмирането концепции и технологии от света на релационните бази от данни:
По традиция обучението започна със солидна подготовка за ИТ теста, който учениците предстои да положат на финалния кръг на Националната ИТ олимпиада.
След това бяха обяснени концепциите на релационните бази от данни: релационен модел, таблици, релации, множественост на връзките, изгледи, съхранени процедури, индекси, тригери, ограничения и други обекти в базата данни.
Специално внимание беше отделено на моделирането на данни чрез Entity Relationship диграми (E/R диаграми), което беше демонстрирано чрез инструментите на SQL Server 2008.
Обучението продължи чрез задълбочено запознаване с езика SQL. Бяха разгледани командите за извличане на данни (SELECT), съединения на таблици (JOIN) и по-сложни конструкции.
Беше обърнато внимание и на груповите функции, групирането, вложените SELECT команди и вградените SQL функции. Бяха разгледани и DDL командите за промяна на релационната схема.
След концепциите на базите данни, моделирането на данни и работата със SQL и SQL Server преминахме към технологиите за достъп до данни в .NET Framwork. Демонстрирахме стандартния интерфейс към базите данни ADO.NEТ, неговата архитектура и моделите на достъп до данни. Бяха дадени примери за достъп до SQL Server и MS Access.
Кулминацията на обучението беше задълбоченото изучаване на концепциите на ORM технологиите и практическата работа с ADO.NET Entity Framework (EF). Технологията беше разгледана в дълбочина. Дискутирахме по-сложни концепции като проблемът “N+1 заявки” и контрол на конкурентния достъп.
Обучението завърши с практически проект за обработка на данни, който изискваше работа с MySQL, импортиране на данни от MS Excel, обработка и експорт към PDF.
За всички почитатели на програмирането и базите данни сме подготвили видеозаписи на цялото обучение, заедно с всички лекции, примери, демонстрации и практически проекти. Можете да ги гледате от страницата на инициативата: http://www.telerik.com/academy/schoolacademy/videos.aspx.
Следва съкратено съдържание на обхванатия в книгата учебен материал:
Глава 1. Въведение в Алгоритмите
Основни математически понятия
Намиране броя на цифрите на произведение
Прости числа, мерсенови и съвършени числа
Биномни коефициенти, триъгълник на Паскал. Факторизация
Бройни системи и преобразуване, римски цифри
Рекурсия и итерация: факториел, редица на Фибоначи
Най-голям общ делител, алгоритъм на Евклид, най-малко общо кратно
Връщане от рекурсията и използване на променливите
Основни комбинаторни алгоритми: пермутации, вариации, комбинации
Разбиване на числа
Разбиване на множества
Оценка и сложност на алгоритми
Асимптотична нотация: O(n), W(n), Ɵ(n)
Определяне на сложност на алгоритъм
Глава 2. Въведение в структурите от данни
Списък, стек, опашка
Последователна (статична) реализация
Свързана (динамична) реализация
Двоични дървета
Балансирани дървета
Ротация
Червено-черни дървета
B-дървета
Хеш-таблици
Класически хеш-функции
Справяне с колизии
Затворено хеширане
Отворено хеширане
Реализации на хеш-таблица
Глава 3. Сортиране
Сортиране чрез сравнение
Дърво на сравненията
Сортиране чрез вмъкване
Сортиране чрез вмъкване с намаляваща стъпка. Алгоритъм на Шел
Метод на мехурчето
Сортиране чрез клатене
Бързо сортиране на Хоор (Quicksort)
Метод на “зайците и костенурките”
Сортиране чрез пряк избор
Пирамидално сортиране на Уилямс
Минимална времева сложност на сортирането чрез сравнение
Сортиране чрез трансформация
Сортиране чрез множество
Сортиране чрез броене
Побитово сортиране
Метод на бройните системи
Сортиране чрез пермутация
Паралелно сортиране
Глава 4. Търсене
Последователно търсене
Последователно търсене в сортиран списък
Последователно търсене с преподреждане
Търсене със стъпка. Квадратично търсене
Двоично търсене
Фибоначиево търсене
Интерполационно търсене
Глава 5. Теория на графите
Графи – основни понятия
Представяне и прости операции с граф: списък на ребрата, матрица на съседство, матрица на теглата, списък на наследниците (списък на инцидентност), матрица на инцидентност между върхове и ребра
Компоненти на свързаност
Построяване и прости операции с графи
Обхождане на граф: обхождане в ширина, обхождане в дълбочина
Оптимални пътища, цикли и потоци в граф
Директни приложения на алгоритмите за обхождане
Екстремален път в граф
Цикли
Хамилтонови цикли. Задача за търговския пътник
Ойлерови цикли
Потоци
Транзитивност и построяване. Топологично сортиране
Транзитивно затваряне. Алгоритъм на Уоршал
Транзитивно ориентиране
Транзитивна редукция
Топологично сортиране
Пълно топологично сортиране
Допълване на ацикличен граф до слабо свързан
Построяване на граф по дадени степени на върховете
Достижимост и свързаност
Компоненти на свързаност
Компоненти на силна свързаност в ориентиран граф
Разделящи точки в неориентиран граф. Двусвързаност
k-свързаност на неориентиран граф
Оптимални подмножества и центрове
Минимално покриващо дърво
Независими множества
Доминиращи множества
База на гарф
Център, радиус и диаметър
Двойкосъчетание. Максимално двойкосъчетание
Оцветявания и планарност
Оцветяване на граф. Хроматично число
Планарност на графи
Глава 6. Търсене с връщане. NP-пълни задачи
Класификация на задачите: сложност по време, сложност по памет, нерешими задачи, NP-пълни задачи
Търсене с връщане
Удовлетворимост на булева функция
Оцветяване на граф
Най-дълъг прост път в цикличен граф
Разходка на коня
Задача за осемте царици
Разписание на училищна програма
Побуквено превеждане
Метод на разклоненията и границите
Задача за раницата (оптимална селекция)
Оптимални стратегии при игри
Игра “X”-чета и “O”
Принцип на минимума и максимума, алфа-бета отсичане, алфа-бета изследване до определена дълбочина
Глава 7. Разделяй и владей
Намиране на k-ия по големина елемент
Мажорант
Сливане на сортирани масиви
Сортиране чрез сливане
Бързо повдигане в степен
Алгоритъм на Щрасен за бързо умножение на матрици
Бързо умножение на дълги числа
Задача за Ханойските кули
Организиране на първенства
Циклично изместване на елементите на масив
Покриване с шаблон
Глава 8. Динамично оптимиране
Динамично оптимиране – въведение
Класически оптимизационни задачи
Задача за раницата
Братска подялба
Умножение на матрици
Триангулация на многоъгълник. Числа на Каталан
Оптимално двоично дърво за претърсване
Най-дълга обща подредица
Най-дълга ненамаляваща подредица
Сравнение на символни низове
Задача за разделянето
Неоптимизационни задачи
Числа на Фибоначи
Биномни коефициенти
Спортни срещи
Представяне на сума с неограничен брой монети
Представяне на сума с ограничен брой монети
Разбиване на естествено число
Числа без две съседни нули
Разпознаване на контекстно свободен език
Хедонийски език
Символно умножение
Други интересни оптимизационни задачи
Такси компания
Билети за влак
Числов триъгълник
Представяне на сума с минимален брой монети
Опроводяване на платка
На опашка за билети
Разпределение на ресурси
Семинарна зала
Крайпътни дървета
Разрязване на материали
Зациклен израз
Домино-редица
Трионообразна редица
Глава 9. Евристични и вероятностни алгоритми
Алчни алгоритми
Египетски дроби
Максимално съчетание на дейности
Минимално оцветяване на граф и дърво
Алгоритми на Прим и Крускал
Дробна задача за раницата
Задача за магнитната лента
Процесорно разписание
Разходката на коня. Хиперкуб. Код на Грей
Търсене с налучкване
Алгоритми Монте Карло и Лас Вегас
Числени алгоритми с приближение
Генетични алгоритми
Достигане на фиксирано приближение
Върхово покритие на граф
Глава 10. Компресиране
Кодиране
Обща класификация
Кодиране на последователности
Премахване на нулите
Компресиране с битови карти
Полубайтово пакетиране
Съвместно използване на битови карти и полубайтово пакетиране
Двуатомно кодиране
Замяна на шаблони
Относително кодиране
Математическо очакване. Кодиране с линейно предсказване
Кодиране на последователности
Един представителен пример: PackBits
Статистически методи
Алгоритъм на Шенън-Фано
Алгоритъм на Хъфман
Обобщен алгоритъм на Хъфман
Kод с разделители
Аритметично кодиране
Адаптивно компресиране
Адаптивно компресиране по Хъфман
Модели на Марков
Един представителен пример: MNP-5
Речниково кодиране
Ентропия
Стандарти и патенти
Статични срещу адаптивни методи
LZ77. Компресиране с плъзгащ се прозорец
LZSS. Едно подобрение
FLZ. Друг вариант на LZ77
LZW. Модификацията на Уелч
GIF. Гледната точка на CompuServe
Оптимални срещу алчни алгоритми
Компресиране в реално време
LZW срещу Марков
Компресиране със загуба
Изрязване и квантифициране
JPEG
Компресиране на видеоизображение. MPEG
Уейвлети
Компресиране с фрактали
За момента книгата няма безплатен вариант за свободно изтегляне. Може да се намери на книжния пазар.
На 12 и 13 януари 2011 г. се проведе първият (междинен) изпит върху учебния материал от първата част на курса “C# Fundamentals” от програмата за безплатно обучение и работа “Академия на Телерик“. Курсистите трябваше да напишат решения на 4 нелеки задачи за 6 часа, обхващащи учебния материал от първата част от курса:
0. Course Introduction
1. Introduction to Programming
2. Primitive Data Types and Variables
3. Operators, Expressions and Statements
4. Console Input / Output
5. Conditional Statements
6. Loops
7. Arrays
8. Numeral Systems
9. Methods
Sample Intermediate Exams
Макар и учебният материал да изглежда лесен, задачите бяха много над средното ниво по съответните учебни предмети в училищата и университетите. Условията на задачите ще бъдат публикувани на сайта на Академията, но по-нетърпеливите могат да ги изтеглят и от настоящия блог:
От явилите се над 100 души изпита преминаха успешно 66 курсиста, които ще продължат обучението си във втората част на курса “C# Fundamentals” (3 групи по 22 души). Предстоят по-сложните теми от курса, които фокусират върху структури от данни, алгоритми, решаване на сложни алгоритмични задачи и писане на качествен програмен код:
10. Recursion
11. Creating and Using Objects
12. Exceptions Handling
13. Strings and Text Processing
14. Defining Classes
15. Text Files
16. Linear Data Structures
17. Trees and Graphs
18. Dictionaries, Hash Tables and Sets
19. Algorithms Complexity and Efficiency of Data Structures
20. Object-Oriented Programming Fundamental Principles
21. High-Quality Programming Code
22. Methodology of Problems Solving
23. Problems Solving Practice #1
24. Problems Solving Practice #2
25. Problems Solving Practice #3
Успех на всички участници в инициативата “Академия на Телерик”!
ADO.NET Entity Framework (EF) is powerful object-relational persistence framework. It has great capabilities for querying the database with LINQ but sometimes a custom native SQL could be more efficient way to execute a certain native SQL command or query directly at database level.
To execute native SQL query in EF you could use the following method of the ObjectContext:
Native SQL could return nothing, a single value, a multiple data rows. You could map the returned data rows into classes. To achieve this you should define properties with the same name and corresponding type like the returned data rows from the native SQL query. Moreover, you could execute parameterized queries by passing the SQL command and its parameters to the ExecuteStoreQuery<T> method.
Developers rarely read text when a good example is available so I have prepared a fully functional example on the Northwind database in SQL Server which illustrates how to use native SQL queries in ADO.NET Entity Framework:
class ExecutingSQLQueriesExample
{
static void Main()
{
int customersCount = SelectCustomersCount();
Console.WriteLine("Customers count: {0}", customersCount);
Console.WriteLine("\nList of products:");
var products = SelectTop5ProductsIdAndName();
foreach (var product in products)
{
Console.WriteLine("{0}. {1}", product.ID, product.Name);
}
Console.WriteLine("\nList of employees from London:");
var employees = SelectEmployeeNamesByCountryAndCity("UK", "London");
foreach (var emp in employees)
{
Console.WriteLine(emp);
}
}
static int SelectCustomersCount()
{
NorthwindEntities northwindEntities = new NorthwindEntities();
string nativeSQLQuery = "SELECT count(*) FROM dbo.Customers";
var queryResult = northwindEntities.ExecuteStoreQuery<int>(nativeSQLQuery);
int customersCount = queryResult.FirstOrDefault();
return customersCount;
}
static IEnumerable<ProductIdAndName> SelectTop5ProductsIdAndName()
{
NorthwindEntities northwindEntities = new NorthwindEntities();
string nativeSQLQuery =
"SELECT TOP 5 ProductID as ID, ProductName as Name " +
"FROM dbo.Products " +
"ORDER BY ProductID";
ObjectResult<ProductIdAndName> products =
northwindEntities.ExecuteStoreQuery<ProductIdAndName>(nativeSQLQuery);
return products;
}
private static IEnumerable<string> SelectEmployeeNamesByCountryAndCity(
string country, string city)
{
NorthwindEntities northwindEntities = new NorthwindEntities();
string nativeSQLQuery =
"SELECT FirstName + ' ' + LastName " +
"FROM dbo.Employees " +
"WHERE Country = {0} AND City = {1}";
object[] parameters = { country, city };
var employees = northwindEntities.ExecuteStoreQuery<string>(
nativeSQLQuery, parameters);
return employees;
}
class ProductIdAndName
{
public int ID { get; set; }
public string Name { get; set; }
}
}