diff --git a/.github/.keep b/.github/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml new file mode 100644 index 0000000000..a73df660bf --- /dev/null +++ b/.github/workflows/classroom.yml @@ -0,0 +1,38 @@ +name: Autograding Tests +'on': +- push +- repository_dispatch +permissions: + checks: write + actions: read + contents: read +jobs: + run-autograding-tests: + runs-on: ubuntu-latest + if: github.actor != 'github-classroom[bot]' + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Quiz 1 + id: quiz-1 + uses: classroom-resources/autograding-io-grader@v1 + with: + test-name: Quiz 1 + setup-command: '' + command: Which of the following best describes software engineering? + input: |- + a) The study of hardware components + b) The process of designing, developing, and maintaining software + c) The analysis of networking protocols + d) The management of data storage systems + expected-output: b) The process of designing, developing, and maintaining + software + comparison-method: exact + timeout: 10 + max-score: 10 + - name: Autograding Reporter + uses: classroom-resources/autograding-grading-reporter@v1 + env: + QUIZ-1_RESULTS: "${{steps.quiz-1.outputs.result}}" + with: + runners: quiz-1 diff --git a/README.md b/README.md index 36055c900d..a2e46fddd7 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,293 @@ +[![Open in Visual Studio Code](https://classroom.github.com/assets/open-in-vscode-2e0aaae1b6195c2367325f4f02e2d04e9abb55f0b24a779b69b11b9e10269abc.svg)](https://classroom.github.com/online_ide?assignment_repo_id=18406097&assignment_repo_type=AssignmentRepo) # SE_Day1 Software Engineering Day1 Assignment #Part 1: Introduction to Software Engineering Explain what software engineering is and discuss its importance in the technology industry. - +Software Engineering is the application of engineering principles to the design, development, testing, deployment, and maintenance of software systems. It focuses on creating efficient, scalable, and reliable software solutions while considering user needs, performance, and security. +Importance of Software Engineering in the Technology Industry +1. Ensures High-Quality Software +Software engineering follows structured development methodologies to ensure that software is robust, secure, and error-free. +2. Enhances Efficiency and Productivity +Engineers use automation tools, frameworks, and programming best practices to speed up software development. +3. Reduces Development Costs +A structured software engineering process prevents waste of time and resources by reducing errors and unnecessary work. +4. Improves Security and Data Protection +Software engineers implement encryption, authentication, and secure coding to protect systems from cyber threats. Identify and describe at least three key milestones in the evolution of software engineering. +1. The Birth of Software Engineering (1968 - NATO Conference) + +The term "software engineering" was first introduced at the NATO Software Engineering Conference in 1968. +The conference was held to address the "software crisis"—a period when software projects were failing due to poor planning, inefficiency, and high costs. + +Established software engineering as a formal discipline with structured methodologies. +Led to the development of programming best practices, documentation standards, and systematic testing methods. +Encouraged the separation of software development from hardware engineering. +2. The Rise of Agile Development (2001 - Agile Manifesto) +What Happened? + +A group of 17 software developers created the Agile Manifesto in 2001, which introduced a new way of developing software. +It emphasized flexibility, collaboration, and iterative development over rigid planning and documentation. +Impact: + +Transformed software development from the Waterfall model (which had strict, linear phases) to Agile methodologies like Scrum and Kanban. +Improved team collaboration, faster delivery, and adaptability to changes. +Became the standard approach for modern software development. +3. The Shift to Cloud Computing and DevOps (2010s - Present) +What Happened? + +The rise of cloud computing (AWS, Azure, Google Cloud) allowed software to be deployed and scaled more efficiently. +DevOps (a combination of Development + Operations) emerged to automate software deployment, testing, and monitoring. +Impact: + +Enabled continuous integration & continuous deployment (CI/CD), reducing the time it takes to release software. +Improved scalability and flexibility with cloud services. +Helped businesses transition to microservices and containerization (e.g., Docker, Kubernetes) for efficient software management. List and briefly explain the phases of the Software Development Life Cycle. +1. Planning +Define project goals, scope, budget, and timeline. +Conduct feasibility studies (technical, operational, and financial). + +2. Requirements Analysis + +Gather and document functional and non-functional requirements from stakeholders. + +3. Design +Create architectural designs, UI/UX mockups, and database schemas. + +4. Development (Implementation) + +Write the actual source code based on the design specifications. +Use version control systems (e.g., Git) to manage code changes. + +5. Testing +Perform unit testing, integration testing, system testing, and user acceptance testing (UAT). +Identify and fix bugs, security vulnerabilities, and performance issues. +Use automated and manual testing methods. + +6. Deployment +Deploy the software to production environments (servers, app stores, or cloud platforms). +Configure databases, servers, and networking settings. +Release in phases (e.g., beta release, full deployment) if necessary. + +7. Maintenance & Support +Monitor system performance and fix bugs or security issues. +Release updates, patches, and feature enhancements. +Provide technical support for users. Compare and contrast the Waterfall and Agile methodologies. Provide examples of scenarios where each would be appropriate. +Scenarios Where Each is Appropriate. + +When to Use Waterfall +Government or Regulatory Projects +Example: Building a tax calculation system where laws and rules are well-defined. +Large Infrastructure Projects +Example: Developing a banking system that requires strict compliance and documentation. +Manufacturing and Hardware Development +Example: Creating firmware for medical devices where changes are costly after production. + +When to Use Agile +Startups & Fast-Paced Industries +Example: A new e-commerce website that must adapt to user feedback. +Mobile App Development +Example: A social media app that evolves based on user engagement. +Software-as-a-Service (SaaS) Products +Example: Cloud-based collaboration tools (e.g., Slack, Trello) that require continuous updates. Describe the roles and responsibilities of a Software Developer, a Quality Assurance Engineer, and a Project Manager in a software engineering team. +1. Software Developer 🖥️ +A Software Developer is responsible for writing, testing, and maintaining the code that makes up a software application. + +Key Responsibilities: +1 Writing Code – Develops software applications using programming languages like Python, Java, JavaScript, etc. +2 Software Design – Designs system architecture, algorithms, and database structures. +3 Debugging & Troubleshooting – Identifies and fixes bugs in the software. +4 Code Optimization – Writes efficient, scalable, and maintainable code. +5 Version Control – Uses tools like Git to track changes and collaborate with the team. +6 Collaboration – Works closely with designers, testers, and project managers to meet project requirements. + + +2. Quality Assurance (QA) Engineer 🛠️ +A QA Engineer ensures that the software meets quality standards and is free of bugs before deployment. + +Key Responsibilities: +1. Test Planning – Creates test cases and testing strategies based on project requirements. +2. Manual & Automated Testing – Conducts functional, performance, security, and usability tests. +3 Bug Reporting – Identifies software defects and logs them in tracking tools like JIRA. +4 Regression Testing – Ensures new updates do not break existing features. +5 Collaboration with Developers – Works with developers to fix and validate bug fixes. +6 Ensuring Compliance – Verifies that the software follows industry standards and user expectations. + +3. Project Manager (PM) A Project Manager oversees the software development process, ensuring that projects are completed on time, within budget, and meet business goals. +Key Responsibilities: +1 Project Planning & Scheduling – Defines project scope, sets deadlines, and assigns tasks. +2 Team Coordination – Facilitates communication between developers, designers, and QA engineers. +3 Risk Management – Identifies potential roadblocks and finds solutions. +4 Stakeholder Communication – Provides project updates to clients and management. +5 Resource Management – Allocates team members, tools, and budget effectively. +6 Agile/Scrum Implementation – Manages sprints, stand-up meetings, and backlog grooming (if following Agile). Discuss the importance of Integrated Development Environments (IDEs) and Version Control Systems (VCS) in the software development process. Give examples of each. +1. Integrated Development Environments (IDEs) +What is an IDE? +An Integrated Development Environment (IDE) is a software application that provides a comprehensive set of tools to help developers write, debug, and test code efficiently. + +Importance of IDEs: +1. Code Editing & Autocompletion – Provides syntax highlighting, auto-suggestions, and code formatting to speed up development. +2. Debugging Tools – Includes built-in debugging features to help identify and fix errors. +3. Code Compilation & Execution – Allows developers to compile and run programs without needing external tools. +4. Project Management – Helps organize code files, dependencies, and libraries in a structured way. +2. Version Control Systems (VCS) +What is a VCS? +A Version Control System (VCS) is a tool that tracks changes to code over time, enabling developers to collaborate, revert to previous versions, and resolve conflicts. + +Importance of VCS: +1. Collaboration – Allows multiple developers to work on the same project without overwriting each other’s work. +2. History Tracking – Maintains a record of all code changes, making it easy to roll back to previous versions. +3. Branching & Merging – Enables developers to work on different features simultaneously without affecting the main codebase. +4. Backup & Recovery – Prevents data loss by storing code in remote repositories (e.g., GitHub, GitLab, Bitbucket). What are some common challenges faced by software engineers? Provide strategies to overcome these challenges. +1. Debugging and Fixing Complex Bugs +Challenge: + +Identifying and fixing complex bugs can be time-consuming and frustrating. +Some bugs may only appear in production or under specific conditions. +Strategies to Overcome: +i. Use debugging tools (e.g., Chrome DevTools, PyCharm Debugger, Visual Studio Debugger). +ii. Apply unit testing and logging to catch issues early. +iiiUse a systematic approach (binary search debugging, print/log statements). +iv. Leverage peer code reviews and pair programming for fresh perspectives. + +2. Keeping Up with Rapidly Changing Technologies 🚀 +Challenge: + +New programming languages, frameworks, and tools are constantly emerging. +Hard to stay updated while balancing project deadlines. +Strategies to Overcome: +i. Follow tech blogs, online courses, and podcasts (e.g., Medium, Dev.to, Coursera). +ii. Contribute to open-source projects to gain hands-on experience. +iii. Attend tech conferences, webinars, and workshops. +iv. Participate in coding challenges and hackathons. + +3. Managing Tight Deadlines & Workload +Challenge: + +Software projects often have unrealistic deadlines, leading to stress and burnout. +Unexpected scope changes can delay progress. +Strategies to Overcome: +i. Use Agile methodologies (Scrum/Kanban) for incremental progress. +ii. Break tasks into smaller, manageable chunks with clear priorities. +iii. Communicate realistic timelines with stakeholders. +iv. Automate repetitive tasks to save time (e.g., CI/CD pipelines). + +4. Handling Code Complexity & Technical Debt +Challenge: + +Over time, codebases become complex and harder to maintain. +Quick fixes lead to technical debt, making future development difficult. +Strategies to Overcome: +i. Follow clean coding principles and best practices (SOLID, DRY, KISS). +ii. Refactor code regularly to improve maintainability. +iii. Document important functions, algorithms, and design decisions. +iv. Use design patterns for scalable and reusable solutions. Explain the different types of testing (unit, integration, system, and acceptance) and their importance in software quality assurance. +1. Unit Testing +What It Is: +Focuses on testing individual components or functions of a software application in isolation. +Typically written by developers using testing frameworks like JUnit (Java), pytest (Python), Jest (JavaScript). +Importance: +✔️ Ensures each function or module works correctly before integration. +✔️ Detects bugs early in the development cycle, reducing future costs. +✔️ Supports refactoring by ensuring code changes do not break existing functionality. + +Example: +In an e-commerce app, a unit test would check if the calculateTotalPrice() function correctly sums up item prices. + +2. Integration Testing +What It Is: +Tests how different modules or components work together. +Ensures that interactions between APIs, databases, and services function correctly. +Importance: +✔️ Catches issues in communication between software components. +✔️ Helps detect data mismatches, API failures, or incorrect database interactions. +✔️ Ensures third-party integrations (e.g., payment gateways, external APIs) work correctly. +Example: +Testing if an order processing system correctly updates inventory after a user places an order. + +3. System Testing +What It Is: +Tests the entire software application as a whole to validate that it meets requirements. +Includes different testing types like performance, security, usability, and stress testing. +Importance: +✔️ Ensures the application works correctly in a real-world scenario. +✔️ Identifies system-wide defects, performance bottlenecks, and security vulnerabilities. +✔️ Ensures compliance with business and regulatory requirements. + +Example: +Testing an airline booking system by simulating thousands of users booking tickets simultaneously. + +4. Acceptance Testing +What It Is: +Validates whether the software meets business requirements and user expectations. +Conducted by end-users, clients, or stakeholders before deployment. +Types of Acceptance Testing: +User Acceptance Testing (UAT): Ensures the software meets user needs. +Alpha Testing: Performed by internal users in a controlled environment. +Beta Testing: Conducted by external users in a real-world environment. +Importance: +✔️ Confirms the software is ready for production and meets business goals. +✔️ Helps identify missing features or usability issues before launch. +✔️ Ensures customer satisfaction by aligning with user expectations. #Part 2: Introduction to AI and Prompt Engineering +What is Artificial Intelligence (AI)? +Artificial Intelligence (AI) refers to the simulation of human intelligence in machines that can learn, reason, and make decisions. AI systems can analyze data, recognize patterns, and automate complex tasks without explicit human intervention. + +Types of AI: +Narrow AI (Weak AI): Designed for specific tasks (e.g., Siri, Google Search). +General AI (Strong AI): Hypothetical AI capable of human-like reasoning across multiple domains. +Super AI: A future concept where AI surpasses human intelligence. +What is Prompt Engineering? +Prompt Engineering is the art of designing effective prompts to guide AI models (like ChatGPT) in generating relevant, high-quality responses. Since AI responds based on how queries are framed, crafting precise and structured prompts improves accuracy and usefulness. + + +Example: +Before launching a banking app, real customers test it to ensure transactions, UI navigation, and security features function properly. Define prompt engineering and discuss its importance in interacting with AI models. +Why is Prompt Engineering Important? +✔️ Helps AI generate more accurate, detailed, and context-aware responses. +✔️ Optimizes AI for tasks like content creation, coding, and automation. +✔️ Reduces misinterpretations and biases in AI-generated outputs. + + + +Provide an example of a vague prompt and then improve it by making it clear, specific, and concise. ExVague Prompt: +"Tell me about technology." + +🔴 Why It's Ineffective? + +Too broad—technology covers a wide range of fields (AI, software, hardware, communication, etc.). +Lacks direction—doesn’t specify what aspect of technology is needed. +Results may be general and unfocused. +Improved Prompt: +"Explain how artificial intelligence is transforming healthcare, with examples of real-world applications and future trends." +✅ Why This is More Effective? -Provide an example of a vague prompt and then improve it by making it clear, specific, and concise. Explain why the improved prompt is more effective. +Clear topic: Focuses on AI’s impact on healthcare. +Specific scope: Asks for real-world applications and future trends. +Concise & actionable: Guides AI to generate a detailed, relevant, and structured response.plain why the improved prompt is more effective.