BIL481: Software Engineering

Computer Engineering Department, TOBB University of Economics and Technology
Fall 2017
MT 14:30-16:20
371
4 units
Instructor: Asst. Prof. Dr. Cagdas Evren Gerede
Office hours: by appointment

Course Summary

This course provides an overview of the state of the art in software engineering. Topics include software design, development, comprehension, testing, debugging, static analysis, coding guidelines, code reviews, configuration management, releasing, scaling, monitoring, a/b testing, refactoring. The course tries to combine theory and practice. Students will be involved in modifying big open source software projects in teams. Students will also experience the challenge of comprehending and extending/fixing existing software with new features/bug fixes, an essential skill expected from all software engineers nowadays. The overall goal of this course is to teach students how to build software that can have long lifetime.

Supplemental resources:

Grading (approximate)

Policies

All coding assignments have to be designed and implemented individually. Any other case is considered cheating.

No course notes or slides are provided. Please come to classes with pen and paper. Taking notes should help to stay in focus during the classs and would be useful when studying for the exams.

Coding is essential part of this course. If you are not comfortable reading and writing in at least one programming language, consider taking this class later.

Schedule

Week/Hour
Topic
Read / Watch / Exercise
Assignment / Announcement





Introduction
Introduction
Student's Guide to Grand Failure (anti-patterns)
Teaching Future Software Developers by Vaclav Rajlich


Git from bottom up

Git building blocks:
  • Blob (SHA1, content based hashing, why not using the regular file concept)
  • Tree (Structure, How different is it from a file system snapshot)
  • Commit
The Git Parable
Git from bottom up
Git Design Decisions try.github.io
Git Cheatsheet


Git from bottom up

Git core concepts:
  • Commit history
  • Branch
  • HEAD
  • Working tree
  • Index (staging)
  • Repository (local, remote)
Git core concepts in action:
  • Initializing a repository
  • Examining object signatures
  • Examining heads, the HEAD, the HEAD logs
  • Examining a blob, tree, commit
  • Examining the working tree and the staging
  • Examining the ref log
  • Repository (local, remote)
  • Ignoring files
Git core commands: add, commit, reset, checkout, log, diff, stash, merge, rebase

Pragmatic ABCs of a Software Engineer
  • Setting up Software Development Infrastructure
    • Setting up a code repository: GitHub
    • Working with a remote repository (pull, fetch, push, resolving merge conflicts, README.md)
    • Unit testing: JUnit
    • Dependency management and building: make, ant, maven
    • Continous Integration: TravisCI
    • Automated static analysis: code climate
    • Automated deployment: Heroku
  • Contributing to open source projects
    • Issue trackers
    • Different styles of contributing
    • Forking
    • Pull Request (Merge request)
    • Code reviews:
      • Following coding styles
      • The lint tools (pylint, jslint etc.)
      • Convincing the reviewers
      • Understading the diff output
      • More integrated review tools: Gerrit
    • Case Study: OpenJDK
    • Case Study: GitLabs
  • Making small modifications in a large software code base
    • finding things in the code
    • finding people to blame
    • trial and error learning
    • understanding the control flow
    • analyzing the impact
    • getting ready for a code review
Code Style Guide for Contributors to Android Examining openjdk project
Example merge request
Syncing a fork
Successful git branching model
Distributed workflows Git reset demystified
code review
List of tools for code review
New Assignment Announcement

Description: Setup your individual GitHub repository with continuous integration and automated static analysis
Link: To be posted here or in Piazza


Program Analysis
  • Static vs. Dynamic Analysis
  • Abstract Representations for Software
    • Abstract Syntax Tree
    • Control Flow Graphs
    • Buchi Automata
  • Statement Dependence
    • Control Dependence
    • Data Dependence
    • Slicing (Forward, Backward)
    • Chops, Backbones, Dices
  • ANTLR4
    • Building lexers/parsers
    • Examining ASTs
    • Performing static analysis
  • Visitor Design Pattern
