So, I set a task to create an efficient, not requiring maintenance, live streaming system of satellite TV channels in the Internet, with its own H.264 video codec. It was clear that the task is not simple and in the future this project could be a kind of frozen protracted construction. It was necessary to decide on the development methodology and think beforehand, how to make so, that the project would be successfully completed.
I decided to start the development of a system of broadcasting by satellite in a standard way - to find appropriate professionals, order the development, after that understand how finished working version works and make final "customizing". All have failed when I could not find such specialists. Indeed, video codec and live streaming systems developers, as a rule, are already working in relevant major companies and to find them, and even to get them involved in work, would be very difficult. After unavailing searching I decided to contact developers of already existed programs of signal reception from the satellite and it’s broadcasting in the Internet. The maximum that they could offer is to use their API on regular payments, which were calculated by sums with a large number of zeros. In the end, I made a decision to hold the development by my own.
From what I should start the development? I remember the words of one of our foremen, from times when I worked in building. Once he told me how he worked on the construction of a cottage settlement in his youth. Besides their firm, near the same construction hold another company – foreign company. They worked simultaneously. As usual, time pressed and our foreman immediately started the building on the whole nine yards. Working arduously, he began to notice, that on the next ground, where foreign company worked, generally there were no any works, and their foreman only constantly walked along the site and marked something in his drawings. It looked strange, because the terms were all the same, and they were pressing already. "Eventually, - he said, - I came up to the foreman and asked him why they did not work, and he answered confidently, as they say that all goes according to the plan and keeps within just-in-time". As a result works on their site began much later than on the site of our foreman. But how they were organized! Each man was in his place, everything was thought out to the smallest details, the construction just grew right in front of one’s eyes, and the quality of the work was order of magnitude greater. And also the construction was completed much earlier than ours. "Then, - he said. - I really understood what precise planning and organization of work means".
Unfortunately, I have no experience of work in large companies of software development, so a lot of moments I just don't know and can only guess. Once I had an idea to get a job in one of these companies, but having read the requirements, and also considering the fact that I have never been on the interview as a competitor, I have quickly reject this thought. So below I will give only those moments, which guided me in my development. Perhaps I have missed something.
At first I will mention what I know, but what I have never make before - Unit tests. Any self-respecting developer knows what is it. I know that too, but I had difficulties with the use of it. For some reason I could not invent what tests to make and how to use them. My test was always the easiest - turn on the TV and see if it is working. If it doesn't work - test failed. Hmm, well, somehow it is not serious...
Further I will discuss things to which I paid the most attention.
In software development the last stage is - writing the code. Initially it is necessary to understand clearly what you want to do, how all this will work and interact, how to implement error checking, and so on. Therefore at the first stage, like the foreman, I did nothing, but just worked out questions in detail in my head. An important moment is the code formatting. As I always went on the principle that at first tried to bind finished libraries and sections of code and only if they did not satisfy me, developed my own, I was constantly faced with the analysis of someone else's code. How it is difficult to read it, if banal rules of code are not followed! It is not necessary that they should be used everywhere as the same. It is more important that one strategy should be chosen, which will be followed. Steve McConnell tells about it very clearly in his book "Code Complete". I chose these recommendations as a guideline for us - http://geosoft.no/development/cppstyle.html. In future, at system development, I always enjoyed McConnell’s advices. Moreover, I believe that this book is the most important one of all books that I needed. And just from reading this book I start the development of this system.
Under my belt was an experience of the development of asf stream relay, when I spent a lot of time struggling with memory leaks and getting rid of them, so I have point the first priority - write a system that will be free from this defect. At each development stage with the help of analyzers I controlled, if there are any leakages and if they were, I quickly corrected the situation. I carefully analyzed any program fall and did not go further until understand and eliminate the cause of the fall.
Further, as usual, I put the maximum possible level of compiler notification about errors and warnings. In fact this gave a huge benefit! Looking back, I realize that many of those warnings, which gave the compiler, could not show itself at initial stage of the work, but occur in future and lead to unpredictable results. Invaluable assistance is also provided Cppcheck utility. I have never do the next, while I have not completely understood the nature of warnings and errors.
Subversion usage. Even if your team consists of only a few people, the use of a version control system is simply obligatory. Thanks to it at any time I could see all changes, I could cancel something, or add something. In general, it is necessary thing.
Struggle with the complexity. This principle is also well discussed in McConnell’s book. As soon as I realized that something is complicated enough to figure it out, I rejected it and was looking for a simpler solution. I want to note, that a simpler solution always was found. In this regard, there were many situations when I threw the work on the midway, and went up to issue’s solving in another way. But if I did so, I would hardly ever finalize.
As it is well known, according to the principle of Epstein-Heisenberg, in the field of development and research, there are only two parameters of three, which can be determined simultaneously. If there are objective and time to achieve it, it is impossible to predict how much it will cost. If time and resources are limited, you can’t divine which part of the task will be implemented. And if the purpose is put clearly and a certain amount of money is allocated, it cannot be predicted when this goal will be achieved.
In my case I chose completely non-profit approach, namely - set a clear purpose and allocated a certain amount of money. In the end, I could not say anything about terms. But now, I believe, that the goal is achieved and the developed system is not inferior to professional developments.
Finally, I would like to list a literature, which served as the basis for my development of broadcasting system:
C++ literature:
R. Lafore. "Object-Oriented Programming in C++". This book is often recommended to beginners, and it became my favorite book on C++. It is written in a very simple language, but it is its value (we all remember the principle of struggle with complexity).
Bjarne Stroustrup. "The C++ Programming Language". Only in some rare cases, when it was necessary to solve unusual questions, I have resorted to this book. To a greater extent, what is said in Lafore’s book was enough. Although I read Stroustrup, of course, from cover to cover.
http://boost.org/ - quite helpless without this library.
http://stackoverflow.com/ - the system, which gave me the answers to a large number of questions.
http://www.rsdn.ru - the main Russian-language forum, on which I also received a lot of useful tips.
For understanding the principles of network performance and network connections, of course, Stevens’ book "Network Programming" was requested. Although with the level of abstraction, existing today, this book only as a general guidance.
About McConnell and his "Code Complete" I have already mentioned, it's just must have.
Separately I would like to mention forums. They have played very important role in my development. Although, it should be noted, it is very important to formulate your question clearly, pick out the very essence of it. I also noticed that most "unclear situations" and questions for me were just obvious and banal things. For example, once I spent a few days trying to understand why a certain piece of code was not working like I expected from him. Eventually I asked this question on the forum and after 5 minutes received a detailed answer. As it is called – it’s just my eye got soap.
Of course, I have read and a number of other books, but they rather served for general development and do not have such a tangible meaning, as the above resources.
Well, that is all. This is quite enough for development of Internet-broadcasting system.
Igor, October 2012.
|