Undergraduate Courses


CS 101: Introduction to Computing     Fall 2014-15

This course was redesigned recently to better cater to the needs of different majors and to make it more interesting and intuitive. Regardless of their intended major, all students at LUMS will have to use computers extensively during their studies here, and most likely, will continue to use them even after they graduate. The course will provide a general overview of the computing, and develop problem-solving skills using basic programming. This course has been remodeled to facilitate students in applying computer knowledge for problem solving in everyday business/office environment. Key component of the course will be a series of labs and pre-lab assignments that are geared towards introducing students to application of computing in financial domain. However, we aim to do so without burdening students with useless details that have little utility from a user's perspective.

Instructor: Dr. Shafay Shamail


CS 200: Introduction to Programming     Spring 2015 | Fall 2014-15

This course teaches computer programming using a mix of on-paper and on-computerexercises. It focuses on procedural as well as object-oriented programming using C++. The main concepts discussed are: Variables, functions, structures, classes, objects, some commonly useful data structures, algorithms and algorithmic complexity.

Instructor: Dr. Naveed Arshad


CS 300: Advanced Programming     Spring 2015

An in-depth programming course for individuals with prior programming experience. Through extensive programming exercises, we will cover CS concepts and their applications to large problems. Since programming exercises can and will take a significant amount of time, plan your workload/signups on other demanding courses accordingly.


CS 360: Software Engineering     Spring 2015 | Spring 2014

This course introduces software engineering as a discipline, discusses stages of the software life cycle, compares development models such as waterfall, prototyping, incremental/iterative and agile methods, covers requirements analysis, architecture and design. It also discusses object oriented analysis and design, verification and validation techniques, testing methods, programming practices, documentation, user interface design and design patterns.

Instructor: Dr. Hamid Abdul Basit


Graduate Courses


CS 560: Distributed Software Systems Development     Spring 2015 | Spring 2014

In order to fill the gap between academic learning and global software industry's required skill-set for software developers, it is very important to equip the students with the appropriate skills to enhance their upfront productivity in the industry. The objective of this course is to align these paradigms, by providing skilled resources to a rapidly growing industry , who can better face the future challenges, and by facilitating the smooth transition of students to the industry.

In this course students will develop a web-based system of considerable size, in a team of 5-6 members following the Agile development methodology.

Instructor: Dr. Hamid Abdul Basit


CS 569: Design Patterns and Refactoring     Fall 2014-15

A primary goal of object oriented programming is to create software that is easy to modify and extend. In this course we will look at two complementary paradigms targeted to achieve this goal.

In the first part of the course, we explore advanced principles of object-oriented design by studying key software design patterns. Design patterns are standard solutions to common software design problems. Instead of focusing on how individual components work, design patterns are a systematic approach that focus and describe abstract systems of interaction between classes, objects, and communication flow.

In the second part of this course, we will take an in-depth look at software refactoring and how it is used to improve the design of software and minimize the amount of code produced. A range of refactoring techniques to root out and identify poorly structured code will be covered. We will also discuss the code smells that indicate that code rot is occurring. Once we've detected the code rot, we apply object oriented principles to refactor the code and eliminate the problem.

Instructor: Dr. Hamid Abdul Basit


CS 570: Advanced Operating Systems     Spring 2015 | Spring 2014

This course introduces advanced operating system topic sand introduces recent developments in systems research. The course involves reading and understanding classic and new research papers on operating systems. Topics include operating system structure, threads and synchronization, virtual memory management, and file systems.


CS 661: Research Trends in Software Engineering     Spring 2015 | Spring 2014

This course aims to explore potential research areas in the field of software engineering. The course will include survey of current research, identification of research problems, conducting research on any of the identified problems and finally publishing at least a position paper in a well-reputed workshop / conference / journal. It will provide students a reasonable breadth of various hot research topics in software engineering and depth in one of their selected areas.

Instructor: Dr. Shafay Shamail


CS 664: Software Engineering for Smart Grids     Spring 2015 | Spring 2013

This seminar course focuses on the issues and applications of software technology to support the modernization of our electrical infrastructure commonly known as the smart grid. Participants will read selected papers on software for the smart grid to become familiar with the issues, and will carry out a project related to the course. The project could be an evaluation of an existing technology or the development of new software to support the smart grid.We will also try to visit some of the companies who are working in the field of renewable energy and smart grids in the vicinity of Lahore.

Instructor: Dr. Naveed Arshad


CS 5611: Reliable Software     Fall 2014-15

In July 2014 issue of Communications of the ACM, the outgoing ACM President Vinton Cerf writes in an article "Responsible Programming" that "people who write software should have a clear sense of responsibility for its reliable operation and resistance to compromise and error." He notes "model checking is one good example of a systematic effort to improve reliability for which ACM gave the Turing Award in 2007 to Edmund Clarke, Allen Emerson, and Joseph Sifakis." He concludes by suggesting,"responsible programming calls for renewed efforts to verify proper operation of software." This article well summarizes the significance of making software reliable. Another data point comes from a study conducted by NIST in 2002. According to this study, software errors cost 60 billion dollars every year in US alone and errors in critical systems put human lives at risk. Our software systems are getting increasingly large and complex but they still suffer from poor reliability. A fundamental reason for the lack of reliable software is the predominant reliance on ad-hoc and ineffective testing techniques. More than half the development cost in the software industry is spent on testing. Yet many serious bugs are found and fixed after product release.

This course is a graduate level introduction to a number of recent tools and techniques for building more reliable and secure software including the above mentioned model checking. These techniques borrow ideas from static and dynamic program analysis, constraint solving, theorem proving, and formal methods. Progress in the last decade has made it possible to apply these techniques on large and complex software and in some cases find bugs that remained unidentified for years in production use and traditional testing. A special focus will be on making concurrent software reliable which is specially hard as concurrent software can have bugs including deadlocks and race conditions that manifest only in particular thread schedules.

The goal of this course is to build an understanding of reliability issues in software. This understanding will make you a more effective programmer, get you started in system reliability research, or help you apply these techniques in other areas of research like operating systems, networks, security etc. This course is not about traditional software testing and quality assurance techniques and does not aim to prepare you for manual testing jobs.