Preface

If you want to take up programming seriously, you’ve come across the right book. For real! This is the book through which you can make your first steps in programming. It will give a flying start to your long journey into learning the modern programming languages and software development technologies. This book teaches the fundamental principles and concepts of programming, which have not changed significantly in the past 15 years.

Do not hesitate to read this book even if C# is not the language you would like to pursue. Whatever language you move on to, the knowledge we will give you here will stick, because this book will teach you to think like programmers. We will show you and teach you how to write programs for solving practical algorithmic problems, form the skills in you to come up with (and implement) algorithms, and use various data structures.

However improbable it might seem to you, the basic principles of writing computer programs have not changed all that much in the past 15 years. Programming languages change, technologies are getting modernized, integrated development environments get more and more advanced but the fundamental principles of programming remain the same. When the beginners learn to think algorithmically, and then learn to divide a problem instinctively into a series of steps to solve it, as well as when they learn to select the appropriate data structures and write high-quality programming code that is when they become programmers. Once you acquire these skills, you can easily learn new languages and various technologies – like Web programming, HTML5 and JavaScript, mobile development, databases and SQL, XML, REST, ASP.NET, Flash, Java EE, Python, Ruby and hundreds more.

About the Book

This book is designed specifically to teach you to think like a programmer and the C# language is just a tool that can be replaced by any other modern programming languages, such as Java, C++, PHP or Python. This is a book on programming, not a book on C#!

Please Excuse Us for the Bugs in the Translation!

This book was originally written in Bulgarian language by a large team of volunteer software engineers and later translated into English. Nobody among the authors, translators, editors and other contributors is a native English speaker so you might find many mistakes and imprecise translation. Please excuse us! Over 70 people have participated in this project (mostly Bulgarians): authors, editors, translators, correctors, bug submitters, etc. and still the quality could be improved. The entire team congratulates you with your choice to read this book and we believe the content in it is more important that the small mistakes and issues you might find. Enjoy!

Who Is This Book Aimed At?

This book is best suited for beginners. It is intended for anyone who so far has not engaged seriously in programming and would like to begin doing it. This book starts from scratch and introduces you step by step into the fundamentals of programming. It won’t teach you on absolutely everything you might need for becoming a software engineer and working at a software company, but it will lay the groundwork on which to build up technological knowledge and skills, and through them you will be able to turn programming into your profession.

If you’ve never written a computer program, don’t worry. There is always a first time. In this book we will teach you how to program from scratch. We do not expect any previous knowledge or abilities. All you need are some basic computer literacy and a desire to take up programming. The rest you will learn from the book.

If you can already write simple programs or if you have studied programming at school or in college, or you’ve coded with friends, do not assume you know everything! Read this book and you’ll become aware of how many things you’ve missed. This book is indeed for beginners, but it teaches concepts and skills that even experienced professional programmers lack. Software companies are riddled with a shocking amount of self-taught amateurs who, despite having programmed on a salary for years, have no grasp of the fundamentals of programming and have no idea what a hash table is, how polymorphism works and how to work with bitwise operations. Don’t be like them! Learn the basics of programming first and then the technologies. Otherwise you risk having your programming skills crippled, more or less, for years, if not for life.

If, on the other hand, you have programming experience, examine this book in details and see if you are familiar with all subjects we have covered, in order to decide whether it is for you or not. Take a close look especially at the chapters "Data Structures and Algorithms Complexity", "Object-Oriented Programming Principles", "Methodology of Problem Solving" and "High-Quality Programming Code". It is very likely that, even if you have several years of experience, you might not be able to work well with data structures; you might not be able to evaluate the complexity of an algorithm; you might not have mastered in depth the concepts of object-oriented programming (including UML and design patterns); and you might not be acquainted with the best practices for writing high-quality programming code. These are very important topics that are not covered in all books on programming, so don’t skip them!

Initial Knowledge Is Not Required!

In this book we do not expect any previous programming knowledge from the readers. It is not necessary for you to have studied information technology or computer science, in order to read and comprehend the book content. The book starts from scratch and gradually gets you involved in programming. All technical terms you will come across will have been explained beforehand and it is not necessary for you to know them from other sources. If you don’t know what a compiler, debugger, integrated develop­ment environment, variable, array, loop, console, string, data structure, algorithm, algorithm complexity, class or object are, don’t be alarmed. From this book you will learn all these terms and many more, and gradually get accustomed to using them constantly in your everyday work. Just read the book consistently and do the exercises.

Certainly, if after all you do have prior knowledge in computer science and information technologies, they will by all means be of use to you. If, at university, you major in the field of computer science or if you study information technology at school, this will only aid you, but it is not a must. If you major in tourism, law or other discipline that has little in common with computer technology, you could still become a good programmer, as long as you have the desire. The software industry is full of good developers without a computer science or related degree.

It is expected for you to have basic computer literacy, since we would not be explaining what a file, hard disk and network adapter are, nor how to move the mouse or how to write on a keyboard. We expect you to know how to work with a computer and how to use the Internet.

It is recommended that the readers have at least some basic knowledge of English. The entire documentation you will be using every day and almost all of the websites on programming you would be reading at all times are in English. In the profession of a programmer, English is absolutely essential. The sooner you learn it, the better. We hope that you already speak English; otherwise how do you read this text?

clip_image001

Make no illusion you can become a programmer without learning even a little English! This is simply a naive expectation. If you don’t speak English, complete a course of some sort and then start reading technical literature, make note of any unfamiliar words and learn them. You will see for yourselves that Technical English is easy to learn and it doesn’t take much time.

What Is the Scope of This Book?

This book covers the fundamentals of programming. It will teach you how to define and use variables, how to work with primitive data structures (such as numbers), how to organize logical statements, conditional statements and loops, how to print on the console, how to use arrays, how to work with numeral systems, how to define and use methods, and how to create and use objects. Along with the basic programming knowledge, this book will help you take in more complicated concepts such as string processing, exception handling, using complex data structures (like trees and hash tables), working with text files, defining custom classes and working with LINQ queries. The concepts of object-oriented programming (OOP) – an established approach in modern software development – will be covered in depth. Finally, you’ll be faced with the practices for writing high-quality programs and solving real-world programming problems. This book presents a complete methodology for solving programming problems, as well as algorithmic problems in general, and shows how to implement it with a few sample subjects and programming exams. This is something you will not find in any other book on programming!

What Will This Book Not Teach You?

This book will not award you the profession "software engineer"! This book won’t teach you how to use the entire .NET platform, how to work with databases, how to create dynamic web sites and develop mobile applications, how to create window-based graphical user interface (GUI) and rich internet applications (RIA). You won’t learn how to develop complex software applications and systems like Skype, Firefox, MS Word or social networks like Facebook and retail sites like Amazon.com. And no other single book will. These kinds of projects require many, many years of work and experience and the knowledge in this book is just a wonderful beginning for the future programmer geek.

From this book you won’t learn software engineering, team work and you won’t be able to prepare to work on real projects in a software company. In order to learn all of this, you will need a few more books and extra courses, but do not regret the time you will spend on this book. You are making the right choice by starting with the fundamentals of programming rather than directly with Web development, mobile applications and databases. This gives you the opportunity to become a master programmer who has in-depth knowledge of programming and technology. After you acquire the fundamentals of programming it will become much easier for you to read and learn about databases and web applications, and you will understand what you read much easier and in greater depth rather than if you directly begin learning SQL, ASP.NET, AJAX, XAML or WinRT.

Some of your colleagues directly begin programming with Web or mobile applications and databases without knowing what an array, a list or hash table are. Do not envy them! They have set out to do it the hard way, backwards. They will learn to make low-quality websites with PHP and MySQL, but they will find it infinitely difficult to become real professionals. You, too, will learn web technologies and databases, but before you take them up, learn how to program! This is much more important. Learning one technology or another is very easy once you know the basics, when you can think algorithmically and you know how to tackle programming problems.

clip_image001[1]

Starting to program with web applications or/and databases is just as incorrect as studying up a foreign language from some classical novel rather than from the alphabet and a textbook for beginners. It is not impossible, but if you lack the basics, it is much more difficult. It is highly-probable that you would end up lacking vital fundamental knowledge and being the laughing-stock of your colleagues/peers.

How Is the Information Presented?

Despite the large number of authors, co-authors and editors, we have done our best to make the style of the book similar in all chapters and highly comprehensible. The content is presented in a well-structured manner; it is broken up into many titles and subtitles, which make its reception easy and looking up information in the text quick.

The present book is written by programmers for programmers. The authors are active software developers, colleagues with genuine experience in both software development and training future programmers. Due to this, the quality at which the content is presented is at a very good level, as you will see for yourself.

All authors are distinctly aware that the sample source code is one of the most important things in a book on programming. Due to this very reason, the text is accompanied with many, many examples, illustrations and figures.

When every chapter is written by a different author, there is no way to completely avoid differences in the style of speech and the quality between chapters. Some authors put a lot of work (for months) and a lot of efforts to make their chapters perfect. Others could not invest too much effort and that is why some chapters are not as good as the best ones. Last, but not least, the experience of the authors varies – some have been programming professionally for 2-3 years, while others – for 15 years. This affects the quality, no doubt, but we assure you that every chapter has been reviewed and meets the quality standards of Svetlin Nakov and his team.

C# and .NET Framework

This book is about programming. It is intended to teach you to think as a programmer, to write code, to think in data structures and algorithms and to solve problems.

We use C# and Microsoft .NET Framework (the platform behind C#) only as means for writing programming code and we do not scrutinize the language’s specifics. This same book can be found in versions for other languages like Java and C++, but the differences are not very significant.

Nevertheless, let’s give a short account of C# (pronounced "see sharp").

clip_image001[2]

C# is a modern programming language for development of software applications.

If the words "C#" and ".NET Framework" are unknown to you, you’ll learn in details about them and their connection in the next chapter. Now let’s explain briefly what C#, .NET, .NET Framework, CLR and the other technologies related to C# are.

The C# Programming Language

C# is a modern object-oriented, general-purpose programming language, created and developed by Microsoft together with the .NET platform. There is highly diverse software developed with C# and on the .NET platform: office applications, web applications, websites, desktop applications, mobile applications, games and many others.

C# is a high-level language that is similar to Java and C++ and, to some extent, languages like Delphi, VB.NET and C. All C# programs are object-oriented. They consist of a set of definitions in classes that contain methods and the methods contain the program logic – the instructions which the computer executes. You will find out more details on what a class, a method and C# programs are in the next chapter.

Nowadays C# is one of the most popular programming languages. It is used by millions of developers worldwide. Because C# is developed by Microsoft as part of their modern platform for development and execution of applications, the .NET Framework, the language is widely spread among Microsoft-oriented companies, organizations and individual developers. For better or for worse, as of this book writing, the C# language and the .NET platform are maintained and managed entirely by Microsoft and are not open to third parties. Because of this, all other large software corporations like IBM, Oracle and SAP base their solutions on the Java platform and use Java as their primary language for developing their own software products.

Unlike C# and the .NET Framework, the Java language and platform are open-source projects that an entire community of software companies, organizations and individual developers take part in. The standards, the specifications and all the new features in the world of Java are developed by workgroups formed out of the entire Java community, rather than a single company (as the case of C# and .NET Framework).

The C# language is distributed together with a special environment on which it is executed, called the Common Language Runtime (CLR). This environment is part of the platform .NET Framework, which includes CLR, a bundle of standard libraries providing basic functionality, compilers, debuggers and other development tools. Thanks to the framework CLR programs are portable and, once written they can function with little or no changes on various hardware platforms and operating systems. C# programs are most commonly run on MS Windows, but the .NET Framework and CLR also support mobile phones and other portable devices based on Windows Mobile, Windows Phone and Windows 8. C# programs can still be run under Linux, FreeBSD, iOS, Android, MacOS X and other operating systems through the free .NET Framework implementation Mono, which, however, is not officially supported by Microsoft.

The Microsoft .NET Framework

The C# language is not distributed as a standalone product – it is a part of the Microsoft .NET Framework platform (pronounced "Microsoft dot net framework"). .NET Framework generally consists of an environment for the development and execution of programs, written in C# or some other language, compatible with .NET (like VB.NET, Managed C++, J# or F#). It consists of:

-     the .NET programming languages (C#, VB.NET and others);

-     an environment for the execution of managed code (CLR), which executes C# programs in a controlled manner;

-     a set of development tools, such as the csc compiler, which turns C# programs into intermediate code (called MSIL) that the CLR can understand;

-     a set of standard libraries, like ADO.NET, which allow access to databases (such as MS SQL Server or MySQL) and WCF which connects applications through standard communication frameworks and protocols like HTTP, REST, JSON, SOAP and TCP sockets.

The .NET Framework is part of every modern Windows distribution and is available in different versions. The latest version can be downloaded and installed from Microsoft’s website. As of this book’s publishing, the latest version of the .NET Framework is 4.5. Windows Vista includes out-of-the-box .NET Framework 2.0, Windows 7 – .NET 3.5 and Windows 8 – .NET 4.5.

Why C#?

There are many reasons why we chose C# for our book. It is a modern programming language, widely spread, used by millions of programmers around the entire world. At the same time C# is a very simple and easy to learn (unlike C and C++). It is natural to start with a language that is suitable for beginners while still widely used in the industry by many large companies, making it one of the most popular programming languages nowadays.

C# or Java?

Although this can be extensively discussed, it is commonly acknowledged that Java is the most serious competitor to C#. We will not make a comparison between Java and C#, because C# is undisputedly the better, more powerful, more rich and just better engineered. But, for the purposes of this book, we have to emphasize that any modern programming language will be sufficient to learn programming and algorithms. We chose C#, because it is easier to learn and is distributed with highly convenient, free integrated development environment (e.g. Visual C# Express Edition). Those who prefer Java can prefer to use the Java version of this book, which can be found here: www.introprogramming.info.

Why Not PHP?

With regards to programing languages popularity, besides C# and Java, another widely used language is PHP. It is suitable for developing small web sites and web applications, but it gives rise to serious difficulties when implementing large and complicated software systems. In the software industry PHP is used first and foremost for small projects, because it can easily lead developers into writing code that is bad, disorganized and hard to maintain, making it inconvenient for more substantial projects. This subject is also debatable, but it is commonly accepted that, because of its antiquated concepts and origins it is built on and because of various evolutionary reasons, PHP is a language that tends towards low-quality programming, writing bad code and creating hard to maintain software. PHP is a procedural language in concept and although it supports the paradigms of modern object-oriented programming, most PHP programmers write procedurally. PHP is known as the language of "code monkeys" in the software engineering profession, because most PHP programmers write terrifyingly low-quality code. Because of the tendency to write low-quality, badly structured and badly organized programming code, the entire concept of the PHP language and platform is considered wrong and serious companies (like Microsoft, Google, SAP, Oracle and their partners) avoid it. Due to this reason, if you want to become a serious software engineer, start with C# or Java and avoid PHP (as much as possible).

Certainly, PHP has its uses in the world of programming (for example creating a blog with WordPress, a small web site with Joomla or Drupal, or a discussion board with PhpBB), but the entire PHP platform is not well-organized and engineered for large systems like .NET and Java. When it comes to non-web-based applications and large industrial projects, PHP is not by a long shot among the available options. Lots and lots of experience is necessary to use PHP correctly and to develop high-quality professional projects with it. PHP developers usually learn from tutorials, articles and low-quality books and pick up bad practices and habits, which then are hard to eradicate. Therefore, do not learn PHP as your first development language. Start with C# or Java.

Based on the large experience of the authors' collective we advise you to begin programming with C# and ignore languages like C, C++ and PHP until the moment you have to use them.

Why Not C or C++?

Although this is also debatable, the C and C++ languages are considered rather primitive, old and decaying. They still have their uses and are suitable for low-level programming (e.g. programming for specialized hardware devices), but we do not advise you to pursue them.

You can program in pure C, if you have to write an operating system, a hardware device driver or if you want to program an embedded device, because of the lack of alternatives and the need to control the hardware very carefully. The C language is morally old and in no way do we advise you to begin programming with it. A programmer’s productivity under pure C is many times lower compared to their productivity under modern general-purpose programming languages like C# and Java. A variant of C is used among Apple / iPhone developers, but not because it is a good language, but because there is no decent alternative. Most Apple-oriented programmers do not like Objective-C, but they have no choice in writing in something else.

C++ is acceptable when you have to program applications that require very close work with the hardware or that have special performance requirements (like 3D games). For all other purposes (like web applications development or business software) C++ is phenomenally inadequate. We do not advise you to pursue it, if you are starting with programming just now. The reason it is still being studied in some schools and universities is hereditary, because these institutions are very conservative. For example, the International Olympiad in Informatics (IOI) continues to promote C++ as the only language permitted to use at programming contests, although C++ is rarely used in the industry. If you don’t believe this, look through some job search site and count the percentage of job advertisements with C++.

The C++ language lost its popularity mainly because of the inability to quickly write quality software with it. In order to write high-quality software in C++, you have to be an incredibly smart and experienced programmer, whereas the same is not strictly required for C# and Java. Learning C++ takes much more time and very few programmers know it really well. The productivity of C++ programmers is many times lower than C#’s and that is why C++ is losing ground. Because of all these reasons, the C++ language is slowly fading away and therefore we do not advise you to learn it.

The Advantages of C#

C# is an object-oriented programming language. Such as are all modern programming languages that are used for serious software systems (like Java and C++). The advantages of object-oriented programming are brought up in many passages throughout the book, but, for the moment, you can think of object-oriented languages as languages that allow working with objects from the real world (for example student, school, textbook, book and others). Objects have properties (e.g. name, color, etc.) and can perform actions (e.g. move, speak, etc.).

By starting to program with C# and the .NET Framework platform, you are on a very perspective track. If you open a website with job offers for programmers, you’ll see for yourself that the demand for C# and .NET specialists is huge and is close to the demand of Java programmers. At the same time, the demand for PHP, C++ and other technology specialists is far lower than the demand for C# and Java engineers.

For the good programmer the language they use is of no significant meaning, because they know how to program. Whatever language and technology they might need, they will master it quickly. Our goal is not to teach you C#, but rather to teach you programming! After you master the fundamentals of programming and learn to think algorithmically, when you acquaint with other programming languages and you will see for yourself how much in common they have with C# and how easy it will be to learn them. Programming is built upon principles that change very slowly over the years and this book teaches you these very principles.

Examples Are Given in C# 5 and Visual Studio 2012

All examples in this book are with regard to version 5.0 of the C# language and the .NET Framework 4.5 platform, which is the latest as of this book’s publishing. All examples on using the Visual Studio integrated development environment are with regard to version 2012 of the product, which were also the latest at the time of writing this book.

The Microsoft Visual Studio 2012 integrated development environment (IDE) has a free version, suitable for beginner C# programmers, called Microsoft Visual Studio Express 2012 for Windows Desktop. The difference between the free and the full version of Visual Studio (which is a commercial software product) lies in functionality, which we will not need in this book.

Although we use C# 5 and Visual Studio 2012, most examples in this book will work flawlessly under .NET Framework 2.0 / 3.5 / 4.0 and C# 2.0 / 3.5 / 4.0 and can be compiled under Visual Studio 2005 / 2008 / 2010.

It is of no great significance which version of C# and Visual Studio you’ll use while you learn programming. What matters is that you learn the principles of programming and algorithmic thinking! The C# language, the .NET Framework platform and the Visual Studio integrated development environment are just tools and you can exchange them for others at any time. If you read this book and VS2012 is not currently the latest, be sure almost all of this book content will still be the same due to backward compatibility.

How То Read This Book?

Reading this book has to be accompanied with lots and lots of practice. You won’t learn programming, if you don’t practice! It would be like trying to learn how to swim from a book without actually trying it. There is no other way! The more you work on the problems after every chapter, the more you will learn from the book.

Everything you read here you would have to try for yourself on a computer. Otherwise you won’t learn anything. For example, once you read about Visual Studio and how to write your first simple program, you must by all means download and install Microsoft Visual Studio (or Visual C# Express) and try to write some program. Otherwise you won’t learn! In theory, everything seems easy, but programming means practice. Remember this and try to solve the problems from this book. They are carefully selected – they are neither too hard to discourage you, nor too easy, so you’ll be motivated to perceive solving them as a challenge. If you encounter difficulties, look for help at the discussion group for the "C# Programming Fundamentals" training course at Telerik Software Academy: https://softuni.bg/forum (the forum is intended for Bulgarian developers but the people "living" in it speak English and will answer your questions regarding this book, don’t worry). Thousands students solve the exercises from this book every year so you will find many solutions to each problem from the book. We will also publish official solutions + tests for every exercise in the book at its web site.

clip_image001[3]

Reading this book without practicing is meaningless! You must spend much more time on writing programs than reading the text itself. It is just like learning to drive: no one can learn driving by reading books. To learn driving you need to drive many times in different situations, roads, cars, etc. To learn programming you need to program!

Everybody has studied math in school and knows that learning how to solve math problems requires lots of practice. No matter how much a person watches and listens to their teacher, without actually sitting down and solving problems, they won’t learn. The same goes for programming. You need lots of practice. You need to write a lot, to solve problems, to experiment, to endeavor in and to struggle with problems, to make mistakes and correct them, to try and fail, to try anew and to experience the moments when things finally work out. You need lots and lots of practice. This is the only way you will make progress.

So people say that to become a developer you might need to write at least 50,000 – 100,000 lines of code, but the correct number can vary much. Some people are fast learners or just have problem solving experience. Others may need more practice, but in all cases practicing programming is very important! You need to solve problems and a lot of write code to become a developer. There is no other way!

Do Not Skip the Exercises!

At the end of each chapter there is a considerable list of exercises. Do not skip them! Without exercises you will not learn a thing. After you read a chapter, you must sit in front of the computer and play with the examples you have seen in the book. Then you must set about solving all problems. If you cannot solve them all, you should at least try. If you don’t have all the time necessary, you must at least attempt solving the first few problems from each chapter. Do not carry on without solving problems after every chapter, it would just be meaningless! The problems are small feasible situations where you apply the stuff you have read. In practice, once you have become programmers, you would solve similar problems every day, but on a larger and more complex scale.

clip_image001[4]

You must at all cost strive to solve the exercise problems after every chapter from the book! Otherwise you risk not learning anything and simply wasting your time.

How Much Time Will We Need for This Book?

Mastering the fundamentals of programming is a crucial task and takes a lot of time. Even if you’re incredibly good at it, there is no way that you will learn programming on a good level for a week or two. To learn any human skill, you need to read, to see or to be shown how it is done and then to try doing it yourselves and practice a lot. The same goes for programming – you must either read, see or listen how it is done, then try doing it yourself. Then you would succeed or you would not and you would try again, until you finally realize you have learned it. Learning is done step by step, consecutively, in series, with a lot of effort and consistency.

If you want to read, understand, learn and acquire entirely, and in-depth, the subject matter in this book, you have to invest at least 2 months for daylong activity or at least 4-5 months, if you read and exercise a little every day. This is the minimum amount of time it would take you to be able to grasp in depth the fundamentals of programming.

The necessity of such an amount of lessons is confirmed by the free trainings in Telerik Software Academy (https://softuni.bg), which follows this very book. The hundreds of students, who’ve undergone training on the lectures from this book, usually learn all subjects from this book within 3-4 months of full-time work. Thousands of students every year solve all exercise problems from this book and successfully sit on programming exams covering the book’s content. Statistics shows that anyone without prior exposure to programming, who has spent less than the equivalent of 3-4 months daylong activity on this book and the corresponding course in Telerik Academy, fails the exams.

The main subject matter in the book is presented in more than 1100 pages, which will take you a month (daylong) just to read them carefully and test the sample programs. Of course, you have to spend enough time on the exercises (few more months); without them you would hardly learn programming.

Exercises: Complex or Easy?

The exercises in the book consist of about 350 problems with varying difficulty. For some of them you will need a few minutes, for others several hours (if you can solve them at all without help). This means you would need a month or two of daylong exercising or several months, if you do it little by little.

The exercises at each chapter are ordered in increasing level of difficulty. The first few exercises are easy, similar to the examples in the chapter. The last few exercises are usually complex. You might need to use external resources (like reading in Wikipedia) to solve them. Intentionally the last few exercises in each chapter require skills outside of the chapter. We want to push you to perform a search in your favorite search engine. You need to learn searching in Internet! This is an essential skill for any programmer. You need to learn how to learn. Programming is about learning every day. Technologies constantly change and you can’t know everything. To be a programmer means to learn new APIs, frameworks, technologies and tools every day. This cannot be avoided, just prepare yourself. You will find many problems in the exercises, which require searching in Internet. Sometime you will need the skills from the next chapter, sometimes some well-known algorithm, sometimes something else, but in all cases searching in Internet is essential skill you need to acquire.

Solving the exercises in the book needs few months, really. If you don’t have that much time at your disposal, ask yourselves if you really want to pursue programming. This is a very serious initiative you must invest a really great deal of efforts in. If you really want to learn programming on a good level, schedule enough time and follow the book or the video lectures based on it.

Why Are Data Structures and Algorithms Emphasized?

This book teaches you, in addition to the basic knowledge in programming, proper algorithmic thinking and using the basic data structures in programming. Data structures and algorithms are a programmer’s most important fundamental skills! If you have a good grasp of them, you will not have any trouble becoming proficient in a software technology, development tool, framework or API. That is what the most serious software companies rely on when hiring employees. Proof of this are job interviews at large companies like Google and Microsoft that rely exclusively on algorithmic thinking and knowledge of all basic data structures and algorithms.

The information below comes from Svetlin Nakov, the leading author of this book, who passed software engineering interviews at Microsoft and Google in 2007-2008 and shares his own experience.

Job Interviews at Google

100% of the questions at job interviews for software engineers at Google, Zurich, are about data structures, algorithms and algorithmic thinking. At such an interview you may have to implement on a white board a linked list (see the chapter "Linear Data Structures") or come up with an algorithm for filling a raster polygon (given in the form of a GIF image) with some sort of color (see Breadth-first search in the chapter "Trees and Graphs"). It seems like Google are interested in hiring people who can think algorithmically and who have a grasp of basic data structures and computer algorithms. Any technology that candidates would afterwards use in their line of work can be quickly learned. Needless to say, do not assume this book will give you all the knowledge and skills to pass a job interview at Google. The knowledge in the book is absolutely necessary minimum, but not completely sufficient. It only marks the first steps.

Job Interviews at Microsoft

A lot of questions at job interviews for software engineers at Microsoft, Dublin, focus on data structures, algorithms and algorithmic thinking. For example, you could be asked to reverse the words in a string (see the chapter "Strings and Text Processing" or to implement topological sorting in an undirected graph (see the chapter "Trees and Graphs"). Unlike Google, Microsoft asks a lot of engineering questions related to software architectures, multithreading, writing secure code, working with large amounts of data and software testing. This book is far from sufficient for applying at Microsoft, but the knowledge in it will surely be of use to you for the majority of questions.

About the LINQ Technology

The book includes a chapter on the popular .NET technology LINQ (Language Integrated Query), which allows execution of various queries (such as searching, sorting, summation and other group operations) on arrays, lists and other objects. It is placed towards the end on purpose, after the chapters on data structures and algorithms complexity. The reason for this is because the good programmer must know what happens when they sort a list or search in an array according to criteria and how many operations these actions take. If LINQ is used, it is not obvious how a given query works and how much time it takes. LINQ is a very powerful and widely-used technology, but it has to be mastered at a later stage (at the end of the book), after you are well familiar with the basics of programming, the main algorithms and data structures. Otherwise you risk learning how to write inefficient code without realizing how it works and how many operations it performs in the background.

Do You Really Want to Become a Programmer?

If you want to become a programmer, you have to be aware that true programmers are serious, persevering, thinking and questioning people who handle all kinds of problems. It is important for them to master quickly all modern or legacy platforms, technologies, libraries, APIs, programming tools, programming languages and development tools necessary for their job, and to sense programming as a part of their life.

Good programmers spend an extraordinary amount of time on advancing their engineering skills, on learning new technologies, new programming languages and paradigms, new ways to do their job, new platforms and new development tools every day. They are capable of logical thinking; reasoning on problems and coming up with algorithms for solving them; imagining solutions as a series of steps; modeling the surrounding world using technological means; implementing their ideas as programs or program components; testing their algorithms and programs; seeing issues; foreseeing the exceptional circumstances that can come about and handling them properly; listening to the advises of more experienced people; adapt their applications’ user interface to the user’s needs; adapting their algorithms to the capabilities of the machines and the environment they will be executed on and interact with.

Good programmers constantly read books, articles or blogs on programming and are interested in new technologies; they constantly enrich their knowledge and constantly improve the way they work and the quality of software they write. Some of them become obsessed to such an extent that they even forget to eat or sleep when confronted with a serious problem or simply inspired by some interesting lecture or presentation. If you have the tendency to get motivated to such an extent to do something (like playing video games incessantly), you can learn programming very quickly by getting into the mindset that programming is the most interesting thing on this world for you, at this period of your life.

Good programmers have one or more computers, an Internet connection and live in constant reach with technologies. They regularly visit websites and blogs related to new technologies, communicate everyday with their colleagues, visit technology lectures, seminars and other events, even if they have no use for them at the moment. They experiment with or research the new means and new ways for making a piece of software or a part of their work. They examine new libraries, learn new languages, try new frameworks and fiddle with new development tools. That way they develop their skills and maintain their level of awareness, competence and professionalism.

True programmers know that they can never master their profession to its full extent, because it constantly changes. They live with the firm belief that they have to learn their entire lives; they enjoy this and it satisfies them. True programmers are curious and questioning people that want to know how everything works – from a simple analog clock to a GPS system, Internet technology, programming languages, operation systems, compilers, computer graphics, games, hardware, artificial intelligence and everything else related to computers and technologies. The more they learn, the more knowledge and skills they crave after. Their life is tied to technologies and they change with them, enjoying the development of computer science, technologies and the software industry.

Everything we tell you about true programmers, we know firsthand. We are convinced that programmer is a profession that requires your full devotion and complete attention, in order to be a really good specialist – experienced, competent, informed, thinking, reasoning, knowing, capable and able to deal with non-standard situations. Anyone who takes up programming "among other things" is fated to being a mediocre programmer. Programming requires complete devotion for years. If you are ready for all of this, continue reading and take into account that the next few months you will spend on this book on programming are just a small start. And then you will learn for years until you turn programming into your profession. Once that happens you would still learn something every day and compete with technologies, so that you can maintain your level, until one day programming develops your thinking and skills enough, so that you may take up another profession, because few programmers reach retirement; but there is quite a lot of successful people who have begun their careers with programming.

Motivate Yourself to Become a Programmer or Find another Job!

If you still haven’t given up on becoming a good programmer and if you have already come to the understanding deep down that the next months and years will be tied every day to constant diligent work on mastering the secrets of programming, software development, computer science and software technologies, you may use an old technique for self-motivation and confident achievement of goals that can be found in many books and ancient teachings under one form or another. Keep imagining that you are programmers and that you have succeeded in becoming ones; you engage every day in programming; it is your profession; you can write all the software in the world (provided you have enough time); you can solve any problem that experienced programmers can solve. Keep thinking constantly and incessantly of your goal. Keep telling yourself, sometimes even out loud: "I want to become a good programmer and I have to work hard for this, I have to read a lot and learnt a lot, I have to solve a lot of problems, every day, constantly and diligently". Put programming books everywhere around you, even stick a sign that says "I’ll become a good programmer" over your bed, so that you can see it every evening when you go to bed and every morning when you wake up. Program every day (no exceptions!), solve problems, have fun, learn new technologies, experiment; try writing a game, making a website, writing a compiler, a database and hundreds of other programs you may come up with original ideas for. In order to become good programmers, program every day and think about programming every day and keep imagining the future moment when you are an excellent programmer. You can, as long as you deeply believe that you can! Everybody can, as long as they believe that they can and pursue their goals constantly without giving up. No-one would motivate you better than yourselves. Everything depends on you and this book is your first step.

clip_image001[5]

A great way to really learn programming is to program every day for a year. If you program every day (without exception) and you do it for a long time (e.g. year or two) there is no way to not become a programmer. Anyone who practices programming every day for years will become good someday. This is valid for any other skill: if you want to learn it, just practice every day for a long time.

A Look at the Book’s Contents

Now let’s take a glance at what we are about to encounter in the next chapters of the book. We will give an account of each of them with a few sentences, so that you can know what you are about to learn.

Chapter 0: Preface

The preface (the current chapter) introduces the readers to the book, its content, what shall the reader learn and what shall not learn, how to read the book, why we use the C# language, why we focus on data structures and algorithms, etc. The preface also describes the history of the book, the content of its chapter one by one, the team of authors, editors and translators from Bulgarian to English. In contains the full reviews written by famous software engineers from Microsoft, Google, SAP, VMware, Telerik and other leading software companies from all over the world.

Author of the preface is Svetlin Nakov (with little contribution from Veselin Kolev and Mihail Stoynov). Translation to English: by Ivan Nenchovski (edited by Mihail Stoynov, Veselina Raykova, Yoan Krumov and Hristo Radkov).

Chapter 1: Introduction to Programming

In the chapter "Introduction to Programming" we will take a look at the basic terminology in programming and write our first program. We will familiarize ourselves with what programming is and what connection to computers and programming languages it has. We will briefly review the main stages in software development, introduce the C# language, the .NET platform and the different Microsoft technologies used in software development. We will examine what auxiliary tools we need to program in C# and use the C# language to write our first computer program, compile it and run it using the command line, as well as Microsoft Visual Studio integrated development environment. We will familiarize ourselves with the MSDN Library – the documentation for the .NET Framework, which will help us in our study of the language’s capabilities.

Author of the chapter is Pavel Donchev; editors are Teodor Bozhikov and Svetlin Nakov. The contents of the chapter are somewhat based on the work of Luchesar Cekov from the book "Introduction to Programming with Java". Translation to English: by Atanas Valchev (edited by Vladimir Tsenev and Hristo Radkov).

Chapter 2: Primitive Types and Variables

In the chapter "Primitive Types and Variables" we will examine primitive types and variables in C# – what they are and how to work with them. First we will focus on the data types – integer types, real floating-point types, Boolean, character types, strings and object types. We will continue with variables, what they and their characteristics are, how to declare them, how they are assigned a value and what variable initialization is. We will familiarize ourselves with the main categories of data types in C# – value and reference types. Finally, we will focus on literals, what they are and what kinds of literals there are.

Authors of the chapter are Veselin Georgiev and Svetlin Nakov; editor is Nikolay Vasilev. The contents of the entire chapter are based on the work of Hristo Todorov and Svetlin Nakov from the book "Introduction to Programming with Java". Translation to English: by Lora Borisova (edited by Angel Angelov and Hristo Radkov).

Chapter 3: Operators and Expressions

In the chapter "Operators and Expressions" we will familiarize ourselves with the operators in C# and the operations they perform on the various data types. We will clarify the priorities of operators and familiarize ourselves with the types of operators, according to the count of the arguments they take and the operations they perform. Then, we will examine typecasting, why it is necessary and how to work with it. Finally, we will describe and illustrate expressions and how they are utilized.

Authors of the chapter are Dilyan Dimitrov and Svetlin Nakov; editor is Marin Georgiev. The contents of the entire chapter are based on the work of Lachezar Bozhkov from the book "Introduction to Programming with Java". Translation to English: by Angel Angelov (edited by Martin Yankov and Hristo Radkov).

Chapter 4: Console Input and Output

In the chapter "Console Input and Output" we will get familiar with the console as a means for data input and output. We will explain what it is, when and how it is used, what the concepts of most programming languages for accessing the console are. We will familiarize ourselves with some of the features in C# for user interaction and will examine the main streams for input-output operations Console.In, Console.Out and Console.Error, the class Console and the utilization of format strings for printing data in various formats. We will see how to convert text into a number (parsing), since this is the way to enter numbers in C#.

Author of the chapter is Iliyan Murdanliev and editor is Svetlin Nakov. The contents of the entire chapter are largely based on the work of Boris Valkov from the book "Introduction to Programming with Java". Translation to English: by Lora Borisova (edited by Dyanko Petkov).

Chapter 5: Conditional Statements

In the chapter "Conditional Statements" we will cover the conditional statements in C#, which we can use to execute different actions depending on some condition. We will explain the syntax of the conditional operators: if and if-else with suitable examples and explain the practical applications of the selection control operator switch. We will focus on the best practices that must be followed, in order to achieve a better style of programming when utilizing nested or other types of conditional statements.

Author of the chapter is Svetlin Nakov and editor is Marin Georgiev. The contents of the entire chapter are based on the work of Marin Georgiev from the book "Introduction to Programming with Java". Translation to English: by George Vaklinov (edited by Momchil Rogelov).

Chapter 6: Loops

In the chapter "Loops" we will examine the loop mechanisms, through which we can execute a snippet of code repeatedly. We will discuss how conditional repetitions (while and do-while loops) are implemented and how to work with for loops. We will give examples of the various means for defining a loop, the way they are of constructed and some of their key applications. Finally, we will see how we can use multiple loops within each other (nested loops).

Author of the chapter is Stanislav Zlatinov and editor is Svetlin Nakov. The contents of the entire chapter are based on the work of Rumyana Topalska from the book "Introduction to Programming with Java". Translation to English: by Angel Angelov (edited by Lora Borisova).

Chapter 7: Arrays

In the chapter "Arrays" we will familiarize ourselves with arrays as a means for working with a sequence of elements of the same type. We will explain what they are, how we can declare, create and instantiate arrays and how to provide access to their elements. We will examine one-dimensional and multidimensional arrays. We will learn the various ways for iterating through an array, reading from the standard input and writing to the standard output. We will give many exercises as examples, which can be solved using arrays and show you how useful they are.

Author of the chapter is Hristo Germanov and editor is Radoslav Todorov. The content of the chapter is based on the work of Mariyan Nenchev from the book "Introduction to Programming with Java". Translation to English: by Boyan Dimitrov (edited by Radoslav Todorov and Zhelyazko Dimitrov).

Chapter 8: Numeral Systems

In the chapter "Numeral Systems" we will take a look at the means for working with various numeral systems and the representation of numbers in them. We will pay special attention to the way numbers are represented in decimal, binary and hexadecimal numeral systems, because they are widely used in computers, communications and programming. We will also explain the methods for encoding numeral data in a computer and the types of encodings, namely signed magnitude, one’s complement, two’s complement and binary-coded decimals.

Author of the chapter is Teodor Bozhikov and editor is Mihail Stoynov. The contents of the entire chapter are based on the work of Petar Velev and Svetlin Nakov from the book "Introduction to Programming with Java". Translation to English: by Atanas Valchev (edited by Veselina Raykova).

Chapter 9: Methods

In the chapter "Methods" we will get to know in details the subroutines in programming, which are called methods in C#. We will explain when and why methods are used; will show how methods are declared and what a method signature is. We will learn how to create a custom method and how to use (invoke) it subsequently, and will demonstrate how we can use parameters in methods and how to return a result from a method. Finally, we will discuss some established practices when working with methods. All of this will be backed up with examples explained in details and with extra exercises.

Author of the chapter is Yordan Pavlov; editors are Radoslav Todorov and Nikolay Vasilev. The contents of the entire chapter are based on the work of Nikolay Vasilev from the book "Introduction to Programming with Java". Translation to English: by Ivaylo Dyankov (edited by Vladimir Amiorkov and Franz Fischbach).

Chapter 10: Recursion

In the chapter "Recursion" we will familiarize ourselves with recursion and its applications. Recursion is a powerful programming technique where a method invokes itself. By means of recursion we can solve complicated combinatorial problems where we can easily exhaust different combinatorial configurations. We will demonstrate many examples of correct and incorrect recursion usage and we will convince you how useful it can be.

Author of the chapter is Radoslav Ivanov and editor is Svetlin Nakov. The contents of the entire chapter are based on the work of Radoslav Ivanov and Svetlin Nakov from the book "Introduction to Programming with Java". Translation to English: by Vasya Stankova (edited by Yoan Krumov).

Chapter 11: Creating and Using Objects

In the chapter "Creating and Using Objects" we will get to know the basic concepts of object-oriented programming – classes and objects – and we will explain how to use classes from the standard libraries of the .NET Framework. We will focus on some commonly used system classes and will show how to create and use their instances (objects). We will discuss how to access properties of an object, how to call constructors and how to work with static fields in classes. Finally, we will focus on the term "namespaces" – how they help us, how to include and use them.

Author of the chapter is Teodor Stoev and editor is Stefan Staev. The contents of the entire chapter are based on the work of Teodor Stoev and Stefan Staev from the book "Introduction to Programming with Java". Translation to English: by Vasya Stankova (edited by Todor Mitev).

Chapter 12: Exception Handling

In the chapter "Exception Handling" we will get to know exceptions in object-oriented programming and in C# in particular. We will learn how to catch exceptions using the try-catch clause, how to pass them to the calling methods and how to throw standard, custom or caught exceptions using the throw statement. We will give a number of examples of their utilization and will look at the types of exceptions and the exceptions hierarchy they form in the .NET Framework. Finally, we will look at the advantages of using exceptions and how to apply them in specific situations.

Author of the chapter is Mihail Stoynov and editor is Radoslav Kirilov. The contents of the entire chapter are based on the work of Luchesar Cekov, Mihail Stoynov and Svetlin Nakov from the book "Introduction to Programming with Java". Translation to English: by Dimitar Bonev and George Todorov (edited by Doroteya Agayna).

Chapter 13: Strings and Text Processing

In the chapter "Strings and Text Processing" we will familiarize ourselves with strings: how they are implemented in C# and how we can process text content. We will go through different methods for manipulating text; and learn how to extract substrings according to passed parameters, how to search for keywords as well as how to split a string by separator characters. We will provide useful information on regular expressions and we will learn how to extract data matching a specific pattern. Finally, we will take a look at the methods and classes for achieving more elegant and strict formatting of text content on the console, with various ways for printing numbers and dates.

Author of the chapter is Veselin Georgiev and editor is Radoslav Todorov. The contents of the entire chapter are based on the work of Mario Peshev from the book "Introduction to Programming with Java". Translation to English: by Vesselin Georgiev (edited by Todor Mitev and Vladimir Amiorkov).

Chapter 14: Defining Classes

In the chapter "Defining Classes" we will show how we can define custom classes and what the elements of a class are. We will learn to declare fields, constructors and properties in classes and will again recall what a method is but will broaden our knowledge on methods and their access modifiers. We will focus on the characteristics of constructors and we will explain in details how program objects exist in the heap (dynamic memory) and how their fields are initialized. Finally, will explain what class static elements – fields (including constants), properties and methods – are and how to utilize them. In this chapter we will also introduce generic types (generics), enumerated types (enumerations) and nested classes.

Authors of the chapter are Nikolay Vasilev, Svetlin Nakov, Mira Bivas and Pavlina Hadjieva. The contents of the entire chapter are based on the work of Nikolay Vasilev from the book "Introduction to Programming with Java". Translation to English: by Radoslav Todorov, Yoan Krumov, Teodor Rusev and Stanislav Vladimirov (edited by Vladimir Amiorkov, Pavel Benov and Nencho Nenchev). This is the largest chapter in the book, so lots of contributors worked on it to prepare it to a high quality standard for you.

Chapter 15: Text Files

In the chapter "Text Files", we will familiarize ourselves with working with text files in the .NET Framework. We will explain what a stream is, what its purpose is and how it is used. We will describe what a text file is and how to read and write data in text files and will present and elaborate on the best practices for catching and handling exceptions when working with text files. Naturally, we will visualize and demonstrate in practice all of this with a lot of examples.

Author of the chapter is Radoslav Kirilov and editor is Stanislav Zlatinov. The contents of the entire chapter are based on the work of Danail Alexiev from the book "Introduction to Programming with Java". Translation to English: by Nikolay Angelov (edited by Martin Gebov).

Chapter 16: Linear Data Structures

In the chapter "Linear Data Structures" we will familiarize ourselves with some of the basic representations of data in programming and with linear data structures, because very often, in order to solve a given problem, we need to work with a sequence of elements. For example, to read this book we have to read consecutively every single page, e.g. we have to traverse consecutively every single element of its set of pages. We are going to see how for a specific problem some data structure is more efficient and convenient than another. Then we will examine the linear structures "list", "stack" and "queue" and their applications and will get to know in details some implementations of these structures.

Author of the chapter is Tsvyatko Konov and editors are Dilyan Dimitrov and Svetlin Nakov. The contents of the entire chapter are largely based on the work of Tsvyatko Konov and Svetlin Nakov from the book "Introduction to Programming with Java". Translation to English: by Vasya Stankova (edited by Ivaylo Gergov).

Chapter 17: Trees and Graphs

In the chapter "Trees and Graphs" we will look at the so called tree-like data structures, which are trees and graphs. Knowing the properties of these structures is important for modern programming. Every one of these structures is used for modeling real-life problems that can be efficiently solved with their help. We will examine in details what tree-like data structures are and show their primary advantages and disadvantages. Also we will provide sample implementations and exercises demonstrating their practical utiliza­tion. Further we will scrutinize binary trees, binary search trees and balanced trees and then examine the data structure "graph", the types of graphs and their usage. We will also show which parts of the .NET Framework make use of binary search trees.

Author of the chapter is Veselin Kolev and editors are Iliyan Murdanliev and Svetlin Nakov. The contents of the entire chapter are based on the work of Veselin Kolev from the book "Introduction to Programming with Java". Translation to English: by Kristian Dimitrov and Todor Mitev (edited by Nedjaty Mehmed and Dyanko Petkov).

Chapter 18: Dictionaries, Hash Tables and Sets

In the chapter "Dictionaries, Hash Tables and Sets" we will analyze more complex data structures like dictionaries and sets, and their implementa­tions with hash tables and balanced trees. We will explain in details what hashing and hash tables mean, and why they are such important parts of programming. We will discuss the concept of "collisions" and how they can occur when implementing hash tables. We will also suggest various approaches for solving them. We will look at the abstract data structure "set" and explain how it can be implemented with a dictionary or a balanced tree. We will provide examples that illustrate the applications of these data structures in everyday practice.

Author of the chapter is Mihail Valkov and editors are Tsvyatko Konov and Svetlin Nakov. The contents of the entire chapter are partially based on the work of Vladimir Tsanev (Tsachev) from the book "Introduction to Programming with Java". Translation to English: by George Mitev and George K. Georgiev (edited by martin Gebov and Ivaylo Dyankov).

Chapter 19: Data Structures and Algorithm Complexity

In the chapter "Data Structures and Algorithm Complexity" we will compare the data structures we have learned so far based on their performance for basic operations (addition, searching, deletion, etc.) We will give recommendations for the most appropriate data structures in certain cases. We will explain when it is preferable to use a hash table, an array, a dynamic array, a set implemented by a hash table or a balanced tree. There is an implementation in the .NET Framework for every one of these structures. We only have to learn how to decide when to use a particular data structure, so that we can write efficient and reliable source code.

Authors of the chapter are Nikolay Nedyalkov and Svetlin Nakov; editor is Veselin Kolev. The contents of the entire chapter are based on the work of Svetlin Nakov and Nikolay Nedyalkov from the book "Introduction to Programming with Java". Translation to English: by George Halachev and Tihomir Iliev (edited by Martin Yankov).

Chapter 20: Object-Oriented Programming Principles

In the chapter "Object-Oriented Programming Principles", we will familiarize ourselves with the principles of object-oriented programming (OOP): class inheritance, interfaces implementation, data and behavior abstraction, data encapsulation and hiding implementation details, polymorphism and virtual methods. We will explain in details the principles of cohesion and coupling. We will also briefly outline object-oriented modeling and object model creation based on a specific business problem and will get to know UML and its role in object oriented modeling. Finally, we will briefly discuss design patterns and provide examples for design patterns commonly used in practice.

Author of the chapter is Mihail Stoynov and editor is Mihail Valkov. The contents of the entire chapter are based on the work of Mihail Stoynov from the book "Introduction to Programming with Java". Translation to English: by Vasya Stankova and Momchil Rogelov (edited by Ivan Nenchovski).

Chapter 21: High-Quality Programming Code

In the chapter "High-Quality Programming Code" we will take a look at the basic rules for writing high-quality programming code. We will focus on naming conventions for program elements (variables, methods, classes and others), formatting and code layout guidelines, best practices for creating high-quality classes and methods, and the principles of high-quality code documentation. Many examples of high-quality and low-quality code will be given. In the course of work it will be explained how to use an integrated development environment, in order to automate some operations like formatting and refactoring existing code, when it is necessary. Unit testing as an industrial method to automated testing will also be discussed.

Authors of the chapter are Mihail Stoynov and Svetlin Nakov. Editor is Pavel Donchev. The contents of the entire chapter are partially based on the work of Mihail Stoynov, Svetlin Nakov and Nikolay Vasilev from the book "Introduction to Programming with Java". Translation to English: by Blagovest Buyukliev (edited by Dyanko Petkov, Mihail Stoynov and Martin Yankov).

Chapter 22: Lambda Expressions and LINQ

In the chapter "Lambda Expressions and LINQ" we will introduce some of the more sophisticated capabilities of C#. To be more specific, we will pay special attention to clarifying how to make queries to collections using lambda expressions and LINQ. We will explain how to add functionality to already created classes, using extension methods. We will familiarize ourselves with anonymous types and briefly describe their nature and usage. We will also discuss lambda expressions and show in practice how most of the built-in lambda functions work. Afterwards we will dive into the LINQ’s syntax, which is part of C#. We will learn what it is, how it works, and what queries we can make using it. Finally, we will discuss the keywords in LINQ, their meaning and we will demonstrate their capabilities with a lot of examples.

Author of the chapter is Nikolay Kostov and editor is Veselin Kolev. Translation to English: by Nikolay Kostov (edited by Zhasmina Stoyanova and Mihail Stoynov).

Chapter 23: Methodology of Problem Solving

In the chapter "Methodology of Problem Solving" we will discuss an advisable approach for solving programming problems and we will illustrate it with concrete examples. We will discuss the engineering principles we should follow when solving problems (that largely apply to problems in math, physics and other disciplines) and we will show them in action. We will describe the steps we must go through while we solve a few sample problems and demonstrate the mistakes that can be made, if we do not follow these steps. We will consider some important steps of problem solving (such as testing) that are usually skipped.

Author of the chapter is Svetlin Nakov and editor is Veselin Georgiev. The contents of the whole chapter are entirely based on the work of Svetlin Nakov from the book "Introduction to Programming with Java". Translation to English: by Ventsi Shterev and Martin Radev (edited by Tihomir Iliev and Nedjaty Mehmed).

Chapters 24, 25, 26: Sample Programming Exam

In the chapters "Sample Programming Exam (Topic #1, Topic #2 and Topic #3)" we will look at the problem descriptions of nine sample problems from three sample programming exams and we will propose solutions to them. In the course of solving them we will put into practice the methodology described in the chapter "Methodology of Problem Solving".

Authors of the chapters are Stefan Staev, Yosif Yosifov and Svetlin Nakov respectively; their respective editors are Radoslav Todorov, Radoslav Ivanov and Teodor Stoev. The contents of these chapters are largely based on the work of Stefan Staev, Svetlin Nakov, Radoslav Ivanov and Teodor Stoev from the book "Introduction to Programming with Java". Translation to English: by Stanislav Vladimirov, Ivaylo Gergov, Ivan Nenchovski and Ivaylo Gergov (edited by Dyanko Petkov, Vladimir Tsenev and Veselina Raykova).

Chapters 28: Conclusion

In the conclusion we give further instruction how to proceed with your development as a skillful software engineer after this book. We explain the free courses at Telerik Software Academy – the largest training center for software development professionals in Bulgaria – how to apply, what shall you learn, how to choose a career path and we mention few other resources.

Author of the chapter is Svetlin Nakov (with some aid by Ivan Nenchovski). Translation to English: by Ivan Nenchovski (edited by Svetlin Nakov).

History: How Did This Book Come to Be?

Often in our teaching practice students ask us from which book to start learning how to program. There are enthusiastic young people who want to learn programming, but don’t know where to begin from. Unfortunately, it’s hard to recommend a good book. We can come up with many books concerning C#, but none of them teaches programming. Indeed there aren’t many books that teach the concepts of computer programming, algorithmic thinking and data structures. Certainly, there are books for beginners that teach the C# programming language, but those rarely cover the fundamentals of program­ming. There are some good books on programming, but most of them are now outdated and teach languages and technologies that have become obsolete in the process of evolution. There are several such books regarding C and Pascal, but not C# or Java. Considering all aspects, it is hard to come up with a good book which we could highly recommend to anyone who wants to pick up programming from scratch.

At one point the lack of good books on programming for beginners drove the project leader, Svetlin Nakov, to gather a panel of authors set to finally write such a book. We decided we could help many young people to take up programming seriously by sharing our knowledge and inspiring them.

The Origins of This Book

This book is actually an adaptation to C# of the free Bulgarian book “Introduction to Programming with Java”, with some additional content added, many bug fixes and small improvements, translated later into English.

Svetlin Nakov teaches computer programing, data structures, algorithms and software technologies since 2000. He is an author and co-author of several courses in fundamentals of programming taught in Sofia University (the most prestigious Bulgarian university at this time). Nakov (with colleagues) teaches programming and software development in the Faculty of Mathematics and Informatics (FMI) in Sofia University for few years and later creates his own company for training software engineers. In 2005 he gathers and leads a team of volunteers who creates a solid curriculum on fundamentals of programming and data structures (in C#) with presentation slides and many examples, demonstrations and homework assignments. These teaching materials are the first very early outline of the content in this book. Later this curriculum evolves and is translated to Java and serves as a base for the Java version of this book. Later the Java book is translated to C# and after its great success in Bulgaria (thousands paper copies sold and 50,000 downloads) it is translated from Bulgarian to English.

The Java Programming Fundamentals Book

In mid-2008 Svetlin Nakov is inspired to create a book on Java programming, covering his “Introduction to Programming” course in the National Academy for Software Development (a private training center in Bulgaria, founded by Svetlin Nakov). He and a group of authors outline the work that needs to be done and the subjects that need to be covered and work begins, with everyone working voluntarily, without any direct profit. Through delays, pitfalls and improvements, the Java book finally comes out in January of 2009. It is available both on its website www.introprogramming.info for free, and in a paper edition.

The C# Programming Fundamentals Book

The interest towards the “Introduction to Programming with Java” book is huge (for Bulgaria). In late 2009 the project to “translate” the book to C# begins, under the title “Introduction to Programming with C#”. Again, a large number of authors, both new and from the Java book group, gather and begin working. The task seems easier, but turns out to be time-consuming. About half a year later, the “preview” edition of the book is completed – with some mistakes and incorrect content. Another year passes as all of the text and examples are improved, and new content is added. In the summer of 2011 the C# book is released. Its official website stays the same as the Java book (www.introprogramming.info). A paper version of the book is also released and sold, with a price covering only the expenses on its printing.

Both books are open-source and their repositories are available at Google Code: code.google.com/p/introcsharpbook, code.google.com/p/introjavabook.

The Translation of the C# Book: Bulgarian to English

In late 2011, following the great success of “Introduction to Programming with C#”, a project to translate the book to English started. Large group of volunteers began work on the translation – each of them with good programming skills. The book you are reading is the result of the successful translation, review and completion of the original C# Bulgarian book. The most effort in the translation was given by the leading author Svetlin Nakov.

Some of the authors have ideas to make yet another adaptation of the book – this time for C++. As of now, these ideas are still foggy. We hope they will one day become a reality, but we aren’t promising anything yet.

Bulgaria? Bulgarian Authors? Is This True?

Bulgaria is a country in Europe, part of the European Union, just like Germany and France. Did you know this? Bulgaria has very solid traditions in computer programming and technologies.

The main inventor of the technology behind the modern digital computers is the famous computer engineer John Atanasoff and he is 50% Bulgarian (see en.wikipedia.org/wiki/John_Vincent_Atanasoff).

Bulgaria is the founder of the International Olympiad in Informatics (IOI). The first IOI was organized and held in 1980 in Pravetz, Bulgaria (see en.wikipedia.org/wiki/International_Olympiad_in_Informatics).

In 2011 Bulgaria was ranked #3 in the world by Internet speed (see http://mashable.com/2011/09/21/fastest-download-speeds-infographic).

The world’s leading component vendor for the Microsoft ecosystem is a Bulgarian company called Telerik (softuni.bg) and almost all of its products are developed in Bulgaria. The world’s leading software product for 3D rendering (V-Ray), used in most Hollywood movies and by most automotive producers, is invented and developed in Bulgaria by another Bulgarian company – Chaos Group (www.chaosgroup.com). A Bulgarian company Datecs designed and produces the barcode scanner with credit card swipe for Apple iPhone / iPad / iPod devices used in all Apple stores. Large international software companies like SAP, VMware, HP, Cisco, Siemens and CSC have large development centers in Sofia with thousands developers.

Bulgarian software engineers can be found in every major software company in the software industry like Microsoft, Google, Oracle, SAP, Facebook, Apple, IBM, Cisco, Siemens, VMware, HP, Adobe, Nokia, Ericsson, Autodesk, etc.

We, the authors, editors and translators of this book are all proud Bulgarian software developers – some living in Bulgaria, others abroad. We are happy to be a part of the global software industry and to help the beginners over the world to learn computer programming and become skillful software engineers. We are supporters of the culture of free education (like Coursera, edX, Udacity and Khan Academy), a free education for everyone and everywhere. We are happy to share our knowledge, skills and expertise and sharing is part of our culture.

Authors and Contributors

This book is made by volunteer developers from Bulgaria who want to share their knowledge and skills about computer programming. They have worked for months (some for years) for free to help the community to learn programming, data structures and algorithms in easy and efficient way: through this book and the presentations and video tutorials coming with it.

Over 70 people contributed to the project: authors, editors, translators, etc.

The Panel of Authors

The panel of authors of both the old, the new and the translated to English book, is indeed the main perpetrator for this book’s existence. Writing content of this size and quality is a serious task demanding a lot of time.

The idea of so many authors’ participation has been well tested, since a few other books have already been written in similar manner (e.g. "Programming for the .NET Framework" – parts 1 and 2). Although all chapters from the book are written by different authors, they adhere to the same style and possess the same high quality of content (even though it might differ a little in some chapters). The text is well structured, has many titles and subtitles, contains many appropriate examples, follows a good manner of expression and is uniformly formatted.

The team that wrote this book is made up of people who are strongly interested in programming and would like to voluntarily share their knowledge by participating in writing one or more of the chapters. The best part is that all authors, co-authors and editors in the team working on the book are working programmers with hands-on experience, which means that the reader will receive knowledge, a collection of best practices and advices by people with an active career in the software industry.

The participants in the project made their contribution voluntarily, without material or any other direct compensation, because they supported the idea of writing a good book in for novice programmers and because they strongly wanted to help their future colleagues enter into programming quickly.

What follows is a brief presentation of the authors of the book "Introduction to Programming with C#" (in alphabetical order). The original authors of the corresponding chapters from the book "Introduction to Programming with Java" are mentioned accordingly, since their contributions to some chapters are greater than those authors who adapted the text and examples to C# afterwards.

Dilyan Dimitrov

Dilyan Dimitrov is a certified software developer with professional experience in building mid-size and large web-based systems with the .NET Framework. His interests include development of both web and desktop applications using Microsoft’s latest technologies. He graduated in "Informatics" at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski". He can be reached at [email protected] or you can visit his personal blog at http://dilyandimitrov.blogspot.com.

Hristo Germanov

Hristo Germanov is a software engineer, whose interests are related mainly to .NET technologies. Architecture and design of web based systems, algorithms and modern standards for quality code are also his passion. He has participated in developing both small and large web-based and desktop-based applications. He likes challenging problems and projects that require strong logical thinking. He graduated in "Computer Networks" at the Omega College in Plovdiv and specialized as a "Core .NET Developer" at the National Academy for Software Development in Sofia.

You can contact him by e-mail at: [email protected].

Iliyan Murdanliev

Iliyan Murdanliev is a software developer at NearSoft (www.nearsoft.eu). He currently pursues a master’s degree in "Computer Technologies and Applied Programming" at the Technical University of Sofia. He has a bachelor’s degree in "Applied Mathematics" from the same university. He has graduated at an English-speaking foreign language high school.

Iliyan has participated in significant projects and in the development of front-end visualization, as well as back-end logic. He has prepared and conducted trainings in C# and other programming languages and technologies. Iliyan’s interests lie in the field of cutting-edge technologies in .NET, Windows Forms and Web-based technologies, design patterns, algorithms and software engineering. He likes out-of-the-box projects that require not only knowledge, but logical thinking as well.

His personal blog is available at: http://imurdanliev.wordpress.com. He can be reached by e-mail: [email protected].

Mihail Stoynov

Mihail Stoynov has a master’s degree in "Economics and Management" at the Sofia University "St. Kliment Ohridski". He has obtained his bachelor’s degree in "Informatics" also at the Sofia University.

Mihail is a professional software developer, consultant and instructor with many years of experience. For the last few years he is an honorary instructor at the Faculty of Mathematics and Informatics and has read lectures in the "Networks Theory", "Programming for the .NET Framework", "Java Web Applications Development", "Design Patterns" and "High Quality Programming Code" courses. He has also been an instructor at the New Bulgarian University.

He is an author of a number of articles and publications and a lecturer at many conferences and seminars in the field of software technologies and information security. Mihail is a co-author of the books "Programming for the .NET Framework" and "Introduction to Programming with Java". He has participated in Microsoft’s MSDN Academic Alliance and is a lecturer at the Microsoft Academic Days.

Mihail has lead IT courses in Bulgaria and abroad. He was a lecturer in the "Java", "Java EE", "SOA" and "Spring Framework" courses at the National Academy for Software Development.

Mihail has worked at the international offices of Siemens, HP and EDS in the Netherlands and Germany, where he has gained a lot of experience in the art of software, as well as the quality programming, by taking part in the development of large software projects. His interests encompass software architectures and design development, B2B integration of various information systems, business processes optimization and software systems mainly for the Java and .NET platforms. Mihail has participated in tens of software projects and has extensive experience with web applications and services, distributed systems, relational databases and ORM technologies, as well as management of projects and software development teams.

His personal blog is available at: http://mihail.stoynov.com. His twitter account is available at: https://twitter.com/mihailstoynov.

Mihail Valkov

Mihail Valkov is a software developer since 2000. Throughout the years he has faced numerous technologies and software development platforms, some of which are MS .NET, ASP, Delphi. Mihail has been developing software at Telerik (softuni.bg) ever since 2004. There he co-develops a number of components targeting ASP.NET, Windows Forms, Silverlight and WPF. In the last few years Mihail has been leading few of the best progressing teams in the company, and currently develops an online Word-like rich text editor.

He can be reached at: [email protected].

His blog is at: http://blogs.telerik.com/mihailvalkov/. His twitter account is available at: https://twitter.com/mvalkov.

Mira Bivas

Mira Bivas is an enthusiastic young programmer at one of Telerik’s ASP.NET teams (softuni.bg). She is a student at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski", where she majors in "Applied Mathematics". Mira has completed the "Intro C#" and "Core .NET" courses at the National Academy for Software Development (NASD).

She can be reached by e-mail: [email protected].

Nikolay Kostov

Nikolay Kostov works as a senior software developer and trainer at Telerik’s "Technical Training" department (https://softuni.bg). He is involved deeply with Telerik Academy’s trainings and the courses organized by Telerik. He currently majors in "Computer Science" at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski".

Nikolay has been participated in a number of high school and college student Olympiads and contests in computer science, throughout many years. He is a two-time champion in the project categories "Desktop Applications" and "Web Applications" at the Bulgarian National Olympiad in Information Technologies (NOIT). He has rich experience in designing and developing Web applications, algorithmic programming and processing large amounts of data.

His main interests lie in developing software applications, data structures, everything related to .NET technologies, web applications security, data processing automation, web crawlers, single page applications and others.

Nikolay’s personal blog can be found at: http://nikolay.it.

Nikolay Nedyalkov

Nikolay Nedyalkov is the chairman of The Association for Information Security, technical director of the eBG.bg’s electronic payments and services portal and business consultant at other companies. Nikolay is a professional software developer, consultant and instructor with many years of experience. He has authored a number of articles and publications and has lectured at many conferences and seminars in the field of software technologies and infor­ma­tion security. His experience as an instructor ranges from assisting in "Data Structures in Programming", "Object-oriented Programming with C++" and "Visual C++" to lecturing at the "Network Security", "Secure Code", "Web Development with Java", "Creating High Quality Code", "Programming for the .NET platform" and "Applications Development with Java" courses. Nikolay’s interests are focused on creating and managing information and communications solutions, modeling and managing business processes in large-size organizations and state administration. Nikolay has a bachelor’s and a master’s degree from the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski". As a high school student he was a programming contestant throughout many years and received a number of accolades.

His personal website is located at: http://www.nedyalkov.com.

Nikolay Vasilev

Nikolay Vasilev is a professional software developer, an instructor and a participant in many open source projects.

He holds a master’s degree in "Software Engineering and Artificial Intelligence" from University of Malaga (Spain) and is currently pursuing a master’s degree in "Mathematical Physics Equations and Their Applications" at University of Sofia (Bulgaria). He obtained his bachelor’s degree in "Mathematics and Informatics" from University of Sofia.

In the period 2002-2005 he was instructor in the classes of "Introduction in Programming with Java" and "Data Structures and Programming with Java" at University of Sofia.

Nikolay is a co-author of the books "Introduction in Programming with Java" and "Introduction in Programming with C#" and also one of the initiators, organizers and co-authors of a project for creating an open source book in Bulgarian, dedicated on the classical (GoF) design patterns in the software engineering. He is one of the organizers and lecturers of the "Bulgarian Java User Group".

Nikolay is a certified software developer with nearly 10 years of expertise in development of Java enterprise applications, gained in international companies. He participated in large-size systems development from various domains like e-commerce, banking, visual simulators for nuclear plant sub-systems, VOD systems, etc.; using cutting-edge technologies and applying the best up-to-date design and development methodologies and practices. His interests span across various areas such as software engineering and artificial intelligence, fluid mechanics, project management and scientific research.

Nikolay Vasilev’s personal blog is available at http://blog.nvasilev.com.

Pavel Donchev

Pavel Donchev is a programmer at Telerik (softuni.bg), where he develops web applications mostly for the company internal purposes. He takes extramural courses in "Theoretical Physics" at the Sofia University "St. Kliment Ohridski". He was engaged in developing Desktop and Web Applications for various business sectors – mortgage credits, online stores, automation and Web UML diagrams. His interests lie mainly in the sphere of process automation using Microsoft technologies.

His personal blog is located at: http://donchevp.blogspot.com.

Pavlina Hadjieva

Pavlina Hadjieva is a senior enterprise support officer and team lead at Telerik (softuni.bg). She currently pursues a master’s degree in "Distributed Systems and Mobile Technologies" at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski". She obtained her bachelor’s degree in "Chemistry and Computer Science" also at the University of Sofia.

Her professional interests are oriented towards web technologies, in particular ASP.NET, as well as the complete development cycle of .NET Framework applications.

You can contact Pavlina Hadjieva by e-mail: [email protected].

Radoslav Ivanov

Radoslav Ivanov is experienced software engineer, consultant and trainer with several years of professional experience in wide range of technologies and programming languages. He has solid practical and theoretical background in computer science and excellent writing and lecturing skills.

Radoslav has a bachelor’s degree in "Informatics" and master’s degrees in "Software Engineering" and "E-learning" at the Sofia University "St. Kliment Ohridski". For several years he is an honorary instructor at the Faculty of Mathematics and Informatics where he was teaching in courses for "Design Patterns in C#", "Programming for the .NET Framework", "Java Web Applications Development" and "Java EE Development".

He is a co-author of the books "Programming for the .NET Framework" and "Introduction to Programming with Java".

His professional interests include data warehousing, security, cloud computing, Java technologies, the .NET platform, software architecture and design and project management.

Radoslav’s twitter account is available at: https://twitter.com/radoslavi.

Radoslav Kirilov

Radoslav Kirilov is a senior software developer and team leader at Telerik (softuni.bg). He graduated in "Computer Systems and Technologies" at the Technical University of Sofia. His professional interests are oriented towards web technologies, particularly ASP.NET, and the complete development cycle of .NET Framework-based applications. Radoslav is an experienced lecturer who has taken part in putting through, as well as creating study materials (presentations, examples, exercises) for the National Academy for Software Development (NASD). Radoslav is a member of the instructors' team of the "High Quality Programming Code" course that started in 2010 at the Technical University of Sofia and at Sofia University "St. Kliment Ohridski".

He maintains a tech blog since 2009 located at: radoslavkirilov.blogspot.com. You can contact Radoslav by e-mail at: [email protected].

Radoslav Todorov

Radoslav Todorov is a software developer who obtained his bachelor’s degree at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski" (www.fmi.uni-sofia.bg). He graduated his master’s degree in the field of computer science at the Technical University of Denmark in Lyngby, Denmark (http://www.dtu.dk).

Radoslav holds courses as an instructor-assistant at the IT University of Copenhagen in Denmark (http://www.itu.dk) and participates in the research activity of university projects ever since his masters’ education. He has rich experience in designing, developing and maintaining large software products for various companies. He gained working experience at several companies in Bulgaria. At present, he works as a software engineer for Canon Handy Terminal Solutions Europe in Denmark (www.canon-europe.com/Handy_
Terminal_Solutions
).

Radoslav’s interests are oriented towards software technologies for high-level programming languages, as well as products integrating complete hardware and software solutions in the industrial and private sectors.

You can contact Radoslav by e-mail: [email protected].

Stanislav Zlatinov

Stanislav Zlatinov is a software developer with professional experience in web and desktop applications development based on the .NET and Java platforms.

He has a master’s degree in "Computer Multimedia" from the "St. Cyril and St. Methodius" University of Veliko Tarnovo.

His personal blog is located at: http://encryptedshadow.blogspot.com.

Stefan Staev

Stefan Staev is a software developer who is occupied with building web based systems using the .NET platform. His professional interests are related to the latest .NET technologies, design patterns and databases. He is a member of the authors' team of the book "Introduction to Programming with Java".

Stefan currently majors in "Informatics" at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski". He is a "Core .NET Developer" graduate at the National Academy for Software Development.

You can contact him by e-mail: [email protected]. His Twitter micro blog is located at: http://twitter.com/stefanstaev.

Svetlin Nakov

Svetlin Nakov is the head of the "Technical Training" department at Telerik Corp. where he manages the project for free training of software engineers Telerik Software Academy (https://softuni.bg) as well as all other connected courses and training initiatives, such as Telerik School Academy, Telerik Algo Academy, Telerik Kids Academy.

He has achieved a bachelor’s degree in "Computer Science" and a master’s degree in "Distributed Systems and Mobile Technologies" at the Sofia University "St. Kliment Ohridski". Later he obtained a Ph.D. in "Computer Science" after defending a thesis in the field of "Computational Linguistics" in front of the Higher Attestation Commission of the Bulgarian Academy of Sciences (BAS).

His interests encompass software architectures development, the .NET platform, web applications, databases, Java technologies, training software specialists, information security, technological entrepreneurship and managing software development projects and teams.

Svetlin Nakov has nearly 20 years of experience as a software engineer, programmer, instructor and consultant, moving from Assembler, Basic and Pascal through C and C++ to PHP, JavaScript, Java and C#. He was involved as a software engineer, consultant and manager of teams in tens of projects for developing information systems, web applications, database management systems, business applications, ERP systems, cryptographic modules and trainings of software engineers. At 24 years of age he founded his first software company for training software engineers, which was acquired 5 years later by Telerik.

Svetlin has extensive experience in creating study materials, preparing and conducting trainings in programming and modern software technologies, gathered during his practice as an instructor. For many years now he is an honored instructor at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski" (FMI at SU), at the New Bulgarian University (NBU) and at the Technical University of Sofia (TU-Sofia), where he held courses in "Design and Analysis of Computer Algorithms", "Internet and Web Programming with Java", "Network Security", "Programming for the .NET Framework", "Developing Java Web Applications", "Design Patterns", "High Quality Programming Code", "Developing Web Applications with the .NET Framework and ASP.NET", "Developing Java and Java EE Applications", "Web Front-End Development" and many others (see http://www.nakov.com/courses/).

Svetlin has tens of scientific and technical articles focused on software development in both Bulgarian and foreign publications and is the lead author of the books "Programming for the .NET Framework (vol. 1 & 2)", "Introduction to Programming with Java", "Introduction to Programming with C#", "Internet Development with Java" and "Java for Digitally Signing Web Documents". He is a regular speaker at technical conferences, trainings and seminars and up to now has held hundreds of technical lectures at various technological events in Bulgaria and abroad.

As a high school and a college student, Svetlin was champion in tens of national contests in programming and was awarded with 4 medals at International Olympiads in Informatics (IOI).

In 2003 he received the "John Atanasoff" award of the EVRIKA Foundation. In 2004 he was awarded by the Bulgarian President with the "John Atanasoff" award for his contribution to the development of the information technologies and the information society.

He is one of the founders of the Bulgarian Association of Software Developers (www.devbg.org) and its present chairman.

Apart from computer programming Svetlin Nakov is founder of the NLP Club Bulgaria (http://nlpclub.devbg.org), a community of NLP (neuro-linguistic programming) practitioners and successful people who are looking for personal development and knowledge sharing. The goal for Svetlin is to add soft skills and personal development to his students at the software academy in addition to the profession and job positions they gain.

The personal website and blog of Svetlin Nakov is: http://www.nakov.com. His story of life is published at http://www.nakov.com/blog/2011/09/24/.

Teodor Bozhikov

Teodor Bozhikov is a senior software developer and team leader at Telerik (softuni.bg). He completed his master’s degree in "Computer Systems and Technologies" at the Technical University of Varna. Besides his background as a WPF and Silverlight programmer, he has achieved expertise in developing ASP.NET web applications. He was involved briefly in the development of private websites. Within the ICenters project, he took part in building and maintaining a local area network for public use at the Festival and Congressional Center in Varna. He has held courses in computer literacy and computer networks basics.

Teodor’s professional interests include web and desktop application development technologies, architecture and design patterns, networks and all kinds of new technologies.

You can contact Teodor by e-mail: [email protected]. His Twitter micro blog is located at: http://twitter.com/tbozhikov.

Teodor Stoev

Teodor Stoev has a bachelor’s and a master’s degree in "Informatics" from the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski". His master’s specialty at the University of Sofia is "Software Technologies". He currently attends a master’s program in "Computer Science" at the Saarland University (Saarbrücken, Germany).

Teodor is a software designer and developer with many years’ experience. He has participated in creating financial and insurance software systems, a number of web applications and corporate websites. He was actively involved in the development of the TENCompetence project of the European Commission. He is a co-author of the book "Introduction to Programming with Java".

His professional interests lie in the field of object-oriented analysis, modeling and building of software applications, web technologies and, in particular, building rich internet applications (RIA). He has an extensive background in algorithmic programming: he has competed at a number of national high school and collegiate computer science contests.

His personal website is available at: http://www.teodorstoev.com.

You can contact Teodor by e-mail: [email protected].

Tsvyatko Konov

Tsvyatko Konov is a senior software developer and instructor with varied interests and experience. He is competent in fields such as systems integration, building software architectures, developing systems with a number of technologies, such as .NET Framework, ASP.NET, Silverlight, WPF, WCF, RIA, MS SQL Server, Oracle, MySQL, PostgreSQL and PHP. His experience as an instructor includes a large variety of courses – courses for beginners and experts in .NET technologies, as well as specialized courses in individual technologies, such as ASP.NET, Oracle, .NET Compact Framework, "High Quality Programming Code" and others. Tsvyatko was part of the authors’ team of the book "Introduction to Programming with Java". His professional interests include web-based and desktop-based technologies, client-oriented web technologies, databases and design patterns.

Tsvyatko Konov has a technical blog: http://www.konov.me.

Veselin Georgiev

Veselin Georgiev is a co-founder of Lead IT (www.leadittraining.com) and software developer at Abilitics (www.abilitics.com). He has a master’s degree in "E-Business and E-Governance" at the Sofia University "St. Kliment Ohridski", after obtaining a bachelor’s degree in "Informatics" at the same university.

Veselin is a Microsoft Certified Trainer and Microsoft Certified Professional Developer. He lectured at the Microsoft Tech Days conferences of 2011 and 2009, also takes part as an instructor in various courses at the University of Sofia. He is an experienced lecturer who has trained software specialists for working practical jobs in the IT industry.

His professional interests are oriented towards training, SharePoint and software architectures. He can be reached at [email protected].

Veselin Kolev

Veselin "Vesko" Kolev is a leading software engineer with many years’ professional experience. He has worked at various companies where he managed teams and the development of many different software projects. As a high school student he participated in a number of competitions in the fields of mathematics, computer science and information technology, where he finished in prestigious places. He currently majors in "Computer Science" at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski".

Vesko is an experienced lecturer who has worked on training software specialists for practical jobs in the IT industry. He is an instructor at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski" where he runs courses on "Modern Java Technologies" and "High Quality Programming Code". He has delivered similar lectures at the Technical University of Sofia.

Vesko’s main interests include software projects design, development of software systems, .NET and Java technologies, Win32 programming (C/C++), software architectures, design patterns, algorithms, databases, team and software projects management, specialists training. The projects he has worked on include large web based systems, mobile applications, OCR, automated translation systems, economic software and many others. Vesko is a co-author of the book "Introduction to Programming with Java".

Vesko works on the development of Silverlight and WPF based applications at Telerik (softuni.bg). He shares parts of his day-to-day experiences online on his personal blog at http://veskokolev.blogspot.com.

Yordan Pavlov

Yordan Pavlov has a bachelor’s and a master’s degree in "Computer Systems and Technologies" from the Technical University of Sofia. He is a software developer at Telerik (softuni.bg) with an extensive background in software components development.

His interests lie mainly in the following fields: object-oriented design, design patterns, high-quality software development, geographic information systems (GIS), parallel processing and high performance computing, artificial intelligence, teams’ management.

Yordan won the Imagine Cup 2008 finals in Bulgaria in the Software Design category, as well as the world finals in Paris, where he won Microsoft’s prestigious "The Engineering Excellence Achievement Award". He has worked with Microsoft engineers at the company headquarters in Redmond, USA, where he has gathered useful knowledge and experience in the development of complex software systems.

Yordan has also received a golden mark for "Contributions to the Innovation and Information Youth Society". He has taken part in many contests and Olympiads in programming and informatics.

Yordan’s personal blog can be found at http://yordanpavlov.blogspot.com. He can be reached by e-mail: [email protected].

Yosif Yosifov

Yosif Yosifov is a senior software developer at Telerik (softuni.bg). His interests consist mainly of .NET technologies, design patterns and computer algorithms. He has participated in numerous contests and Olympiads in programming and informatics. He currently pursues a bachelor’s degree in "Computer Science" at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski".

Yosif’s personal blog can be found at http://yyosifov.blogspot.com. He can be reached by e-mail: [email protected].

The Java Book Authors

This C# fundamentals programming book is based its original Java version, the book "Introduction to Programming with Java". Thanks to the original Java book authors for their work. They have significant contribution to almost all chapters of the book. Some chapters are entirely based on their work, some partially, but in all cases their original work is the primary origin of this book:


-     Boris Valkov

-     Danail Aleksiev

-     Hristo Todorov

-     Lachezar Bozhkov

-     Luchesar Cekov

-     Marin Georgiev

-     Mario Peshev

-     Mariyan Nenchev

-     Mihail Stoynov

-     Nikolay Nedyalkov

-     Nikolay Vasilev

-     Petar Velev

-     Radoslav Ivanov

-     Rumyana Topalska

-     Stefan Staev

-     Svetlin Nakov

-     Teodor Stoev

-     Vesselin Kolev

-     Vladimir Tsanev

-     Yosif Yosifov


The Editors

Apart from the authors, a significant contribution to the making of this book was made by the editors who voluntarily took part in reviewing the text and the examples and fixing errors and other problems:


-     Dilyan Dimitrov

-     Doncho Minkov

-     Hristo Radkov

-     Iliyan Murdanliev

-     Marin Georgiev

-     Mihail Stoynov

-     Mihail Valkov

-     Mira Bivas

-     Nikolay Kostov

-     Nikolay Vasilev

-     Pavel Donchev

-     Radoslav Ivanov

-     Radoslav Kirilov

-     Radoslav Todorov

-     Stanislav Zlatinov

-     Stefan Staev

-     Svetlin Nakov

-     Teodor Bozhikov

-     Tsvyatko Konov

-     Veselin Georgiev

-     Veselin Kolev

-     Yosif Yosifov


The Translators

This book would be left in Bulgarian for many years if these guys were not given their volunteers work to translate it in English:


-     Angel Angelov

-     Atanas Valchev

-     Blagovest Buyukliev

-     Boyan Dimitrov

-     Dimitar Bonev

-     Doroteya Agayna

-     Dyanko Petkov

-     Franz Fischbach

-     George Halachev

-     George K. Georgiev

-     George S. Georgiev

-     Georgi Mitev

-     Georgi Todorov

-     Georgi Vaklinov

-     Hristo Radkov

-     Ivan Nenchovski

-     Ivaylo Dyankov

-     Ivaylo Gergov

-     Zhasmina Stoyanova

-     Kristian Dimitrov

-     Lora Borisova

-     Martin Gebov

-     Martin Radev

-     Martin Yankov

-     Momchil Rogelov

-     Nedjaty Mehmed

-     Nencho Nenchev

-     Nikolay Angelov

-     Nikolay Kostov

-     Pavel Benov

-     Radoslav Todorov

-     Stanislav Vladimirov

-     Svetlin Nakov

-     Teodor Rusev

-     Tihomir Iliev

-     Todor Mitev

-     Vasya Stankova

-     Ventsi Shterev

-     Vesselin Georgiev

-     Vesselina Raikova

-     Vladimir Amiorkov

-     Vladimir Tsenev

-     Yoan Krumov

-     Zhelyazko Dimitrov


Many thanks to George S. Georgiev who was seriously involved in the translation process and editing the translated text for most of the chapters.

Many thanks to Hristo Radkov who is proficient in English (lives and works in London for many years) and who edited and corrected the translation of the first few chapters.

Other Contributors

The authors would also like to thank Kristina Nikolova for her efforts in working out the book’s cover design. Big thanks to Viktor Ivanov for this work on the project’s web site.

The Book Is Free of Charge!

The present book is distributed absolutely free of charge in an electronic format under a license that grants its usage for all kinds of purposes, including commercial projects. The book is also distributed in paper format for a charge, covering its printing and distribution costs without any profit.

Reviews

If you don’t fully trust the authors who wrote this book, you can take inspiration from its reviews written by leading worldwide specialists, including software engineers at Microsoft, Google, Oracle, SAP and VMware.

Review by Nikola Mihaylov, Microsoft

Programming is an awesome thing! People have been trying for hundreds of years to make their lives easier, in order to work less. Programming allows humanity’s tendency towards laziness to continue. If you are a computer freak or if you’d just like to impress others with a good website or something of yours "never-seen -before " then you are welcome. No matter if you are part of the relatively small group of "freaks" who get off on encountering a nice program or if you’d just like to fulfill yourself professionally and lead your life outside the workplace, this book is for you.

The fundamental concepts of a car’s engine haven’t changed in years – something inside it burns (gas, oil or whatever you have filled it with) and the car rolls along. Likewise, the concepts of programming haven’t changed for years. Whether you write the next video game, money management software in a bank or you program the "mind" of a new bio robot, you will use – with absolute certainty – the concepts and the data structures described in this book.

In this book you will find a large part of the programming fundamentals. An analogical fundamental book in the automobile industry would be titled "Internal Combustion Engines".

Whatever you do, it’s most important to enjoy it! Before you start reading this book, think of something you’d like to do as a programmer – a website, a game or some other program! While reading the book, think of how and what from the stuff you have read you would use in your program! If you find something interesting, you would learn it easily!

My first program (of which I’m proud enough to speak of in public) was simply drawing on the screen using the arrow keys of the keyboard. It took me quite some time to write it back then, but when it was done, I liked it. I wish you this: may you like everything related to programming! Have a nice reading and a successful professional fulfillment!

Nikola Mihaylov is a software engineer at Microsoft in the team developing Visual Studio. He is the author of the website http://nokola.com and is easily “turned on” by the topic of programming; he is always ready when it’s necessary to write something positive! He loves helping people with questions and a desire for programming, no matter if they are beginners or experts. When in need, contact him by e-mail: [email protected].

Review by Vassil Bakalov, Microsoft

"Introduction to Programming with C#" is a brave effort to not only help the reader make their first steps in programming, but also to introduce them with the programming environment and to train for the practical tasks that occur in a programmer’s day-to-day life. The authors have found a good combination of theory – to pass over the necessary knowledge for writing and reading programming code – and practice – all kinds of problems, carefully selected to assimilate the knowledge and to form a habit in the reader to always think of the efficient solution to the problem in addition to the syntax when writing programs.

The C# programming language is a good choice, because it is an elegant language through which the program’s representation in the computer memory is of no concern to us and we can concentrate on improving the efficiency and elegance of our program.

Up until now I haven’t come across a programming book that introduces its reader with the programming language and develops their problem solving skills at the same time. I’m happy now that there is such a book and I’m sure it will be of great use to future programmers.

Vassil Bakalov is a software engineer at Microsoft Corporation (Redmond) and a participant in the project for the first Bulgarian book for .NET: "Programming for the .NET Framework". His blog is located at: http://bakalov.com.

Review by Vassil Terziev, Telerik

Skimming through the book, I remembered the time, when I was making my first steps in PHP programming. I still remember the book I learned from – four authors, very disorganized and incoherent content and elementary examples in the chapters for experts and complicated examples in the chapters for beginners, different coding conventions and emphasis only on the platform and the language and not on how to use them efficiently for writing high quality applications.

I’m very glad that "Introduction to Programming with C#" takes an entirely different approach. Everything is explained in an easy to understand manner, but with the necessary profundity, and every chapter goes on to slowly extend the previous ones. As an outside bystander I was a witness of the efforts put into writing the book and I’m happy that this immense energy and desire to create a more different book truly has materialized in a subject matter of very high quality.

I strongly hope that this book will be useful to its readers and that it will provide them with a strong basis for finding their feet, a basis that will hook them on to a professional development in the field of computer programming and that will help them make a more painless and qualitative start.

Vassil Terziev is one of the founders and CEO of Telerik Corporation, leading provider of developer tools and components for .NET, HTML5 and mobile development. His blog is located at http://blogs.telerik.com/vassilterziev/. You can contact him at any time you want by e-mail: [email protected].

Review by Veselin Raychev, Google

Perhaps even without reading this, you’ll be able to work as a software developer, but I think you’ll find it much more difficult.

I have seen cases of reinventing the wheel, often times in a worse shape than the best in theory and the entire team suffers mostly from this. Everybody committed to programming must sooner or later read what algorithm complexity is, what a hash table is, what binary search is and what the best practices for using design patterns are. Why don’t you start at this very moment by reading this book?

There are many books on C# and much more on programming. People would say about many of them that they are the best guides, the fastest way to get into the swing of the language. This book differs from others mainly because it will show you what you must know to achieve success and not what the twists and turns of a given programming language are. If you find the topics covered in this book uninteresting, then software engineering might possibly not be for you.

Veselin Raychev is a software engineer at Google where he works on Google Maps and Google Translate. He has previously worked at Motorola Biometrics and Metalife AG.

Veselin has won accolades at a number of national and international contests and received a bronze medal at the International Olympiad in Informatics (IOI) in South Korea, 2002, and a silver medal at the Balkan Olympiad in Informatics (BOI). He represented the Sofia University "St. Kliment Ohridski" twice at the world finals in computer science (ACM ICPC) and taught at several optional courses at the Faculty of Mathematics and Informatics at the University of Sofia.

Review by Vassil Popovski, VMware

As an employee at a managing position at VMware and at Sciant before that, I often have to carry out technical interviews for job candidates at our company. It’s surprising how many of the candidates for software engineering positions that come to us for an interview don’t know how a hash table works, haven’t heard of algorithm complexity, cannot sort an array or sort it with a complexity of O(n3). It’s hard to believe the amount of self-taught programmers that haven’t mastered the fundamentals of programming you’ll find in this book. Many people practicing the software developer profession are not even familiar with the most basic data structures in programming and don’t know how to iterate through a tree using recursion. Read this book, so that you won’t be like these people! It is the first textbook you should start with during your training as a programmer. The fundamental knowledge of data structures, algorithms and problem solving will be necessary for you to build your carrier in software engineering successfully and, of course, to be successful at job interviews and the workplace afterwards.

If you start with creating dynamic websites using databases and AJAX without knowing what a linked list, tree or hash table is, one day you’ll find out what fundamental gaps there are in your skill set. Do you have to make a fool of yourself at a job interview, in front of your colleagues or in front of your superior when it becomes clear that you don’t know the purpose of a hash code, or how the List<T> structure works or how hard drive folders are traversed recursively?

Most programming books will teach you to write simple programs, but they won’t take into consideration the quality of the programming code. It is a topic most authors find unimportant, but writing high quality code is a basic skill that separates the capable programmers from the mediocre ones. Throughout the years you might discover the best practices yourself, but do you have to learn by trial and error? This book will show you the right course of action the easy way – master the basic data structures and algorithms; learn to think correctly; and write your code with high-quality. I wish you beneficial studying.

Vassil Popovski is a software architect at VMware Bulgaria with more than 10 years of experience as a Java developer. At VMware Bulgaria he works on developing scalable Enterprise Java systems. He has previously worked as senior manager at VMware Bulgaria, as technical director at Sciant and as team leader at SAP Labs Bulgaria.

As a high school student Vassil won awards at a number of national and international contests including a bronze medal at the International Olympiad in Informatics (IOI) in Setúbal, 1998, and a bronze medal at the Balkan Olympiad in Informatics (BOI) in Drama, Greece, 1997. As a college student Vassil participated in a number of college contests and in the worldwide interuniversity contest in programming (ACM ICPC). During the 2001/2002 period he held the course "Transaction Processing" at the Sofia University "St. Kliment Ohridski". Vassil is one of the founders of the Bulgarian Association of Software Developers (BASD).

Review by Pavlin Dobrev, ProSyst Labs

The book "Introduction to Programming with C#" is an excellent study material for beginners that gives you the opportunity to master the fundamentals of programming in an easy to understand manner. It’s the seventh book written under the guidance of Svetlin Nakov and just like the others, it’s oriented exclusively to gaining practical programming skills. The subject matter includes fundamental topics such as data structures, algorithms and problem solving and that makes it intransient in technologies’ development. It’s filled with countless examples and practical advices for solving basic problems from a programmer’s everyday work.

The book "Introduction to Programming with C#" represents an adaptation of the incredibly successful book "Introduction to Programming with Java" to the C# programming language and Microsoft’s .NET Framework platform and is based on its leading author’s, Svetlin Nakov, experience gained while teaching programming fundamentals – not only at the National Academy for Software Development (NASD) and later at Telerik Academy, but at the Faculty of Mathematics and Informatics at the Sofia University "St. Kliment Ohridski", at the New Bulgarian University and at the Technical University of Sofia as well.

Despite the large number of authors, all of which with differing professional and training experience, there is a clear logical connection between the separate chapters from the book. It’s clearly written, with detailed explanations and many, many examples far from the dull academic style of most university textbooks.

Oriented towards those making their first steps in programming, the book delivers carefully, step by step, the most important stuff a programmer must be proficient in, in order to practice his profession – starting from variables, loops and arrays, to fundamental data structures and algorithms. The book also covers important topics like recursive algorithms, trees, graphs and hash tables. It’s one of the few books that teach a good programming style and high-quality programming code at the same time. There is enough thought put into the object-oriented programming principles and exceptions handling, without which modern software development is unimaginable.

The book "Introduction to Programming with C#" teaches the most important principles and concepts in programming in the way programmers think when solving problems in their everyday work.

This book doesn’t contain everything about programming and won’t make you .NET software engineers. If you want to become really good programmer, you need lots and lots of practice. Start from the exercises at the end of each chapter, but don’t confine yourselves to solving only them. You’ll write thousands of lines of code until you become really good – that’s the life of a programmer. This book is indeed a great start! Seize the opportunity to come across everything of utmost importance in one place without all the wandering through the thousands of self-instruction books and articles on the Internet. Good luck!

Dr. Pavlin Dobrev is technical director at ProSyst Labs (www.prosyst.com), a software engineer with more than 15 years’ experience, consultant and scientist, Ph.D. in "Computer Systems, Complexes and Networks". Pavlin has made worldwide contributions in developing modern computer technologies and technological standards. He is an active member of international standardization organizations such as the OSGi Alliance (www.osgi.org) and the Java Community Process (www.jcp.org), as well as open source software initiatives such as the Eclipse Foundation (www.eclipse.org). Pavlin manages software projects and consults companies of the likes of Miele, Philips, Siemens, BMW, Bosch, Cisco Systems, France Telecom, Renault, Telefonica, Telekom Austria, Toshiba, HP, Motorola, Ford, SAP, etc. in the field of embedded applications, OSGi based automobile systems, mobile devices and home networks, integrated development environments and Java Enterprise servers for applications. He has many scientific and technical publications and has participated in prestigious international conferences.

Review by Nikolay Manchev, Oracle

To become a skillful software developer, you must be ready to invest in gaining knowledge in many fields and a particular programming language is only one of them. A good developer mustn’t only know the syntax and the application programming interface of the language he’s chosen. He also has to possess deep knowledge in object-oriented programming, data structures and quality code writing. He must also back up his knowledge with serious practical experience.

When I was starting my career as a software developer more than 15 years ago, finding a comprehensive source for learning these things was impossible. Yes, there were books on the individual programming languages, but they only described their syntax. For the API description one had to rely on the documentation of the libraries. There were individual books devoted solely on object-oriented programming. The various algorithms and data structures were taught at the university. There was not even a word on high-quality programming code.

Learning all these things, one piece at a time, and making the efforts to put them into a common context, was up to the one walking "the way of the programmer". Sometimes a self-taught programmer cannot manage to fill the huge gaps in their knowledge simply because they have no idea of the gaps’ existence. Let me give you an example to illustrate the problem.

In the year 2000 I picked up the management of a large Java project. The team developing it consisted of 25 people and at that moment there were about 4000 classes written for the project. As a team leader, part of my job was to regularly review the code written by the other programmers. One day I saw how one of my colleagues had solved a standard array sorting assignment. He had written a separate, 25 lines long method implementing the trivial bubble sort algorithm. When I went to see him and asked him why he would do that instead of solving the problem with a single line of code using Array.Sort(), he started explaining how the built-in method had been "sluggish" and that it’s better to write these things yourself. I told him to open the documentation and showed him that the "sluggish" method works with a complexity of O(n*log(n)) and his bubble sort is a prime example of bad performance with its complexity of O(n2). In the next few minutes of our conversation I made the actual discovery – my colleague had no idea what algorithm complexity is and his knowledge of standard algorithms was tragic. Consequently I found out he majored in an entirely different engineering discipline, not computer science. Of course, there’s nothing wrong with that. His knowledge of Java was no worse than his co-workers’, who had longer professional exposures than him. But that very day we noticed a gap in his professional qualification as a developer that he hadn’t even suspected.

I don’t want to leave you with wrong impressions from this story. Although a college student who has successfully passed his main exams in "Informatics" would definitely know the common sorting algorithms and would be able to calculate their complexity, they would also have gaps in their education. The sad truth is that the college education in Bulgaria in this discipline is still theoretically oriented. It has changed very little over the course of the past 15 years. Yes, programs are nowadays written in Java and C#, but these are the same programs that were written in Pascal and Ada back then.

Somewhere about a year ago I consulted a freshman student who was majoring in "Informatics" at one of Bulgaria’s top state universities. When we sat down to go over his notes taken during the "Introduction to Programming" class, I was amazed at the code his instructor had given. The names of the methods were a mix of English and transliterated Bulgarian. There was a method calculate and a method rezultat (the Bulgarian for "result"). The variables carried the descriptive names a1, a2 and suma (the Bulgarian for "sum"). Yes, there is nothing tragic in this approach, as long as it’s a ten-lines-long example, but when this student takes up the job he’s earned at some large project, he will be harshly rebuked by the project leader, who will have to explain to him the coding conventions, naming principle, cohesion and coupling and variable life span. Then they’ll find out together about the gap in his knowledge of quality code the same way my colleague and I found out about his uncertain knowledge in the field of algorithms.

Dear reader, I can boldly state that you are holding a truly unique book in your hands. Its contents are very carefully selected. It’s well-arranged and presented with attention to details, of which only people with tremendous practical experience and solid scientific knowledge, like the book’s chief authors Svetlin Nakov and Veselin Kolev, are capable of. Over the course of many years they have also been learning "on the fly", supplementing and expanding their knowledge. They’ve worked for years on huge projects, they’ve attended many scientific conferences and they’ve taught hundreds of students. They know what’s necessary for anybody striving for a career in software development to learn and they’ve presented it in a manner that no other book on introduction to programming has done before. Your journey through the book’s pages will lead you through the C# programming language’s syntax. You’ll see how to use a large part of its API. You’ll learn the fundamentals of object-oriented programming and you’ll be able to work freely with terms such as objects, events and exceptions. You’ll see the most widely used data structures such as arrays, trees, hash tables and graphs. You’ll get to know the most widely used algorithms for working with these structures and you’ll come to know their pros and cons. You’ll understand the concepts for creating high-quality programming code and you’ll know what to require from your programmers when one day you become a team leader. In addition, the book will challenge you with many practical problems that will help you master, by the way of practice, the subject matter it covers. And if one of the problems proves too hard for you, you can always take a look at the solutions and guidelines the authors have provided.

Computer programmers make mistakes – no one is safe from that. The more capable ones make mistakes out of oversight or overwork, but the more incompetent ones – out of lack of knowledge. Whether you become a good or a bad software developer depends entirely on you and especially on how much you’re willing to constantly invest in your knowledge – be it by attending courses, reading or practicing. But I can tell you one thing for sure – no matter how much time you invest in this book, you won’t make a mistake. If some years ago someone wanting to become a software developer had asked me "Where do I start from", I wouldn’t have been able to give them a definitive answer. Today I can say without worry – "Start from this very book (in its C# or Java version)!"

I wish you with all my heart success in mastering the secrets of C#, the .NET Framework and software development!

Nikolay Manchev is a consultant and software developer with many years of experience in Java Enterprise and Service Oriented Architecture (SOA). He has worked for BEA Systems and Oracle Corporation. He’s a certified developer in the programs run by Sun, BEA and Oracle. He teaches software technologies and holds courses in "Network Programming", "J2EE", "Data Compression" and "High Quality Programming Code" at the Plovdiv University "Paisii Hilendarski" and at the Sofia University "St. Kliment Ohridski". He has held a number of courses for developers on Oracle technologies in Central and Eastern Europe (Hungary, Greece, Slovakia, Slovenia, Croatia and others) and has participated in international projects on incorporating J2EE based systems for security management. Works of his in the field of data compression algorithms have been accepted and presented in the USA by IEEE. Nikolay is an honorary member of the Bulgarian Association of Software Developers (BASD). He is author of the book "Oracle Database Security: Version 10g & 11g". You can find out more about him on his personal website: http://www.manchev.org. To contact him, use the e-mail address: [email protected].

Review by Panayot Dobrikov, SAP AG

The book at hand is an incredibly good introduction to programming for beginners and is a primary example of the notion (promoted by Wikipedia and others) to create and distribute easy to understand knowledge that is not only *free of charge*, but is of incredibly high quality as well.

Panayot Dobrikov is program director at SAP AG and co-author of the book "Programming = ++Algorithms;". You can find out more about him on his personal website: http://indyana.hit.bg.

Review by Lyubomir Ivanov, Mobiltel

If someone had told me 5 or 10 years ago that there is a book from which to learn the basics of managing people and projects – budgeting, finances, psychology, planning, etc., I wouldn’t have believed them. I wouldn’t even believe them at this very moment. For each of these topics there are tens of books that must be read.

If someone had told me that there is a book from which we can learn the fundamentals of programming essential to every software developer – I still wouldn’t have believed them.

I remember my time as a novice programmer and a college student – I was reading several books on programming languages, several others on algorithms and data structures, and a third set of books on writing high-quality code. Very few of them helped me to think algorithmically and to work out an approach for solving the everyday problems I came across in my practice. None of them gave me an overview of everything I had to know as a computer programmer and a software engineer. The only things that helped me were being stubborn and reinventing the wheel.

Today I read this book and I’m happy that finally, although a bit too late for me, someone got down to writing The Book that will help any beginner programmer solve the puzzle of programming – a modern programming language, data structures, quality code, algorithmic thinking and problem solving. This is the book that you should take up programming from, if you want to master the art of quality programming. Whether you choose the Java or C# version of this book doesn’t really matter. What matters is that you must learn to think as programmer and solve the problems you encounter when writing software; the programming language is just a tool you can change for another at any given time.

This book isn’t only for beginners. Even programmers with many years of experience can learn something from it. I recommend it to every software developer who would like to realize what they didn’t know up until now.

Have a nice time reading!

Lyubomir Ivanov is the manager of the "Data and Mobile Applications" department at Mobiltel EAD (part of Mobilkom Austria) where he engages in developing and integrating IT solutions for the telecommunications industry.

Review by Hristo Deshev, Entrepreneur

It’s surprising what a large percentage of programmers don’t pay attention to the little things like variable names and good code structure. These things pile up and, in the end, make the difference between a well-written piece of software and a bowl of spaghetti. This book teaches discipline and "hygiene" in code writing along with the very basic concepts in programming and that will undoubtedly make you a professional.

Hristo Deshev, software craftsman

Review by Hristo Radkov, Clever IT (London, UK)

Fantastic book! It gives the start to any developer geek who wants to develop into a software prodigy. While you can learn from the quick learning books for dummies to do coding that “just works” and this is the level expected in many of the small software development houses around, you can never leave a trace in the software world without understanding the fundamental concepts of programming. Yes, you can still develop software applications and use the goodies of the .NET framework, but just use and not create or innovate.

If you’d like to ever achieve architectural excellence and be able to confidently and proudly say you have developed a good piece of software that will stay there and serve its purpose for years, you need to understand just how the technologies you use in everyday live (e.g. ASP.NET, MVC, WPF, WCF, LINQ, Sockets, Task Parallel Library) work, but how they have been developed and optimized to become what they are. Only then would you save precious time in finding how to do things efficiently with these technologies, because that knowledge will naturally come from what you have learned from this book. And the same applies to understanding the widely recommended in the world of programming nowadays design patterns, architectures and techniques.

The book will allow you to prepare yourself to think, design and program optimally as a concept and mindset with any object oriented language you might ever use not just C# or .NET Framework.

Many banking systems here in London have a main requirement to be “real-time” data servers to thousands of users with minimum delays and interruptions, and this book provides the basics which if you lack you cannot work on such systems successfully, ever.

This fundamental knowledge distinguishes the excellent and accomplished developer, whose code would rarely require optimizations and would therefore save direct and indirect costs to their employer from the general developers who unfortunately are the prevailing part of the programmers you would meet in your career. The accomplished specialists evolve and progress into senior positions much easier when having the technical arguments and the mentality to be creative and visionary, avoiding the difficulties of technology gap limitations the mass around you have.

So, read the book carefully and diligently to become one!

Hristo Radkov is a Chief software architect and Co-founder at Clever IT, a software services, best coding practices and architecture consulting company based in London, United Kingdom. With over 15 years of experience as a Developer, Team leader, Development manager, Head of IT and Software Architect he has done projects professionally with C++, Java and C#, eventually remaining completely on the side of the Microsoft Technologies after the very first release of .NET Framework, becoming recognized by the industry Microsoft Technology Software Development Best Practices and Cloud Programming Expert, with MCPD, MCSD.NET, MCDBA and MCTS awards. Hristo is co-author of the books "Programming for the .NET Framework (vol. 1 & 2)" and has been instructor for .NET and Design Patterns for many years. His company Clever IT is consulting top financial institutions and FTSE 100 corporations with multibillion valuations on the World Stock Exchanges. You can find more about him on www.radkov.com or linked-in at Hristo Radkov. To contact him, use the e-mail address: [email protected].

License

The book and all its study materials are distributed freely under the following license:

Common Definitions

1.  The present license defines the terms and conditions for using and distributing the "study materials" and the book "Fundamentals of Computer Programming with C#", developed by a team of volunteers under the guidance of Svetlin Nakov (www.nakov.com).

2.  The study materials consist of:

-     the book (textbook) on "Fundamentals of Computer Programming with C#"

-     sample source code

-     demo programs

-     exercise problems

-     presentation slides

-     video materials

3.  The study materials are available for free download according to the terms and conditions specified in this license at the official website of the project: www.introprogramming.info.

4.  Authors of the study materials are the persons who participated in their creation.

5.  User of the study materials is anybody who uses or accesses these materials or portions of them.

Rights and Limitations of the Users

1.  Users may:

-     distribute free of charge unaltered copies of the study materials in electronic or paper format;

-     use the study materials or portions of them, including the examples, demos, exercises and presentation slides or their modifications, for all intents and purposes, including educational and commercial projects, provided they clearly specify the original source, the original author(s) of the corresponding text or source code, this license and the website www.introprogramming.info;

-     distribute free of charge portions of the study materials or modified copies of them (including translating them into other languages or adapting them to other programming languages and platforms), but only by explicitly mentioning the original source and the authors of the corresponding text, source code or other material, this license and the official website of the project: www.introprogramming.info.

2.  Users may not:

-     distribute for profit the study materials or portions of them, with the exception of the source code;

-     remove this license from the study materials when modifying them for own needs.

Rights and Limitations of the Authors

1.  Every author has non-exclusive rights on the products of his / her own work contributing to build the study materials.

2.  The authors have the right to use the products of their contribution for any purpose, including modifying them and distributing them for profit.

3.  The rights on all study materials written in joint authorship belong to all co-authors together.

4.  The authors may not distribute for profit study materials they’ve written in joint authorship without the explicit permission of all other co-authors.

Resources Coming with the Book

This book "Fundamentals of Computer Programming with C#" comes with a rich set of resources: official web site, official discussion forum, presentation slides for each chapter of the book, video lessons for each chapter of the book and Facebook fan page.

The Book’s Website

The official website of the book "Introduction to programming with C#" is available at: www.introprogramming.info. At this site you can download the whole book in electronic format (PDF / DOCX / HTML / Kindle), the source code of the examples, the exercises and solutions guidelines, presentations slides, video lectures and other useful resources.

Discussion Forum

The discussion forum where you can find solutions to almost all problems from the book is available at: https://softuni.bg/forum.

This forum is created for discussions among the participants in Telerik Software Academy’s courses who go through this book during the first few months of their training and mandatorily solve all problems in the exercise sections. Most people "living" in the forum are Bulgarian but everyone speaks English so you are invited to ask your questions the book exercises in English.

In the forum you’ll find comments and solutions submitted by students and readers of the book, as well as by the trainers at the Software Academy. Just search thoroughly enough and you’ll find several solutions to all problems in the book (with no exceptions). Every year thousands of participants in Telerik Software Academy solve problems from this book and share in their solutions and the difficulties they’ve encountered, so simply search thoroughly in the forum or ask, if you can’t get to a solution for a particular problem.

Presentation Slides Coming with the Book

This book is used in many universities, colleges, schools and organizations as textbook on computer programming, C#, data structures and algorithms. To help instructors teach the lessons following this book we have prepared PowerPoint presentation slides for each chapter of the book. Instructors are welcome to use the slides free of charge under the license agreement stated above. The authors' team will be happy to find out that this book and its study materials and presentation slides are helping people whole over the world to learn programming. This is the primary goal of the project: to teach computer programming fundamentals, in complete, simple, structured, understandable way, free of charge. You may find the PowerPoint slides in English at the book’s official web site: www.introprogramming.info.

Video Materials for Self-Education with the Book

As part of the Telerik Academy program (https://softuni.bg) and, in particular, the free course "Fundamentals of C# Programming", videos of all lectures on the subject matter in this book have been recorded. The video materials in English and Bulgarian can be found at C# book’s official web site: introprogramming.info.

If you speak Bulgarian you might be interested of Telerik Academy’s video channel in YouTube: youtube.com/TelerikAcademy. It holds thousands video lessons on programming and software development.

Fan Club

For the fans of the book "Introduction to Programming with C#" we have a Facebook page: www.facebook.com/IntroCSharpBook.

Svetlin Nakov, PhD,

Manager of the "Technical Training" Department,

Telerik Software Academy, Telerik Corporation,

August 24th, 2013

Tags: , , , , , , ,

2 responses to “Preface”

  1. Jan Kowalski says:

    Great introduction! Thank you very much!

  2. 18002payday says:

    Hey there, You have done an excellent job. I will certainly digg
    it and personally suggest to my friends. I am sure they’ll be benefited from this site.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.