=========================================================================== This quarter, we will think deeply about the software development process. This will be useful no matter what you eventually do. The main activity of the class is a group project, in which you will implement or evaluate a software engineering tool. You will learn software engineering by doing it, and you will learn software engineering by thinking about the process. You get to scratch your own itch by solving some development challenge that has bothered you. Furthermore, the results of your project might help other programmers! =========================================================================== What is software? It's a recipe for achieving some goal. It's a set of instructions that, when performed, transform information in one form into information in another form. =========================================================================== What comprises a software system (what are the parts of a software system)? * code * tests * documentation * version control history * bug tracker * build system * ... much more! =========================================================================== What tasks does a developer perform? ---------------- Initial development: design: decompose into modules * determine quality of the design write specifications write code * code completion * what part of a library to use, how to use it write documentation * method-level * tutorials write tests * inputs * oracles integration deployment where to devote extra QA time * which modules are most error-prone or have latent errors? ---------------- Maintenance: security review (injection attacks, more) optimization/performance tuning refactoring code review code understanding or reverse engineering (often necessary, not an end in itself) debugging/bug fix or feature request * for bugs: * is it actually a bug * reproduce it * minimize the test case * who should fix it? * what is the relevant code? * what are the impacts of this cahneg? * on functionality * on code structure (modules, architecture) =========================================================================== Types of projects: * automate a manual task * detect/prevent an error * choose one that bugs you * extend a tool * new functionality * re-implement (new programming language, toolset, etc.) * evaluate a tool * (evaluation by the authors can be biased) * do a realistic case study * controlled experiment * compare to another tool * (evaluation usually leads to new ideas -- it is the best way to do so) * evaluate a methodology * statically-typed vs. dynamically typed languages * test-first design better * is OO design better? * (this is probably not a good idea) Scratch your itch! =========================================================================== Schedule: * Monday * lecture: introduction * Tuesday * due (noon): form pairs (for the proposal only) * Wednesday * due before lecture: reflection about challenges/problems during software development (individual assignment) * lecture: example projects * Thursday: * due (11pm): project proposal (in groups of 2) * Friday * lecture: project proposal presentations (in groups of 2) ===========================================================================