**How is Computer Science Engineering at BITS? **

**What are positives and negatives of Computer Science Engineering at BITS?**

Computer Science as a branch is an intellectually challenging one. The core areas of focus are the design and improvement of computing techniques and their applications. This is done at multiple levels ranging from somewhat theory oriented ones involving logic, discrete mathematics, design and analysis of algorithms and so on, to some which are more hardware related such as ones dealing with digital circuits, microprocessors and computer architecture. Other, more pragmatic topics of study include topics like computer networks, operating systems, database management systems etc. There is a significant focus on implementing theory through programming, and the study and development of programming languages and their paradigms such as object oriented programming are important as well.

**Positives –** Computer Science deals with problem solving at a fundamental level. It requires strong analytical, logical and critical thinking skills for a person to be good at it. This kind of thought process helps students to enhance their problem solving abilities by being able to quickly analyze a problem and design a solution given the constraints present. And these skills are transferable, making Computer Science graduates highly sought after in many areas other than IT, such as banking and finance.

The faculty across campuses is quite good, and several of them are actively involved in pursuing research, both at an academic as well as industry level. Computing facilities are also decent and for those pursuing projects involving a huge amount of data crunching, there are cluster computing systems available in Goa, with plans to network them across the three campuses. Also, it is fairly easy to pursue a course of independent study in this field (for both CS and non CS students) as there are many free online courses offered by some of the best universities in the world, and the only supporting equipment you need is a laptop for most of them.

**Negatives –** If you rely mainly on learning by rote in order to succeed, you will face a lot of difficulty. We routinely have open book/laptop exams and having the book sometimes doesn’t make any difference. Also, it’s easy to learn the basic concepts in Computer Science, but it can take a while to process them fully. It’s a little like mathematics in that it’s easy to learn a formula, but it can be hard to break down the problem in front of you into smaller manageable pieces that can be solved easily using the formula.

The course uses the second year courses as a foundation upon which many of the third year courses are based. Poor performance in one course is likely to affect another one if you don’t compensate. Also, courses which have a significant practical aspect to them may require students to put in extra effort to practice for the lab sessions. In many courses, students are expected to go through the lab sheets thoroughly if they want to do well in the lab and sometimes, these sections are left as self study and are not discussed in the lectures.

** What you will learn in Computer Science Engineering at BITS, and what are the nearest JEE topics to them?**

Here’s a list of the CS courses (except for electives) along with a brief description of what they involve and how they are conducted in BITS.

**Year 1:Sem 2.**

**Computer Programming** – All students have to study this course irrespective of branch. It is an introduction to programming by describing how computers are actually used to solve problems. Important areas include information representation, problem solving with flowcharts and programming in C. Lab sessions are conducted every week to test students’ proficiency in programming. All labs are conducted in a Linux environment (bye bye Windows).

**Year 2:Sem 1.**

**Object Oriented Programming –** This is a programming methodology that involves modelling the problem in terms of reusable objects and classes. The language used to teach this course is Java, although it might include Javascript depending on the instructor. Again, there is a weekly lab component involved as part of the evaluation process. There may also be a project component where students have to build and demonstrate a working application such as a Mess Management System or a Video Chat application.

**Digital Design –** Deals with digital electronics – the logic gates (AND, OR, NOT etc.) and more complex constructs that can be formed using them such as decoders, multiplexers, adders, flip flops and the like. The meat of the course is about pure design and simulation of logic circuits. There are weekly hardware labs where you have to build circuits to solve a given problem. There are software labs as well which teach the simulation of digital circuits using software. A final hardware project involves soldering a complex circuit with 10 – 20 integrated circuit chips.

**Discrete Structures for Computer Science –** It’s a theory oriented course which focuses on introducing us to some of the structures that are used in CS. Topics of study include Mathematical Induction, Graph Theory and Group Theory. There’s no practical aspect involved, and the course only tests your logical and analytical skills.

**Logic in Computer Science –** Another theory oriented course. As the name suggests, it deals with logic and its applications in Computer Science. Relevant topics include boolean algebra, propositional logic, logic systems, satisfiability, validity and first order logic. This course really makes you think a lot, and a major part of it involves proving theorems using various axioms.

**Year 2:Sem 2.**