Program Analysis
Static Analysis
Dynamic Analysis
ANTLR4
Announcement
Project teams

New Assignment Announcement (Project)
Team Assignment 1
What:
  • Project selection
    • 2 minute screen capture demo of current software version
    • Link to forked github repository
    • Each member makes a dummmy git commit to forked repository (Web commits not allowed)
  • Meeting notes of the team meeting (Participants, Place, Time, Summary of Discussion)




New Assignment Announcement (1st coding assignment)

Description: To be posted here in Piazza
Link: To be posted here or in Piazza



Building Software Platforms, Frameworks, Services, Libraries
  • Stages of building reusable software
  • Ways to reuse software
  • Design
    • separation of concerns
    • dependency injection
    • inversion of control
  • API design
    • open/closed principle
  • Architectural design patterns
    • model view controller
    • asynchronous token pattern
    • broker pattern
    • simulating multiple threads with single thread
  • Intent specification with java annotations
  • Code generation: extending javac compiler with annotation processors


New Assignment Announcement (Project)
Team Assignment 2
Due: February 27
What: Link to team backlog. Each issue has to be described in detail. Each issue has to be assigned to a team member.

New Assignment Announcement (2nd coding assignment)
Description: To be posted
Link: To be posted here or in Piazza



Software Development Processes
  • Waterflow, agile, scrum, kamban
  • Scrum
    • backlog creation
    • sprint planning
    • sprint
    • standups
    • demo and retrospective
  • Release and version planning
  • Pushing updates to staging and production systems without breaking the live system
  • Team roles
    • product manager, project manager, tech lead, developer, tester, build cop, infrastructure engineer, operations, UX, manager, push czar
  • Project Management Lessons
    • Mythical Man Month
    • Second System Syndrome
  • Essays from Conteporary Software Engineers
    • Joel Spolsky
Formal verification Profiling



Testing, Verification, Measuring, Monitoring, Alerting
  • Testing and Test Automation
    • Unit testing (JUnit, pyunit), Mocking and stubbing
    • Test Coverage
    • Integration tests, End-to-End tests
    • UI testing: Selennium
    • Regression testing
    • Load testing
    • Manual testing
  • Model checking and verification
    • Modeling software systems: transition systems
    • Specification expectations: Linear Temporal Logic
  • Measuring
    • Metrics
      • Availabiliy
      • Latency
      • Response time
      • Capacity
      • CPU, memory, bandwidth
      • Request per second
    • Profiling
    • From logs
    • From live signals
    • Defining KPIs (metrics)
  • Monitoring and Alerting
    • Detecting problems
    • Graphing
    • Alerting
  • Experimentation
    • Providing options
    • A/B testing
Demo Yapma Rehberi
Software Metrics
Connascence


New Assignment Announced (3rd coding assignment)
Due: March 20
Description: To be posted
Link: To be posted here or in Piazza

Designing Robust Software Systems and Expressing Them to Other Engineers
  • Importance of common terminology
  • Design patterns
  • Using diagrams
  • UML
    • class diagrams
    • sequence diagrams
    • state diagrams
    • collaboration diagram
  • Case study: Design a high traffic Web service
    • System architecture
    • Caching
    • Load balancer
    • Asynchronous vs. Synchronous interaction
    • Message Queues, push notifications
    • REST
  • Case study: Design Whatsapp mobile application







Software complexity metrics, software quality and program comprehension
  • Writing software vs. reading software
  • Readability
  • Using Conventions
  • Effects of Dynamic Typing
  • Effects of Asynchronous Programming
  • Effects of Inversion of Control
  • Effects of Layers
  • Metrics
    • Coupling/Cohesion
    • Connascence
  • Measuring Documentation Quality
  • Pragmatic techniques to improve the readability of code fragments
Demo Yapma Rehberi


Coding assignment 3 (demo)

Getting Ready for Software Engineer Job Interviews (Silicon Valley)
  • From the applicant's perspective
  • From the interviewer's perspective



Closing Demo Yapma Rehberi Project final demo