The area of communication networks and algorithms is wide and popular nowadays. It has motivated several research sub-areas, some of which are studied at our Department.
Two its theoretical sub-areas are studied by methods of distributed computing and computational geometry. They model communication networks either via abstract graphs or by a collection of points in the plane (e.g., routers, antennas). In the latter case, each point has its own transmission/reception radius. Once modeled in one of these ways, network problems are cast as either graph-algorithmic or geometric ones. These problems are then analyzed in either centralized setting, i.e., when there is a single processor that knows the entire input and is supposed to produce the output in its entirety, or in distributed one, when processors with only local information reside in every vertex/point. Each of these settings gives rise to a rich and vivid research area.
Another, mostly applicative wide sub-area of networking grew from the Internet studies. Due to the classic Internet implementation, most of it is based on the distributed model. Another novel direction is based on the prospective concept of Software-Defined Networks (SDNs), in which each such SDN is mostly controlled in a centralized way and the network elements are directly programmable. SDN is quickly being adopted by the enterprise and network vendors. For example, Google, Symantec, and more use either SDN or their own custom variant. While Cisco, VMWare, and other vendors provide SDN enabled network elements. Such centralized and dynamic networking gives rise to new interesting problems. One of them is a seamless routes replacement. It is studied at our Department based on Make&Activate-Before-Break approach, which supports seamless routes updates.
At the age of cloud computing, distributed systems have become part of the daily lives of
all of us, let it be government, business, or social aspects of our lives. As the
algorithms and software become more complex, the computational tasks grow, and so is
our demand for computational power and efficiency. At the same time, computer
manufacturers have reached the limit of single processor's capabilities. As a result,
parallel and distributed systems have become our only way to increase our computing
capabilities. Most distributed systems such as cloud services, Internet servers, and
multi-core computations surprisingly share the same properties such as careful
synchronization, load balancing, and efficient usage of hardware resources.
The field of programming languages is concerned with the study, design, implementation, and use of programming languages.
The kinds of questions asked in this field include: What makes programming languages powerful, expressive, and convenient to use? What language features can be implemented easily and efficiently? What language features can be reduced to other, more basic features? How best to implement programming languages in compilers and interpreters? What features of a language enable the compiler to generate efficient code? Given a program written in some language, what can we know about the program before/without running it? What mathematical objects correspond to computer programs, and what can we prove about their properties? How can correct programs be synthesized from formal proofs about their properties?
Research in programming languages is very diverse in character: There are theoretical questions, there are applied questions, there are questions that touch upon the logical foundations of computation, and there are questions that concern expressibility, methodologies, frameworks, and system building.
An important concept to theoreticians and practitioners in computing, distributed
computing and communication networks, refers to the system's ability to recover
automatically from unexpected faults. The research focuses on algorithms that starting
from any arbitrary state, allow the system to recover from the faults and bring it back to a
correct state. An additional goal of this research area is to design self-stabilizing
Would you ride in an autonomous vehicle you coded the software for? The research
questions in the field of software engineering and verification are derived by the need to
increase the reliability of programs/computerized systems and the assurance of their
correctness. For instance, verification is concerned with providing automatic techniques
for proving that systems adhere to their formal specification. Synthesis is concerned
with providing aids to automatically generate parts of systems/programs that are correct
by construction. In spite of the high complexity of the algorithms for solving these
questions, verification tools are being used on a daily basis in companies such as Intel
and Boing who cannot afford the risk of the existence of bugs. This field of study offers
the opportunity to work on challenging open theoretical questions as well as to impact
the ways systems are being designed in industry.