**Data Structures and Algorithms –** This is one of the most important courses. It introduces students to various important algorithms that are routinely used along with the associated data structures. Part of the course also deals with a performance analysis of algorithms by introducing the mathematical notations and concepts required to get a theoretical estimate of the performance. Topics include Complexity, asymptotic notation, searching and sorting, graphs, trees, heaps and linked lists, hashing, string matching etc. Labs form an integral part of the course, where the students are given challenging problems to solve by writing efficient programs (in any language) that make use of the theory they have studied. Implementing these algorithms and data structures in code is not taught as part of the course, but normally the TAs hold extra sessions to cover this area.

**Microprocessors and Interfacing –** This is a hardware oriented course which deals with the Intel x86 processor family. Students are taught how a microprocessor works and how to program them using assembly level instructions. Part of the course also discusses how to interface various peripheral devices to the microprocessor such as I/O chips, timers etc. Labs are conducted periodically to teach assembly level programming of microprocessors and there is a simulation project as well which tests your overall knowledge of the course.

**Database Management Systems –** As the name suggests, the course is about database systems. The data used in all applications from Facebook to IRCTC has to be structured in an organized and logical format. The course introduces students to the core ideas behind organizing data in databases and how they can be queried efficiently to obtain relevant information. A part of the course also deals with the internal storage mechanisms of a database, including the data structures used to efficiently index and organize data for fast retrieval. Labs form an integral aspect of the course, with practical sessions being held using SQL.

**Year 3:Sem 1.**

**Theory of Computation –** A very theoretical course (duh). This course describes some of the fundamental methods of computation, starting with simple models and then moving up to more powerful ones. It’s a math intensive course, with a heavy focus on set theory, relations and rigorous proofs. Topics covered are regular languages, finite state machines, context free grammars, push down automata and Turing machines. It lays an important foundation for the course on Compiler Design and Construction.

**Principles of Programming Languages –** This is a course that deals with an analysis of programming languages and their inner workings. Several languages like C, C++, Java and Python are examined side by side and their design principles are discussed. Topics include code to assembly translation, pointers and references, object oriented analysis, functional programming, generics and meta programming, memory management and some parts of parallel programming in CUDA.

**Operating Systems –** Without an OS, your computer is just a pile of junk. An operating system breathes life into the hardware of a computer. The course explains exactly how an OS manages to do that. It introduces students to the roles of an OS, types of OS and moves on to explain exactly how it manages the various tasks and processes that run on a computer. Some important topics are scheduling, concurrency and multi-processing and memory management among others. There may be some practical sessions that deal with multi-threaded programming topics. The course is a mix of theory and practical application.

**Computer Architecture –** This is another hardware oriented course. In this course, students will learn how to design a processor from scratch and what are the various improvements that can be made to improve their performance. A simple single cycle design is first introduced which is later enhanced with features like pipelining and hazard detection. Assembly level programming is also revisited. Cache design is also discussed in the later part of the course. Labs are conducted in this course in which students have to simulate the working of various different types of processors. A final project involves designing a fully functional advanced processor as per the given specifications.

**Year 3:Sem 2.**

**Compiler Design and Construction –** A compiler is a tool used to convert high level code (from languages like C or Java) into lower level machine instructions. The course covers some important topics in compiler design such as finite state automata, context free grammars, lexical analysis, different types of parsing techniques, syntax directed translation, intermediate code generation and code optimization. Although it’s rather theoretical, there may be some programming assignments given as part of the evaluative component.

**Computer Networks –** This course deals with the analysis and design of computer networks. It introduces students to the basic concepts in networking such as the different layers in the network model and also how computers communicate across these networks using different protocols. Topics like flow control, routing and congestion are also discussed along with more advanced topics like encryption and network security. Labs are conducted which start with basic socket programming but quickly move on to network simulations.

**Design and Analysis of Algorithms –** An extension of the Data Structures and Algorithms course, this one takes a more in depth look at some of the more advanced topics. The discussion begins with optimized search trees, moves into some graph algorithms and then focuses on Dynamic Programming and Greedy Algorithms and backtracking. The final part of the course involves NP-completeness and approximation techniques to solve NP problems. Some lab sessions are also conducted to test the students’ understanding of these concepts.

**Related JEE topics –** None. As you can probably tell from the course descriptions above, there’s next to no relevance of JEE topics here.