solid, dry, yagni, kiss telerik software academy high-quality code
Post on 05-Jan-2016
227 views
TRANSCRIPT
![Page 1: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/1.jpg)
SOLID and Other Principles
SOLID, DRY, YAGNI, KISS
Telerik Software Academyhttp://academy.telerik.com
High-Quality Code
![Page 2: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/2.jpg)
Table of Contents SOLID Principles
SRP – Single Responsibility Principle
OCP – Open/Closed Principle
LSP – Liskov Substitution Principle
ISP – Interface Segregation Principle
DIP – Dependency Inversion Principle
DRY – Don't Repeat Yourself YAGNI – You Aren't Gonna Need It KISS – Keep It Simple, Stupid
2
![Page 3: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/3.jpg)
Single Responsibility
![Page 4: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/4.jpg)
SRP
4
"The Single Responsibility Principle states that every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class."
Wikipedia
"There should never be more than one reason for a class to change."
Robert C. “Uncle Bob” Martin
![Page 5: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/5.jpg)
SRP
Cohesion Relation of responsibilities
Focused on one task
Coupling Dependency on other modules
Relationship between modules
Ideal - low coupling / strong cohesion
5
![Page 6: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/6.jpg)
SRP
Responsibilities "A reason to change"
Mapped to project requirements
More requirements – more possible changes
More responsibilities – more changes in code
Multiple responsibilities in one class – coupling
More coupling – more errors on change
6
![Page 7: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/7.jpg)
SRP
Classic violations Objects that can print/draw
themselves
Objects that can save/restore themselves
Classic solution Separate printer
Separate saver (or memento)
7
![Page 8: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/8.jpg)
SRP Solution
Multiple small interfaces (ISP)
Many small classes
Distinct responsibilities
Result Flexible design
Lower coupling
Higher cohesion
8
![Page 9: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/9.jpg)
Single ResponsibilityLive Demo
![Page 10: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/10.jpg)
Open/Closed Principle
![Page 11: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/11.jpg)
OCP
11
"The Open / Closed Principle states that software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification."
Wikipedia
Open to Extension New behavior can be added in the
future
Closed to Modification Changes to source or binary code
are not required
![Page 12: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/12.jpg)
OCP
12
Change behavior without changing code?! Rely on abstractions, not
implementations
Do not limit the variety of implementations
In .NET Interfaces
Abstract Classes
In procedural code Use parameters
![Page 13: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/13.jpg)
OCP
Classic violations Each change requires re-testing
(possible bugs)
Cascading changes through modules
Logic depends on conditional statements
Classic solution New classes (nothing depends on
them yet)
New classes (no legacy coupling)
13
![Page 14: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/14.jpg)
OCP Three approaches to achieve OCP
Parameters Pass delegates / callbacks
Inheritance / Template Method pattern Child types override behavior of a
base class
Composition / Strategy pattern Client code depends on abstraction
"Plug in" model 14
![Page 15: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/15.jpg)
OCP When to apply OCP?
Experience tell you
"Fool me once, shame on you" Don't apply OCP at first
If module changes once, accept it
If it changes a second time, refactor for OCP
OCP add complexity to design (TANSTAAFL)
No design can be closed against all changes
15
![Page 16: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/16.jpg)
Open / ClosedLive Demo
![Page 17: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/17.jpg)
Liskov Substitution
![Page 18: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/18.jpg)
LSP
18
"The Liskov Substitution Principle states that Subtypes must be substitutable for their base types."
Agile Principles, Patterns, and Practices in C#
Substitutability – child classes must not Remove base class behavior
Violate base class invariants
![Page 19: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/19.jpg)
LSP
19
Normal OOP inheritance
IS-A relationship
Liskov Substitution inheritance
IS-SUBSTITUTABLE-FOR
![Page 20: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/20.jpg)
LSP
20
The problem Polymorphism break
Client code expectations
"Fixing" by adding if-then – nightmare (OCP)
Classic violations Type checking for different methods
Not implemented overridden methods
Virtual methods in constructor
![Page 21: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/21.jpg)
LSP
21
Solutions "Tell, Don't Ask"
Don’t ask for types
Tell the object what to do
Refactoring to base class Common functionality
Introduce third class
![Page 22: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/22.jpg)
Liskov SubstitutionLive Demo
![Page 23: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/23.jpg)
Interface Segregation
![Page 24: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/24.jpg)
ISP
24
"The Interface Segregation Principle states that Clients should not be forced to depend on methods they do not use."
Agile Principles, Patterns, and Practices in C#
Prefer small, cohesive interfaces
Divide "fat" interfaces into smaller ones
![Page 25: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/25.jpg)
ISP
25
Interface is: The interface type
All public members of a class
Having "fat" interfaces leads to: Classes having methods they do not
need
Increasing coupling
Reduced flexibility
Reduced maintainability
![Page 26: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/26.jpg)
ISP
26
Classic violations Unimplemented methods (also in
LSP)
Use of only small portion of a class
When to fix? Once there is pain! Do not fix, if is
not broken!
If the "fat" interface is yours, separate it to smaller ones
If the "fat" interface is not yours, use "Adapter" pattern
![Page 27: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/27.jpg)
ISP
27
Solutions
Small interfaces
Cohesive interfaces
Focused interfaces
Let the client define interfaces
Package interfaces with their implementation
![Page 28: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/28.jpg)
Interface Segregation
Live Demo
![Page 29: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/29.jpg)
Dependency Inversion
![Page 30: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/30.jpg)
DIP
30
"High-level modules should not depend on low-level modules. Both should depend on abstractions."
"Abstractions should not depend on details. Details should depend on abstractions."
Agile Principles, Patterns, and Practices
in C#
![Page 31: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/31.jpg)
DIP
31
Dependency is: Framework
Third Party Libraries
Database
File System
Web Services
System Resources (Clock)
Configuration
The new Keyword
Static methods
Thread.Sleep
Random
![Page 32: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/32.jpg)
DIP
32
Traditional Programming High level modules use lower lever
modules
UI depends on Business Layer
Business layer depends on Infrastructure
Database
Utilities
Static methods (Façade for example)
Classes instantiated everywhere
![Page 33: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/33.jpg)
DIP
33
How it should be Classes should declare what they
need
Constructors should require dependencies
Hidden dependencies should be shown
Dependencies should be abstractions
How to do it Dependency Injection
The Hollywood principle "Don't call us, we'll call you!"
![Page 34: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/34.jpg)
DIP
34
Constructor injection Dependencies – through
constructors
Pros Classes self document requirements
Works well without container
Always valid state
Cons Many parameters
Some methods may not need everything
![Page 35: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/35.jpg)
DIP
35
Property injection Dependencies – through setters
Pros Can be changed anytime
Very flexible
Cons Possible invalid state
Less intuitive
![Page 36: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/36.jpg)
DIP
36
Parameter injection Dependencies – through method
parameter
Pros No change in rest of the class
Very flexible
Cons Many parameters
Breaks method signature
![Page 37: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/37.jpg)
DIP
37
Classic violations Using of the new keyword
Using static methods/properties
How to fix? Default constructor
Main method/starting point
Inversion of Control container
![Page 38: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/38.jpg)
DIP
38
IoC containers
Responsible for object instantiation
Initiated at application start-up
Interfaces are registered into the container
Dependencies on interfaces are resolved
Examples – StructureMap, Ninject and more
![Page 39: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/39.jpg)
Dependency Inversion
Live Demo
![Page 40: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/40.jpg)
Other Principles
![Page 41: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/41.jpg)
Don't Repeat Yourself
![Page 42: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/42.jpg)
DRY
42
"Every piece of knowledge must have a single, unambiguous representation in the system."
The Pragmatic Programmer
"Repetition in logic calls for abstraction. Repetition in process calls for automation."97 Things Every Programmer Should Know Variations include:
Once and Only Once
Duplication Is Evil (DIE)
![Page 43: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/43.jpg)
DRY
43
Classic violations Magic Strings/Values
Duplicate logic in multiple locations
Repeated if-then logic
Conditionals instead of polymorphism
Repeated Execution Patterns
Lots of duplicate, probably copy-pasted, code
Only manual tests
Static methods everywhere
![Page 44: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/44.jpg)
Don't Repeat Yourself
Live Demo
![Page 45: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/45.jpg)
You Ain't Gonna Need It
![Page 46: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/46.jpg)
YAGNI
46
"A programmer should not add functionality until deemed necessary."
Wikipedia
"Always implement things when you actually need them, never when you just foresee that you need them."
Ron Jeffries, XP co-founder
![Page 47: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/47.jpg)
YAGNI
47
Disadvantages Time for adding, testing, improving
Debugging, documented, supported
Difficult for requirements
Larger and complicate software
May lead to adding even more features
May be not know to clients
![Page 48: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/48.jpg)
You Ain't Gonna Need It
Live Demo
![Page 49: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/49.jpg)
Keep It Simple, Stupid
![Page 50: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/50.jpg)
KISS
50
"Most systems work best if they are kept simple."
U.S. Navy
"Simplicity should be a key goal in design and unnecessary complexity should be avoided."
Wikipedia
![Page 51: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/51.jpg)
Keep It Simple StupidLive Demo
![Page 52: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/52.jpg)
Even More Principles
![Page 53: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/53.jpg)
Golden Hammer
![Page 54: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/54.jpg)
Feature Creep
![Page 55: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/55.jpg)
Duck Tape Coder
![Page 56: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/56.jpg)
Iceberg Class
![Page 57: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/57.jpg)
Spaghetti Code
![Page 58: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/58.jpg)
Calendar Coder
![Page 59: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/59.jpg)
Reinventing The Wheel
![Page 60: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/60.jpg)
Copy Paste Programming
![Page 61: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/61.jpg)
Boy Scout Rule
![Page 62: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/62.jpg)
форум програмиране, форум уеб дизайнкурсове и уроци по програмиране, уеб дизайн – безплатно
програмиране за деца – безплатни курсове и уроцибезплатен SEO курс - оптимизация за търсачки
уроци по уеб дизайн, HTML, CSS, JavaScript, Photoshop
уроци по програмиране и уеб дизайн за ученициASP.NET MVC курс – HTML, SQL, C#, .NET, ASP.NET MVC
безплатен курс "Разработка на софтуер в cloud среда"
BG Coder - онлайн състезателна система - online judge
курсове и уроци по програмиране, книги – безплатно от Наков
безплатен курс "Качествен програмен код"
алго академия – състезателно програмиране, състезания
ASP.NET курс - уеб програмиране, бази данни, C#, .NET, ASP.NETкурсове и уроци по програмиране – Телерик академия
курс мобилни приложения с iPhone, Android, WP7, PhoneGap
free C# book, безплатна книга C#, книга Java, книга C#Дончо Минков - сайт за програмиранеНиколай Костов - блог за програмиранеC# курс, програмиране, безплатно
?
? ? ??
?? ?
?
?
?
??
?
?
? ?
Questions?
?форум програмиране, форум уеб дизайн
курсове и уроци по програмиране, уеб дизайн – безплатно
програмиране за деца – безплатни курсове и уроцибезплатен SEO курс - оптимизация за търсачки
уроци по уеб дизайн, HTML, CSS, JavaScript, Photoshop
уроци по програмиране и уеб дизайн за ученициASP.NET MVC курс – HTML, SQL, C#, .NET, ASP.NET MVC
безплатен курс "Разработка на софтуер в cloud среда"
BG Coder - онлайн състезателна система - online judge
курсове и уроци по програмиране, книги – безплатно от Наков
безплатен курс "Качествен програмен код"
алго академия – състезателно програмиране, състезания
ASP.NET курс - уеб програмиране, бази данни, C#, .NET, ASP.NETкурсове и уроци по програмиране – Телерик академия
курс мобилни приложения с iPhone, Android, WP7, PhoneGap
free C# book, безплатна книга C#, книга Java, книга C#Дончо Минков - сайт за програмиранеНиколай Костов - блог за програмиранеC# курс, програмиране, безплатно
?
? ? ??
?? ?
?
?
?
??
?
?
? ?
Questions?
?
SOLID And Other Principles
http://academy.telerik.com
![Page 63: SOLID, DRY, YAGNI, KISS Telerik Software Academy High-Quality Code](https://reader035.vdocuments.site/reader035/viewer/2022062408/56649f265503460f94c3cd45/html5/thumbnails/63.jpg)
Free Trainings @ Telerik Academy
C# Programming @ Telerik Academy csharpfundamentals.telerik.com
Telerik Software Academy academy.telerik.com
Telerik Academy @ Facebook facebook.com/TelerikAcademy
Telerik Software Academy Forums forums.academy.telerik.com