Преподавател
Кирил Митов
Общото описание на курса е налично на http://lubo.elsys-bg.org/software_engineering/
На тази страница е дадено спесифичното 2012-2013 учебна година.
Въведение
През учебната 2012/2013 се въвеждат промени в предмета, за които можете да прочетете в частта Методология „ръкопашен бой“, Колани, Оценяване.
Предметът „Технология на програмирането“ се изучава в 11 клас от ученици на ТУЕС. Има за цел да въведе учениците в технологиите, процесите и средствата за разработка на софтуер. Разглеждат се итеративни процеси, използвани в индустрията, като се отделя внимание на събирането и обсъждането на изискавнията, оргинизирането на екипа, избор на технологични решения, разработка на unit (JUnit, CUnit и др.) тестове, използване на системи за управление на версиите (Mercurial, CVS, SVN), поддържане качеството на кода, „refactoring“, „debugging“, Test Driven Development, средства за автоматизиране (make, ant, maven) и др.
Разглеждат се Java и Eclipse, разработката на десктоп приложения (SWT, JFace), работа с бази данни (JDBC), разработката на Eclipse Plug-ins, разработка на web приложения (GWT).
Обръща се внимание на други програмни езици като Python и Ruby.
Предметът завършва с представяне на разработено приложение по проект на учениците, в който могат да използват програмен език, среда и технологии по свой избор.
Материалът се базира на добрите практики от Основи на Java и Eclipse, изучаван в ТУЕС през 2007, 2008, 2009 като свободно избираем предмет. Систематизиран и подобрен е през учебната 2009/2010 като част от задължителния предметТехнология на програмирането. През учебната 2010/2011 беше въведено допълнитено представяне на процеса на разработка на софтуер. През учебната2011/2012 част от материала за втория срок беше преместен в първия срок и следователно целият материал беше значително обогатен.
Методология – „ръкопашен бой“
По вдъхновение от „36 стаи на Шаолин“, оставил голям белег в моето детство. По вдъхновение на подходите, използвани от треньори, с които съм работил.
В процеса на работа с ученици през последните години срещнах редица проблеми. Голяма част от учениците са много добри и се справят много бързо, но
- част от учениците имат нужда от значителна помощ с разработката на приложения
- част от учениците се справят, но трудно. Обичат обаче да се занимават с други теми като анимация, графика и музика.
- част от учениците не се справят с материала и остават на поправки
В последните години с различни успехи въвеждам нови подходи за работа. За учебната 2012/2013 въвеждам нов начин на работа с ученици, подобен на развитието в бойните изкуства.
Учениците участват в предмета, както биха тренирали бойни изкуства. Всеки ученик получава бял колан/гривна в началото. Всеки ученик е задължен да идва с гривната в часа. Майсторът показва различни техники в залата, като може да раздели работата на по-напредналите ученици от другите и въпреки това всички да тренират в една зала. По време на годината има определен брой изпити. Учениците могат да се явяват на изпити за колан. Ако ги вземат получават следващия колан. По-напреднали ученици могат да помагат на затрудняващи се като им показват определени техники и така помагат на майстора. Учениците могат да се подготвят и явяват на състезания. Майсторът може да реализира часове, в които не се предават нови знания, а се правят изцяло специализирани тренировки, в които да се подобрят уменията в позната област – например силови тренировки или специализирани тренировки върху оръжия, защити, хвърляния и др.
Всички ученици са напълно свободни и задължени да се подготвят извън залата, като тренират други бойни изкуства, тичат всяка сутрин и вечер, ходят на фитнес. Тук в случая на програмистите се разбират участия в проекти с отворен код, четене на книги и писане на много програми, работа във фирми. Съществуват моменти като бой на улицата или в дискотека, за които могат да се реализират специални часове за подготовка на учениците – аналогията в софтуера е моментът, в който вредители се опитват да съборят сайта или интернет приложението. В процеса на обучение ще имаме и такива часове.
Затова домашните работи са изключително задължителни.
Колани – 7 броя
Коланите са 7. Да не забравяме, че учениците започват с немалко знания от предишните години и в повечето случаи са подготвени върху много теми.
За да притежават определен колан, трябва да притежават определените знания. Тъй като за първа година разделям програмата по този начин е възможно в процеса да се въведат промени в програмата:
- бял – всички са бял колан независимо от знанията им
- жълт – познания върху синтаксиса на поне два езика за програмиране. Възможност за реализиране на всички задачи (и подобни) от документаВходно Ниво в рамките на минути. Познания върху системи за управление на съдържанието (wordpress, wiki), системи за управление на кода (GIT, Mercurial, SVN). Работа със текстови файлове и реализиране на задачи за обрабокта на сложни csv документи със скриптов език за програмиране (Ruby, Python, Perl). Скриптовите езици няма да се преподават детайлно и се оставя на учениците да се запознаят с тях.
- зелен – познания върху трети език за програмиране (вероятно Java). Безпроблемно реализиране на приложения, използващи допълнителни библиотеки. Използване на среда за разработка на приложения (Eclipse, Netbeans, Visual Studio, xCode и др.). Реализиране на конзолни и десктоп приложения с използването на допълнителни библиотеки, където се наложи. Използване на библиотеки от ранга на Колекции в Java, STL в C++ и др. Използване на обектно ориентиран подход при решение на задачите.
- син – защита на името на ТУЕС в състезанието Google Code In. Използване на JUnit, RSpec, CUnit и гъвкав подход за разработка на приложения. Теоретични познания върху език за програмиране и отговор на тестови въпроси (Sun Certified Java Programmer)
- червен – Познания за реализиране на приложения от сложността на прост графичен редактор, web crawler или просто 2d игра.
- кафяв – правилно разработен проект в продължение на 3 месеца по предварително зададени и обсъдени теми. Изискванията към проекта ще се дадат през втория срок. Ученици с по-нисък колан също са задължени да разработят проект, но са трябва да преминат и през предишните си колани, за да получат правилната оценка.
- черен – реализиране на продължителна разработка на софтуер, в която се използва автоматизирана система за „build“-ване на код (a.k.a. Jenkins). Реализиране на покритие на кода от над 50%. Автоматизирани тестове, които се чупят при промяна на кода. Код, който да отговаря на Добри практики при писане на код. Черен колан се получава само от ученици, споделили знанията си с останалата част от света. Редовен блог. Популяризиране на знанията. Статии за ученическия вестник. Участие и организиране на състезания по програмиране, мрежи, роботика. Реализиране на курс пред по-малки ученици или ученици от други училища. Реализиране на демонстрации пред други училища. За да получите черен колан, трябва да сте върнали поне малко от това, което сте получили от мен и целия преподавателски колектив на ТУЕС и да покажете, че знаете как да го направите.
Оценяване
С въвеждането на „ръкопашен бой“ методологията се променя и начина на оценяване на учениците.
Изпитите се провеждат както следва. По време на изпита може да се явят участващи за различни колани. Но при явяване на изпит трябва да имате всички реализирани домашни за съответния изпит.
Първи срок
- първи изпит – седмица 5
- втори изпит – седмица 10
- трети изпит – седмица 15
- за шестица – син колан
- за петица – зелен колан
- за четворка – жълт колан
- за тройка – жълт колан
- за двойка – бял колан
Втори срок
– графикът ще бъде показан в началото на втория срок, както и начина за оценяване.
Едно е сигурно, за шестица учениците трябва да имат черен колан.
Целта на всички тези нововъдения е да постигат повече и цялото преживяване да е още по-забавно.
Материали за 2012/2013 година:
Матералите за учебния план се намират в https://drive.google.com/?authuser=0#folders/0B2u3mIflzKI4Y0MtT1RkMFlaRnc
Глава първа – въведение, CSV файлове, git, mercurial
- Занятие 2. Системи за управление на кода
- Домашно1 от последното занятие – Предадени хранилища на кода
- Домашно2 от последното занятие – Предадени задачи, за събиране на числата в шестата колона на csv файл
- Лекция Version Control System
- Занятие 3. Обработка на CSV документ със скриптов език
- Домашно от последното занятие – Предадени задачи за събиране на числата в дадена колоно спрямо стойностите на друга колона
- Занятие 4. Работа с хранилищата от училищните машини.
- Занятие 5. Въведение в Java
- Домашно от последното занятие – Предадени домашни за организиране на хранилището
- Лекция – Въведение в Java (01java.pdf)
- Лекция – Обекти в Java (02java.pdf)
- Домашна работа – Въведение в Java (introduction_homework.pdf)
- Занятие 6. Самолетна подредба
- Домашно от последното занятие. Краен срок 10-ти октомври 20:00 – Форма за предаване на домашни за Въведение в Java и обработката на аргументи от командния ред.
- Занятие 7. Най-популярен човек в клас
- Домашно от последното занятие. Краен срок 15-ти октомври 20:00. – Форма за предаване на домашни за Автоматична подредба на местата в самолет реализиране на Java и на Ruby
- Занятие 8. Изпит за колан
- Форма за предаване на домашното от Занятие 7. Краен срок 17-ти октомври, 20:00 – Форма за предаване
Обобщение на резултатите от Глава Първа
Глава втора – ООП Разработка с Eclipse, Java, Ruby
- Занятие 9. Обзор на грешките от предишните изпити
- Форма за предаване на домашното от Занятие 8. Краен срок 22-ри октомври, 20:00 – Форма за предаване
- Занятие 10. Втори изпит за колан
- Форма за предаване на домашното от Занятие 9. Краен срок 29-ти октомври, 20:00 – Форма за предаване
- Форма за предаване на задачите от изпита
- Занятие 11. Въведение в разработката на Java приложения с Eclipse
- Лекция – Обекти в Java (02java.pdf)
- Домашна работа – Топки и кутии (Balls and Boxes)
- Занятие 12. Въведение в разработката на Java приложения с Eclipse – 2
- Занятие 13.
- Занятие 14.
- Занятие 15.
- Занятие 16.
- Домашна работа – ManyToOneRelation – домашна работа (Many To One) – краен срок 04 Декември.
- Занятие 17. Въведение в iOS програмирането
- Домашна работа – Генериране на идея за мобилно приложение – краен срок 24:00ч. на 09 Декември 2012
- Занятие 18. ООП в Ruby
- Занятие 19. Изпит за зелен колан
- Занятие 20. Изпит за зелен колан. Поправка
Глава трета – Тестове, въведение в JUnit. Процес на разработка
- Занятие 21. Test driven development. Въведение в JUnit
- Проект разработен в час
- Занатие 22. Въведение в JUnit
- Jenkins. Билдване
- Метрики. Flay и Flog и codecoverage
- Production процес
- JUnit. Конвертиране на арабски в римски числа
- Занятие 23.
- Занятие 24.
- org.elsys.manytoone.junit.zip
- disconnect за ManyToOneRelation
- contains за ManyToOneRelation
- Equals за ManyToOne
- Занятие 25. Реализиране на Box и Ball от учениците
- Box разполага с
- add
- remove
- clear
- contains
- size
- getFreeCapacity
- getFilledCapacity
- getFromSmallest
- Ball разполага с
- name
- size
- color
- Box разполага с
- Занятие 26. Изпити за колани.
- Предадените на изпита задачи може да се открият на http://lubo.elsys-bg.org/2013/01/22/belt_exams_tp/. Резултатите може да се достъпят наhttps://docs.google.com/spreadsheet/ccc?key=0Amu3mIflzKI4dG9ualBkLVBib0FuZktoT3hGVnhyUVE#gid=0
- Изисквания – Всеки идва за своя колан. Времето е 30 минути. Имате право на интернет. Всеки проекти или директория носи името клас_номер_първоиме_второиме_трето_име. Всички задачи се архивират преди да изтекът 30 минути. Архивът трябва да е zip или tgz и се поставят на десктопа на машините. Всеки главен (Main) клас носи първо_име_номер на ученика.
- Жълти – обработка на CSV документи
- Пример: В документ има три колони, Име, Поща, Роля. Да се намерят всички с дадена роля дадена от командния ред и да се прехвърлят в нов CSV документ.
- Пример: В документ има три колони, Три Имена, Поща, Роля. Да се намерят всички с чието второ име е дадено като аргумент от командния ред и да се прехвърлят в нов CSV документ.
- Пример: В документ има три колони, Три Имена, Поща, Роля. От командния ред се подава аргумент X. Да се намерят и да се запишат в нов CSV документ всички редове, за които (дължината на именто плюс дължината на email-а ) > x
- Пример: Като горния, но условието е (дължината на ролята минус дължината на email-а ) > x
- Зелени – обектно ориентирана задача
- Пример: Дадени са клас PremiumCustomer, BaseCustomer всеки с полета:name,address,annual billing. Да се изгради общ клас. От конзолата да се въвеждат клиент с низ „character, name, address, annual billing“. Ако character е „p“ се въвежда PremiumCustomer. Ако character с „b“ се въвежда BaseCustomer. Редът е произволен. PremiumCustomer имплементира интерфейс с Discountable с метод discount, който намалява стойността на annual billing на половина. След въвеждане на няколко клиент от конзолата се въвежда едно число. Извиква се методът discount на всички PremiumCustomer-и чиито annual billing е по-голям от въведеното число.
- Пример: Като горната, но въвеждането е по следния начин. Всяко четно въвеждане е на PremiumCustomer, всяко нечетно е на BaseCustomer и входът изглежда като name, address, annual billing. Въвеждането спира когато се въведе само едно число X. Да се изведът всички BC за които annual billing > X и всички PC за които annual billing < X.
- Пример: Да се извика метода discount на всички PC чиието annual billing е равен на annual billing-а на някой BC. Методът discount да намали стойността на annual billing на две.
- Сини – junit тестове върху обектно ориентирана задача. Да се разработи структурата от класове както и JUnit, RSpec или като цяло unit тестове за приложението. Търси се 100% покритие на кода и на функционалността. Най-важното в задачата е разработването на тестовете за функционалността. Самата функционалност е достатъчно лесна, за да се разработи за около 10 минути.
- Пример: Да се създаде клас за спедиторска фирма. Класът се казва Company и има следните свойства и методи: add_package, remove_package, clear, get_weight_sum, get_long_distance_packages_from_smallest. Компанията може да получава пратки от типа Package(sender_name, weight, type(short_distance, long_distance)). Методът get_long_distance_packages_from_smallest връща списък от всички пакети от тип long_distance сортирани от най-лекия към най-тежкия.
- Пример: Да се създаде клас за отбор. Класът се казва Team и има следните свойства и методи: add_member, remove_member, get_average_age, contains_member_with_name(name), get_members_sorted_by_gender_and_age. Отборът може да има играчи от тип Member(gender(male, female), name, age). Методът get_members_sorted_by_gender_and_age връща сортиран списък където първо са играчите от тип female сортирани от най-ниската към най-високата възраст, след което играчите от тип male сортирани от най-ниската към най-високата възрастсортирани от най-ниската към най-високата възраст. Методът contains_member_with_name(name) проверява дали отборът имам играч с даденото име.
- Пример: Да се създаде клас за училище- Класът се казва School и има следните свойства и методи: addStudent, RemoveStudent, numberOfStudents, findStudentByName, getSortedByGenderAndAge. Училището работи с ученици от тип Student(name, gender(f,m), age). Методът get_sorted_by_gender_and_age връща сортиран списък с всички мъже сортирани по възраст възходящо последвани от всички жени сортирани в низходящ ред. Методът find_by_name намира обектът Student по дадено име или връща null ако такъв не е намерен.
- Пример: Да се създаде клас за склад за коли- Класът се казва CarWharehouse и има следните свойства и методи: addCar, removeCar, numberOfCars, findAllByBrand, getSortedByBrandAndAge. Складът работи с коли от тип Car(brand, age). Методът getSortedByBrandAndAge връща сортиран списък с всички коли сортирани по марка, като колите с еднаква марка са сортирани по възраст низходящо. Методът findAllByBrand намира всички коли от дадена марка или връща празен списък ако няма такива коли.
- Пример: Да се създаде клас за склад за коли- Класът се казва CarWharehouse и има следните свойства и методи: addCar, removeCar, getAllBrands, getAverageAgeForEachBrand. Складът работи с коли от тип Car(brand, age). Методът getAverageAgeForEachBrand връща таблица, в която ключът е марка, а стойността е средната възраст на колите от тази марка. Методът getAllBrands връща списък с всички марки.
- Пример: Да се създаде клас за училище- Класът се казва School и има следните свойства и методи: addStudent, RemoveStudent, getOlderThen(value), getGendersForAges. Училището работи с ученици от тип Student(name, gender(f,m), age). Методът getOlderThen връща списък с ученици по-големи на възраст от стойност value. Методът getFemaleForAges връща таблица с ключ възраст, и стойност броят на момичетата на съответната възраст.
- Занятие 27. Поправка на изпити и оформяне за срока.
- Да се попълни формата за предадените Google Code In домашни
Глава четвърта. Разработка на проекти. Графичен интерфейс.
- Занятие 28. Избор на проекти.
- Занятие 29. Дискусия върху проекти.
- Занятие 30. Разработка на Desktop приложения. Примери със SWT. Изграждат се бутони. Използва се графичен контекст. Целта на занятието е да се въведат учениците в основни понятия при изграждане на графичен интерфейс. Обработка на събития. Създаване на компоненти. Графични редактори.
- Standard Widget Toolkit (включваща GC)
- Реализирана задача с А клас – org.elsys.swt_2013_A
- Реализирана задача с Б клас – org.elsys.swt_2013_B
- Занятие 31. Математически задачи в графичен редактор.
- Реализираната с А клас задача – org.elsys.swt2
- Занятие 32. Математически задачи в графичен редактор. С графичния редактор в занятие 31 се изчертават произволни триъгълници и фигури.
- Изчисляване перимерът при въвеждане на брой точки. Въвежда се p:1,2,3 и се изчислява периметърът на тази фигура
- Решили първи в А клас: BozhurskiKocev11a
- Изчисляване лицето на тръгълник при въвеждане на брой точки. Въвежда се a:1,2,3 и се изчислява лицето на тази фигура
- Решили първи в А клас:
- Решили първи в Б клас:
- Даниел и Виктор – 11B.Viktor.Daniel
- Изчисляване на ъгъл по три точки. Въвеждат се точките с команда angle:p1,p2,p3 и се изчислява ъгълъг заключен между правите (p1,p2) и (p2,p3)
- Решили първи в А клас:
- Решили първи от Б клас:
- 11B.Viktor.Daniel2
- Изчисляване и показване ъглите на даден триъгълник. Въвежда се anlges:p1,p2,p3, изчисляват се трите вътришни ъгъла на този триъгълник и се изчертават на екрана.
- Решили първи в А клас:
- Изчертаване на ъглополовящата на ъгъл: Въвежда се sa:p1,p2,p3, намира се ъгълът p1,p2,p3, и с червен цвят се начертава неговата ъглополовяща.
- Домашно – До 11 март.
- Проекти –
- Хранилище
- Работещ код и „нещо да се случва“.
- Описание на функционалност
- Разделение на задачи
- Изчисляване перимерът при въвеждане на брой точки. Въвежда се p:1,2,3 и се изчислява периметърът на тази фигура
- Занятие 33
- Изчисляване и показване ъглите на даден триъгълник. Въвежда се anlges:p1,p2,p3, изчисляват се трите вътришни ъгъла на този триъгълник и се изчертават на екрана.
- Решили първи в А клас:
- Изчертаване на ъглополовящата на ъгъл: Въвежда се sa:p1,p2,p3, намира се ъгълът p1,p2,p3, и с червен цвят се начертава неговата ъглополовяща.
- Изчисляване и показване ъглите на даден триъгълник. Въвежда се anlges:p1,p2,p3, изчисляват се трите вътришни ъгъла на този триъгълник и се изчертават на екрана.
- Занятие 34. Изпит. Да се въведат промени върху готов код.
- Да се добави бутон за изчертаване на овал
- Да се добави бутон за избор на цвят за фон
- Да се добави бутон изчертаване на линия
- Да се добави бутон, който да променя дебелината на изчертаване на линиите. Да стават 3 пиксела дебели
- Когато се натисне с мишката на това место да се създава обект изписващ текст „Elsys“
Глава пета. Програмиране с Ruby.
- Занятие 35. Въведение в Ruby – променливи, основни типове данни и операции с тях, масиви.
- Занятие 36. Хешове, функции, анонимни функции (Proc.new, lambda), блокове
- Занятие 37. Ruby и ООП. Модули и миксиране на модули.
- Лекции от заняието: ООП, Модули и Enumerable
- Домашно: да се (до)прочете лекцията за Enumerable
- Задача за домашно – форма за предаване
- Занятие 38. Разглеждане и обсъждане на домашните работи. Използвани добри и лоши практики в решенията
Глава шеста. Разработка на софтуер
- Занятие 39: HeadFirstSD_ch01_GreatSoftwareDevelopment, HeadFirstSD_ch02_GatheringRequirements
- Да се разработят User Story и решение за време за RoboSimulator – онлайн платформа за симулиране на роботи
- 00:00 – начало и подготовка за срещата с клиент на всеки от отборите. Да си направят проучване и запишат въпросите, които смятат да зададът.
- 00:15 – Разговор с клиента и въпроси и отговори.
- 00:30 – Подготовка на User Story
- 00:45 – Определяне на времето за всяко UserStory
- 00:60 – Крайна оценка колко ще отнеме
- https://docs.google.com/spreadsheet/ccc?key=0Amu3mIflzKI4dFQzZUI1SWZ1T3RGV2x0VTZUbE9ic2c#gid=0
- Занятие 40:HeadFirstSD_ch03_ProjectPlaning, HeadFirstSD_ch04_UserStoriesAndTasks
- Занятие 41:
- Кои сте вие?
- Какъв е проблемът?
- Какво е решението му?
- Какви бяха предизвикателствата?
- Какво най-много научихте?
- Wiki, Демо, Видео, CodeCoverage