Obligatory courses SE601: Research Methods in Software Engineering Students will be expected to already have a strong grasp of the key principles of software engineering and the common methods used in software practice. This course will explore the role of empiricism in software engineering research, and will prepare students for advanced research in SE by examining how to plan, conduct and report on empirical investigations. The course will cover all of the principal methods applicable to SE: controlled experiment, case studies, surveys, archival analysis, qualitative and quantitative methods, action research and ethnographies, and will relate these methods to relevant meta-theories in the philosophy and sociology of science. The course will critically review published examples of work that used each of the principle methods, both from within SE and from other disciplines. The course will cover techniques applicable to each of the steps of a research project, including formulating research questions, theory building, data analysis, building evidence, assessing validity, and publishing. On completing the course, students should be able to: - Demonstrate knowledge of the main empirical methods: surveys, case studies, and experiments. - Understand the processes involved in carrying out quantitative and qualitative research. - Comprehend the diversity of approaches in data production and analysis - Develop new hypothesis based on the criticism of previous research papers. - Apply the hypothesis testing using parametric and non-parametric tests. - Demonstrate the ability to plan and conduct empirical studies and to analyse, interpret, and report the results. SE602: Software Requirements Engineering This course introduces students the principles, process and techniques for defining, eliciting, analyzing , modeling, testing and managing requirements for a large, complex, changing systems. Studying research literature in requirement engineering. Topics covered include: requirements engineering process, requirements elicitation, Requirements analysis, Requirements documentation, Quality assurance for requirements, Requirements V & V, and Requirements management. On completing the course, students should be able to: - Understand the basic concepts of software requirements engineering. - Identify the stakeholders involved in requirements engineering. - Understand requirements engineering processes. - Understand types and models of requirements. - Understand functional, and non-functional requirements. - Define the activities and the skills of requirement engineers. - Define activities of requirement documentation, and management - Understanding the significance, techniques, and principles of requirement validation. - Identify the features of requirement management tools. - Master and use requirement validation techniques and tools - Master and use different types of elicitation techniques SE603: Software Management This course introduces students to apply the concepts and basics of project management (planning, organizing, staffing, monitoring, and controlling) in the context of software projects. Also, it illustrates the benefits of process improvement and presents the Capability Maturity Model Integration (CMMI). Finally, the course offers a broad view of software management in an acquisition environment. Topics covered include: basic project planning and scheduling, risk management, software costing, software size and quality metrics, quality management, the basics of human factors management (including individuals and groups), process improvement concept and the CMMI model, software acquisition management. On completing the course, students should be able to: - Recognize the importance and principles of software project management. - Recognize different project life cycle models. - Describe project management activities: estimation, planning, monitoring and control. - Consider the human resources and team management factors. - Identify project risks and risk management techniques. - Relate metrics and measurements to management information needs. - Apply project management activities in real life case studies. - Evaluate the different project life cycle models. - Analyse and assess risk parameters and risk management approaches through real-life case studies. - Distinguish and compare different metrics and project related measures. - Use different project management tools to show an understanding of the concepts. - Design and develop project plans to reflect different planning activities. - Develop a team structure, a team chart, and roles and responsibilities. SE604: Software Testing & Quality Assurance This course is designed to give the students a good understanding of the issues and techniques related to software testing and quality assurance. Topics covered include test Lifecycle planning, test design & coverage analysis, complexity, levels of testing such as unit, integration, system, performance and stress testing methods of testing, verification and validation, quality assurance processes and techniques, software quality metrics and ISO /SEI CMM process evaluation. On completing the course, students should be able to: - Recognize the role and importance of software quality assurance in software verification. - Apply formal inspections, then record and evaluate the results of inspections. - Show how to detect, classify, prevent and remove defects. - Evaluate different testing techniques used in designing test plans, developing test suites, and evaluating test suite coverage. - Apply different strategies for unit (black-box and white box)-level and system-level testing. - Know how to choose which metrics to collect and use them to make predictions. - Use automated testing tools in order to measure code coverage. - Analyze peer reviews and inspections for defect prevention. - Analyze and investigate the source code for testing purposes. - Develop and document test plan. - Design and apply test cases based on different testing methods - Produce test strategy and test plan. - Improve the software development process, software quality and reliability. SE605: Software Design and Architecture The learning objectives of this course are to become familiar with: the notion of software architectures, different types of architectures, the role they play in software-intensive systems and in system development, architecture creation and evolution, architecture analysis, and documenting architecture. Concepts presented in lectures are complemented by assignments, class participation, projects, research term paper and self-study On completing the course, students should be able to: - Understand the basic concepts of software design and architecture. - Understand software design process models. - Understand Architectural Design Representations. - Understand design strategies and methods. - Ability to assess designs. - Perform design verification. - Apply appropriate theories, principles and concepts relevant to software architecture and design models. - Analyze and interpret information from a variety of sources relevant to software architecture and design. - Analyze and evaluate the information in the domain of software design and architecture and take references from them for problem solving. - Constructing systems from modules. - Design and implement different software architectures. - Formulate precise specifications of computer-based systems - Select the appropriate architecture for a system. SE606: Software Construction This course will provide students with an in-depth study of software construction. Topics include, software construction fundamentals (minimizing complexity, anticipating change, constructing for verification and standards in construction), managing construction (construction models, construction planning and construction measurement) and practical considerations (construction design, construction languages, coding, construction testing, reuse, construction quality, configuration management, , automation, and integration). Topics covered: Software Construction Fundamentals, Managing Construction, Construction Measurement, Construction Quality, Construction Design, Construction Languages, Error Handling, Exception Handling, and Fault tolerance, Construction Testing, Collaborative construction, Construction Technologies, Software Construction Tools, Software Debugging and Refactoring Upon completion of this course: - Students will be able to apply principles of software engineering: simplicity, safety from bugs, ease of understanding and readiness for change. - Students will be prepared to construct sequential and concurrent programs. - Students will have in-depth study of software construction in a modern language including control structuring and packaging. - Concepts such as information hiding, data abstraction, and object-based and object-oriented software construction are discussed and illustrated. - Students will be able to design, implement, and test a small- to medium-scale software system (thousands of lines of code, multiple modules). - Generate and execute a test plan to verify that the implementation satisfies the given specifications - Be able to competently use software development tools and methods such as compilers, text editors, integrated development environments (IDE), build tools, debugging tools, version control tools, software design, code review and testing. - Students will have experience developing software collaboratively in a team. Elective courses SE611: Secure Software Development The goal of the secure software development course is to provide the theory and practice of software security, focusing on common software security risks, and identification of potential threats and vulnerabilities at the early stage of the software development life cycle. It integrates software security risks analysis and management throughout the software development life cycle. Topics include: Requirements: abuse & misuse cases, security requirements, Planning: risk assessment, Design: secure design patterns, test planning, Design: architectural risk & threat modelling, Implementation: Secure Programming Best Practices, Implementation: defensive coding practices, Cryptography: authentication, public-key, symmetric key, SSH, SSL, PGP, side-channel attacks, Common Web Application Vulnerabilities, Static Code Analysis and Runtime Analysis, Vulnerability Assessment Systems: CVSS, CWSS, Deployment & Distribution: patching, security managers and Course study, students Presentation Students will achieve the following objectives: - Learn about software security fundamentals - Learn about state of arts of secure software development - Know potential threats and vulnerabilities to software - Know techniques to protect software and computer systems - Describe major software weaknesses (security vulnerabilities) - Identify project security risks assessments and selecting risk management strategies. - Comply with data privacy and security requirements when designing a software system. - Explain the various approaches and techniques for developing secure software - Critically analyze and evaluate software security properties and threats. - Use formal methods in modelling, analyzing and validating software properties and requirements. - Reflect and report on Common Web Application Vulnerabilities - Critically evaluate the Requirements: abuse & misuse cases, security requirements - Evaluate and apply cryptographic functions and information on securing software SE612: Software Maintenance and Evloution This course focuses on state-of-the art methods, tools, and techniques for evolving software. It builds upon the key methods and techniques associated with constructing software to ensure the maintainability and evolution of software products. Key elements of software maintenance process, impact analysis, software reengineering/reverse engineering/design recovery, source code analysis are examined. Then topics on how to produce software systems with the measurable maintainability properties are covered from both theoretical and practical perspectives. Advanced topics in model-based engineering for evolvable products are also examined along with emerging technologies that are relevant to the sustainability of software. Topics include: Maintenance and Reengineering, Analysis of Software Artifacts , Configuration and Change Management, Reusability, Object-orientation and reuse, Maintenance Process and Standards, Reengineering and Maintenance in software cycle, Reengineering and Reverse Engineering and Reengineering and Reverse Engineering III Dynamic Analysis. On completing the course, students should be able to: - To understand the topics related to maintaining software systems. - To be able to analyse an information system by using software reverse engineering methods. - To understand software engineering topics such as estimation, software quality assurance, metrics, configuration management, verification and validation, inspections, and personal/team software process as they relate to software maintenance projects. - To understand how legacy applications can be modernized to target ones using advanced technologies. - Understand the role of maintenance in software development - Understand the concepts of software reengineering - Understand the relationship between maintenance, evolution and re-Engineering - Apply traditional analysis and design methods - To be able to design new requirements and integrate the designs with existing information systems by using software forward engineering methods. - To apply a software reengineering process to maintenance and modernization of software-intensive systems. - Develop economic models to support evolution-related management decisions SE613: Human Computer Interaction This course is concerned with designing interactions between human activities and the computational systems that support them, with constructing interfaces to afford those interactions, and with the study of major phenomena surrounding them. Interaction between users and computational artifacts occurs at an interface which includes both software and hardware. Thus interface design impacts the software life-cycle in that it should occur early; the design and implementation of core functionality can influence the user interface for better or worse. Because it deals with people as well as computational systems, as a knowledge area HCI demands the consideration of cultural, social, organizational, cognitive and perceptual issues. Consequently it draws on a variety of disciplinary traditions, including psychology, ergonomics, computer science, graphic and product design, anthropology and engineering. The course considers a variety of methods that can be applied to the design and evaluate interactive systems. The emphasis of the course is on practical understanding and application of HCI concepts and methods. Topics include: user-centred design and usability engineering, Frameworks for usability engineering, Problem analysis and Task analysis, Conceptual models, Cognitive models and Human perception, Participatory design, User Interface design, Visualization, Social computing, Interaction design, Low- and High-fidelity prototyping (sketching, storyboards, wireframe), Qualitative and Quantitative evaluation and Shared workspaces and groupware usability evaluation. On completing the course, students should be able to: - Define a user-centered design process that explicitly recognizes that the user is not like the developer or their acquaintances - Understand how user-centered design complements other software process models - Describe the constraints and benefits of different evaluative methods - Use a variety of techniques to evaluate a given UI - Conduct research on comparing and combing usability engineering techniques and apply these techniques to solve existing problems in user interface design at software companies’ projects - Develop and use a conceptual vocabulary for analyzing human interaction with software: affordance, conceptual model, feedback, and so forth - Create and conduct a simple usability test for an existing software application - Discuss the HCI issues in software that embodies human intention. - Apply problem solving ideas in the development of innovative solution to user interface design - Demonstrate the ability to objectively setup empirical studies, and assess their results while comparing various user interface designs - Demonstrate the ability to learn new usability engineering techniques on one’s own, in order to cope with ongoing changes in the HCI field. SE614: Global Software Engineering Team The search for talents and experiences across national boundaries and the integration of groups thrown together by mergers and acquisitions are two of the many forces conspiring to fundamentally change the organizational context of software development. Hence Globally-distributed projects are rapidly becoming the norm for large software systems. This course covers a set of topics, strategies and tools that are essential to both professionals who will become participants and leaders in globally-distributed projects, as well as researchers interested in studying virtual teams, distributed organizations, and global software development. Students will work in distributed project teams and experience global software development environments. On completing the course, students should be able to: - Understand the challenges and strategies in global software development - Become familiar with strategies in working and negotiating when dealing with global software projects. - Be aware with current strategies for success in agile development processes such as SCRUM in particular distributed SCRUM - Be aware with collaborative development environments in distributed projects. - Create trust, awareness and shared understanding of software development - Use effective technology-mediated mechanisms to form and support distributed teams - Use proper strategies in global software development and delivery - Develop skills of teamwork in a geographically distributed team, work estimation and planning (in short project iterations), and effective communication and collaboration across large time zone differences - Analyze and log risks - Report project progress - Evaluate success and achievement of key performance indicators. SE615: Software Engineering in Mobile Computing Introducing students to mobile applications development frameworks and tools and best practices of mobile software engineering. Performing a software development cycle for a mobile application. Studying research literature on mobile computing. Topics include: Mobile applications basics (activities, fragments, services, UI, storage, touch, voice, location and security), Mobile development software engineering model, Mobile applications architecture best practices, Cross platform mobile development frameworks, Mobile User interface design best practices, Mobile applications testing and Basic web services/REST concepts and mobile applications. On completing the course, students should be able to: - Differentiate between applying software models in developing desktop application and a mobile application - Understand the technical challenges posed by current mobile devices. - Identify components of a mobile application - Identify current trends in mobile devices technologies and systems. - Explain the limitations and challenges of developing a mobile application ○ Conduct a virtual mobile application development lifecycle ○ Sketch mobile-specific user interface. ○ Choose proper cross-platform framework and tools ○ Apply software patterns for the development of a mobile application ○ Prepare a mobile application testing plan ○ Implement and deploy mobile applications using an appropriate software development environment. - Analyze current research in mobile applications software engineering - Apply new methodologies in developing mobile applications software - Evaluate current trends in mobile software engineering - Conduct research and write technical reports about mobile software applications engineering SE616: Software Engineering for Distributed Systems Deeper understanding of software engineering topics in a distributed environment. They will be better equipped to design, develop, test, and analyze the performance of distributed applications. Topics include: Characterization of Distributed Systems, Inter-process Communication, Distributed Software Architecture, Analysis and design of distributed software, Transactions and Concurrency Control, Time and Global States, Replication & Distributed data and Distributed system quality metrics and testing. On completing the course, students should be able to: - Understand the Classes of Distributed Software Problems - Describe architectural and fundamental models of distributed systems - Understand and compare strategies for inter-process communication - Explain and compare middleware models - Understand Design Issues of Distributed Applications such as ○ Use logical time to implement distributed algorithms ○ Specify, design, and implement a distributed software application, which is both appropriate and relevant for a suggested purpose. ○ Test, and analyze the performance of distributed applications. - Analyze and criticize current software engineering research in Distributed Systems - Map software engineering methodologies in developing distributed applications - Evaluate current trends in utilizing software engineering in distributed applications - Conduct research Distributed Software applications SE617: Advanced Topics in Software Engineering This course is specially designed to cope with the fast changing field of software engineering by covering new advanced topics as per the time the course is delivered. Advanced concepts, knowledge, skills, and best practices in the global software engineering discipline can be covered. On completing the course, students should be able to: - Theories and fundamentals and state-of-the-art of research in Software Engineering. - Advanced topics in Software-Project Management and Planning. - Advanced topics in Risk Analysis and Software Quality Assurance. - Advanced topics in Software Development, Design, and Testing. - Current Applications of research in Software Engineering. - Differentiate between different models in Software Engineering. - Conduct problem-solving techniques for Project Management and Planning. - Conduct analyses in Risk Analysis and Software Quality Assurance. - Conduct advanced techniques in Software Development, Design, and Testing. - Discuss various methodologies and tools in Software Engineering. - Evaluate different models in Software Engineering. - Design techniques for Project Management and Planning. - Analyse different techniques in Risk Analysis and Software Quality Assurance. - Implement advanced techniques in Software Development, Design, and Testing. - Develop new techniques for Software Engineering. SE618: Selected Topics in Software Engineering This course covers some selected topics related to advanced theoretical and technical issues of software engineering. It will focus on the new trends and topics in the software engineering field. The course covers a group of seminars, each seminar is focused around one major topic. The students shall acquire advanced theoretical knowledge and technical competences about the topics covered in the course as well as some research methods that are relevant to these topics.