This version of the 4156 checklist is for Fall 2023. A file containing the same checklist is at http://www.cs.columbia.edu/~kaiser/4156-background-checklist.Fall2023.txt. =========================================================================== The following is required background for COMS W4156 Advanced Software Engineering. If there's anything on this list that will not apply to you before the first day of class, then you are not prepared to take this course and should drop the course. Undergraduates, Bridge, 3-2, 4+1, etc. students at Columbia or Barnard should have already completed COMS W3157 Advanced Programming. Taking AP concurrently is not sufficient Graduate students from outside Columbia or Barnard should have two or more years programming experience. Read code, even if not write, in both Java and C - most code examples used in class will be in Java or C. Write code fluently in at least one of Java, C/C++ or Javascript/Node.js, at the full-stack or back-end level, not just front-end. The team project will be a server or service (NOT an app) implemented in your team's choice of Java, C++ or Javascript/Node.js. The course will not teach these or any other languages, you are required to already know Java, C/C++ or Javascript/Node.js. Python is not allowed and students who only know Python should not take this course. Maintain your own personal codebase(s) on github or similar version control repository. Search for and read (or watch) documentation and tutorials for software development tools, frameworks, APIs, libraries, etc. on your own, without instruction or assistance from the teaching staff. You have read chapter 1 of the "Software Engineering at Google" book at https://abseil.io/resources/swe-book/html/ch01.html and the "coping with hitchhikers and couch potatoes on teams" article at https://ieeexplore-ieee-org.ezproxy.cul.columbia.edu/stamp/stamp.jsp?tp=&arnumber=9625655 and still want to take this class. =========================================================================== In addition to the above list, experience with the following constitutes ideal background but is not required. You will almost certainly have experience with these *after* completing the course, but they are not really "taught" in the course - you are expected to learn them on your own (see above wrt reading documentation). Build tool / package manager like Maven, Gradle, MSBuild, NPM. Code editor or IDE like VS Code, IntelliJ, Eclipse. Participate in shared (team) repository on github, including forking, branching, pull requests and merging. Reading and writing persistent files on disk. Reading and writing key-value, nosql, sql, or any other kind of persistent database on disk. ============================================================================ The following lists some advanced background, most of which will be taught in the course. If you already have expertise in most of the topics below, plus all of those above, please contact the instructor at kaiser+4156@cs.columbia.edu about serving a special leadership role in the course that will guarantee a good grade if you do it well. (If you are already in communication with Prof. Kaiser about this, no need to reply again.) Unit testing using an automated test runner Equivalence partitions and boundary analysis for choosing test inputs Test oracles for writing test assertions Mocking Logging Branch coverage Integration testing End-to-end system testing Continuous integration (CI) using Github Actions/Workflows Using a local API/library/framework beyond I/O, strings, math (accessed within same process) Using a remote API (accessed over network) Implementing your own local API/library/framework (accessed within same process) Implementing your own remote API (accessed over network) ============================================================================