The course teaches students comprehensive and specialised subjects in computer science; it teaches students cutting edge engineering skills to solve real-world problems using computational thinking and tools, as well as soft skills in communication, collaboration, and project management that enable students to succeed in real-world business environments. Most of this program is case (or) project-based where students learn by solving real-world problems end to end. This program has core courses that focus on computational thinking and problems solving from first principles. The core courses are followed by specialization courses that teach various aspects of building real-world systems. This is followed by more advanced courses that focus on research level topics, which cover state of the art methods. The program also has a capstone project at the end, wherein students can either work on building end to end solutions to real world problems (or) work on a research topic. The program also focuses on teaching the students the “ability to learn” so that they can be lifelong learners constantly upgrading their skills. Students can choose from a spectrum of courses to specialize in a specific sub-area of Computer Science like Artificial Intelligence and Machine Learning, Cloud Computing, Software Engineering, or Data Science, etc.
This course helps students translate advanced mathematical/ statistical/ scientific concepts into code. This is a module for writing code to solve real-world problems. It introduces programming concepts (such as control structures, recursion, classes and objects) assuming no prior programming knowledge, to make this course accessible to advanced professionals from scientific fields like Biology, Physics, Medicine, Chemistry, Civil & Mechanical Engineering etc. After building a strong foundation for converting scientific knowledge into programming concepts, the course advances to dive deeply into Object-Oriented Programming and its methodologies. It also covers when and how to use inbuilt-data structures like 1-Dimensional and 2-Dimensional Arrays before introducing the concepts of computational complexity to help students write optimised code using appropriate data structures and algorithmic design methods. The module can be taught to allow students to learn these concepts using a modern programming language such as Java or Python. The course offers students the ability to identify and solve computer programming problems in scientific fields at a graduate level. The course prepares students to handle advanced data structures and algorithm design methods in the separate module, ‘Data Structures’.
Mathematics and computer science are closely related fields. Problems in computer science are often formalized and solved with mathematical methods. It is likely that many important problems currently facing computer scientists will be solved by researchers skilled in algebra, analysis, combinatorics, logic and/or probability theory, as well as computer science. This course covers discrete mathematics for computer science and engineering. Topics may include asymptotic notation and growth of functions; permutations and combinations; counting principles; discrete probability. Further selected topics may also be covered, such as recursive definition and structural induction; state machines and invariants; recurrences; generating functions. Students will be able to explain and apply the basic methods of discrete(noncontinuous) mathematics in computer science. They will be able to use these methods in subsequent courses in the design and analysis of algorithms, computability theory, software engineering, and computer systems. The focus of the course is real-world problems and applications often found in business and industry.
The ability to solve problems is a skill, and just like any other skill, the more one practices, the better one gets. So how exactly does one practice problem solving? Learning about different problem-solving strategies and when to use them will give a good start. Problem solving is a process. Most strategies provide steps that help you identify the problem and choose the best solution.Building a toolbox of problem-solving strategies will improve problem solving skills.With practice, students will be able to recognize and choose among multiple strategies to find the most appropriate one to solve complex problems. The course will focus on developing problem-solving strategies such as abstraction, modularity, recursion, iteration, bisection, and exhaustive enumeration. The course will also introduce arrays and some of their real-world applications, such as prefix sum, carry forward, subarrays, and 2-dimensional matrices. Examples will include industry-relevant problems and dive deeply into building their solutions with various approaches, recognizing each’s limitations (i.e when to use a data structure and when not to use a data structure). By the end of this course a student can come up with the best strategy which can optimize both time and space complexities by choosing the best data structure suitable for a given problem.
This course builds upon the introductory JavaScript course to acquaint students of popular and modern frameworks to build the front end. We focus on three very popular frameworks/libraries in use: React.js, jQuery and AngularJS. We start with React.js, one of the most popular and advanced ones amongst the three. Students learn various components and data flow to learn to architect real world front end using React.js. This would be achieved via multiple code examples and code- walkthroughs from scratch. We would also dive into React Native which is a cross platform Framework to build native mobile and smart-TV apps using JavaScript. This helps students to build applications for various platforms using only JavaScript. jQuery is one of the oldest and most widely used JavaScript libraries, which students cover in detail. Students specifically focus on how jQuery can simplify event handling, AJAX, HTML DOM tree manipulation and create CSS animations. We also provide a hands-on introduction to AngularJS to architect model-view-controller (MVC) based dynamic web pages.
This is a foundational course on building server-side (or backend) applications using popular JavaScript runtime environments like Node.js. Students will learn event driven programming for building scalable backend for web applications. The module teaches various aspects of Node.js like setup, package manager, client- server programming and connecting to various databases and REST APIs. Most of these concepts would be covered in a hands-on manner with real world examples and applications built from scratch using Node.js on Linux servers. This course also provides an introduction to Linux server administration and scripting with special focus on web-development and networking. Students learn to use Linux monitoring tools (like Monit) to track the health of the servers. The module also provides an introduction to Express.js which is a popular light-weight framework for Node.js applications. Given the practical nature of this course, this would involve building actual website backends via assignments/projects for ecommerce, online learning and/or photo-sharing.
This is a course that focuses both on architectural design and practical hands-on learning of the most used cloud services. The module extensively uses AmazonWeb services (AWS) to show real world code examples of various cloud services. It also covers the core concepts and architectures in a platform agnostic manner so that students can easily translate these learnings to other cloud platforms (likeAzure, GCP etc.). The module starts with virtualization and how virtualized compute instances are created and configured. Students also learn how to auto-scale applications using load balancers and build fault tolerant applications across a geographically distributed cloud. As relational databases are widely used in most enterprises, students learn how to migrate and scale (both vertically and horizontally) these databases on the cloud while ensuring enterprise grade security.Virtual private clouds enable us to create a logically isolated virtual network of computer resources. Students learn to set up a VPC using virtualized-compute-servers on AWS. The course also covers the basics of networking while setting up aVPC. Students learn of the architecture and practical aspects of distributed object storage and how it enables low latency and high availability data storage on the cloud
This course provides an in-depth architectural overview and hands- on experience with building scalable data processing and distributed computing via various cloud systems. We focus a lot on Spark which is one of the most popular and powerful distributed systems to perform petabyte scale data processing. We learn various components of Spark like HDFS, Resilient Distributed Datasets (RDDs), Programming models like Map-reduce. Students also learn SparkSQL and Hive and how they can be used for querying large data stores. We focus on how various services in a cloud (like AWS) can be used together to build scalable data-pipelines for both batch and near real-time processing. We show various examples of real world systems and their architectures from various companies and organizations.We learn how graphX can be used to process large graphs using Spark. Students useAWS Elastic Map Reduce (EMR) for cloud based Spark clusters. We learn the design and architecture of distributed inverted indices and how they can be used for implementing search scalably. Students learn to use ElasticSearch, a very popular distributed inverted index for implementing search functionality on websites and on unstructured data.
This is a course that focuses both on architectural design and practical hands-on learning of advanced cloud-based services. We begin with the serverless computing model and how it is achieved by most cloud providers. We learn to use it for building web applications, data and file processing and analytics applications. We then learn of the architecture of distributed messaging queues and how they can be used for plumbing complex cloud systems with many components and services.Monitoring the resources in your cloud setup is a key to ensure low costs and high availability and the smooth functioning of your overall setup. We learn to use AWS CloudWatch to track various key metrics, trigger alarms, detect anomalous behaviour and act upon them in near real-time. We learn the architecture and design of load balancers and how they play a key role in most horizontally scalable web-applications. Students also learn of the architecture and design of Content delivery networks (CDNs) from Akamai and Amazon. We learn how CDNs can be used to deliver live streaming and website content fast using globally distributed servers and caching. Most of this course involves learning the internal architecture of various cloud systems and using them to solve real world engineering problems
This course provides students with hands-on experience on deploying high velocity applications and services reliably on complex and distributed infrastructure. DevOps as a philosophy is a key driver of the modern software life cycle which prefers rapid and reliable delivery of functionality and features via code. We start with a solid introduction to Linux scripting and networking. Then, we learn popular methodologies to deploy complex and distributed software like microservices, containerization (Docker) and orchestration (Kubernetes). All of this would be introduced with real world examples from the industry. We also focus onContinuous Integration and Continuous Delivery (CI/CD) methodology and how it can be achieved using popular toolchains like Jenkins. We dive into how automated testing of software can be achieved using libraries like Selenium. This shall be followed by more advanced techniques like serverless- compute, Platform as a service model and Cloud-DevOps. Students would learn to monitor and log key datapoints to ensure they maintain a healthy system and adapt it as needed. Infrastructure-as-code is a key component of modern DevOps especially on cloud and containerized applications which would also be covered with real-world examples.
This course provides a practical understanding of popular object-oriented design patterns so that students can reuse design strategies developed for commonly occurring problems in software development. We begin the course with a revision of object-oriented programming and an overview of UML (unified modelling language) diagrams to represent software design diagrammatically. We then dive into 10-12 most popular design patterns motivating each of them from real world scenarios. We would also showcase multiple open source code bases which use the specific design pattern to solve a real-world design problem. This would help students gain an appreciation of how each of the theoretical patterns they learn actually translate to code. We also take up real world cases and dive into various design patterns that can be used to solve the problem. Sometimes, there could be multiple valid designs. We would five into the pros and cons of each design decision and trade-offs involved. Our objective is to build the problem-solving ability amongst students to recognize the appropriate design pattern to tackle a real world problem. The module briefly discusses domain specific design patterns in their respective contexts.
This course is aimed at equipping students with skills to architect the high level design (a.k.a. system design) of software and data systems. We start with some of the good to have properties of large complex software systems like scalability, reliability, availability, consistency etc. The module teaches various patterns and design choices we have to satisfy each of these good to have properties. We then go on to understand key components of system design like load-balancers, microservices, reverse-proxies, content-delivery networks etc. Students learn how each of them work internally along with real world implementations of each. We study various NoSQL data stores, their internal architectures and where to use which one with real-world examples. Students also learn popular data encoding schemes like XML and JSON. We learn how to build data pipelines using batch and stream processing systems. We also work on multiple real world cases on architecting on the cloud using popular open-source libraries and tools. Students will study design documents and high-level-design of popular internet applications and services like videoconferencing, recommender-systems, peer-to-peer chat, voice-assistants etc.
This course provides a comprehensive overview and practical knowledge of variousNoSQL data stores and how they can be used on the Cloud (AWS). We focus on three NoSQL data stores in this course: MongoDB, DynamoDB and Redis. For each of them, we first understand the design and architecture in depth. We compare and contrast each of them with traditional relational databases and other NoSQL databases so that students understand the engineering trade-offs when using them. We take multiple real-world case-studies from various companies and organizations to discuss which datastore is more apt in each situation to help students better appreciate the differences and use-cases. We dive into the technical details from setting up and deploying each of these data stores on the cloud (AWS) with latency and scalability in mind. We also discuss various data store specific optimizations and good practices to follow. The module also teaches students how to stress test each of these datastores under differing loads to compare and contrast which would be a better fit in a real world scenario. At the end of this course, students would be able to choose an optimal data store for their engineering needs to build websites or build data pipelines or deploy machine learning applications.
Advanced Applied Computer Science is a capstone project, an end-to-end deployable solution to a real-world computational problem that students build in the last phase of the programme. Its objective is to help students rigorously solve a technically challenging problem where they would apply all of the concepts, techniques and tools learned in the programme. Students typically pick a problem from their specialisation after discussing it with the course instructor(s). Students also have the option of working on a real-world problem in their company/ organization/ institution. They can be mentored by an expert supervisor from their organization along with an academic supervisor from Woolf. All external expert-supervisors and projects need to be approved by the instructor(s) to ensure that the project is technically challenging and the solution being built is rigorous
and of high quality. Students start with identifying a technically challenging problem. Once approved by the instructor(s), they start the literature survey to read research papers and technical reports of prior related work. Then, they build the system design and write a design document to solve the problem. This would be followed by designing and implementing individual modules and testing them. This would be followed by deploying the solution and making it available to end users while satisfying the problem’s real-world constraints and objectives. Students then document their work into a detailed technical report.