蓝珲,博士,2016 年 06 月- 2017 年 07 月英国剑桥大学塞恩斯伯里实验室(SLCU)博士后 (Research Associate);2017 年 08 月-至今浙江师范大学教师。著作方向:软件工程、软件项目管理。所承担过的重点科研或教研项目:NSERC 项目《Combining classifiers to predict gene function in Arabidopsis thaliana using large-scale gene expression measurements》项目主要参与人,负责编写程序。NSERC Discovery项目《Genome-wide network model capturing seed germination reveals coordinated regulation of plant cellular phase transitions》项目主要参与人,负责编写程序。Gatsby Foundation项目《The evening complex coordinates environmental and endogenous signals in Arabidopsis》重要参与人,负责编写程序。浙江师范大学2020年校级重点建设教材项目《云软件工程Cloud Software Engineering》负责人。浙江师范大学数学与计算机科学学院2020年研究生课程、教材、教学改革案例建设项目《Lab Report Repository的开发、维护、Bug报告修复与持续改进》负责人。浙江师范大学数学与计算机科学学院2020年本科课程、教材、教学改革案例建设项目《云软件工程 Cloud Software Engineering》第一负责人。浙江师范大学数学与计算机科学学院2020年本科课程、教材、教学改革案例建设项目《软件工程基础》第二负责人。所从事的主要科研与教学工作及获奖情况:所发表论文总引用数超过300次(Web of Science数据)。Cambridge Network Day (2017年) Poster 一等奖。浙江师范大学第一届教师教学创新大赛(2021年)三等奖。
目錄:
Contents
Chapter 1 People’s Accountability1
1.1 Responsibility card2
1.2 Code ownership4
1.3 The produce-review cycle4
1.4 The indifferent customer5
Chapter 2 Building Teams6
2.1 Stating vision6
2.2 Starting small6
2.3 Characteristics of a quality software engineer7
2.4 Software health7
2.5 Being honest about development status8
2.6 Treasuring old code8
2.7 Meeting8
2.8 Who makes the final decision 9
2.9 Bus factor9
2.10 Joel test10
2.11 Evaluating team quality from four aspects11
2.12 Measuring productivity12
2.13 Training and employee retention rate12
2.14 Improving software process13
2.15 Data and statistics13
2.16 Territory13
2.17 Code review13
2.17.1 Pull request14
2.17.2 Code review plus edit16
2.17.3 Code review psychology18
2.18 Treating criticism as praise19
2.19 Automation ratio19
2.20 Code of conduct20
2.21 Software principles20
2.22 Roles22
2.23 Development time distribution23
2.24 Comment to code ratio24
2.25 The Apache Way24
2.26 Intellectual property and licenses25
2.27 Documentation25
2.27.1 Being easy to find, easy to search, and easy to update26
2.27.2 Being specific26
2.27.3 Providing links wherever available27
2.27.4 Documenting everything27
2.27.5 Learning from good examples27
2.27.6 Inspecting documentation28
Chapter 3 Reducing Complexity, Increasing Quality29
3.1 Source lines of code29
3.2 Say no to bloatware30
3.3 Software quality32
3.4 High quality is cheap32
3.5 Refactoring code33
Chapter 4 Cloud Infrastructure35
4.1 The pull request-centered collaboration model36
4.2 Remote working37
4.3 Email39
4.4 Mailing lists40
4.5 Git and GitHub41
4.5.1 The feature-branching workflow42
4.5.2 The fork-then-feature-branching workflow47
4.5.3 Gitea48
4.6 Kanboard49
4.7 Bugzilla51
4.7.1 Tracked bugs are good bugs52
4.7.2 The more bug reports, the better52
4.7.3 Do not accept duplicate bugs53
4.8 The Bugzilla-Kanboard-Gitea workflow53
4.9 Jenkins55
Chapter 5 Selected Topics in The Software’s Life Cycle56
5.1 Silver bullets56
5.2 Project checklist57
5.3 Fork59
5.4 Technical debt59
5.5 Timeboxing60
5.6 Reusing60
5.7 Tracking bugs60
5.8 Bug repairs61
5.9 Maintenance61
5.10 Being simple and quite63
5.11 Validation & verification63
Chapter 6 Requirements Risks64
6.1 Important questions to ask before development starts64
6.2 Risk analysis67
6.2.1 The danger of not having a software requirements specification67
6.2.2 The danger of having too many requirements68
6.2.3 The danger of not talking to customers69
6.2.4 The danger of preconceived ideas69
6.2.5 The danger of ambiguity71
6.3 Gathering requirements71
6.3.1 Use cases72
6.3.2 Requirements workshops73
6.3.3 Prototyping73
6.3.4 Brainstorming73
6.4 Prioritizing requirements75
6.5 Inspecting requirements76
6.6 Structure of SRS76
6.7 Common problems in SRS77
6.8 Change of requirements78
Chapter 7 Development82
7.1 Schedule and budget82
7.2 Processes83
7.2.1 Waterfall84
7.2.2 Extreme programming84
7.2.3 Adopting a balanced approach85
7.2.4 Iterative and evolutionary development85
7.2.5 DevOps: combining development and operations together85
7.2.6 Adhering to a process86
7.3 Project efforts87
7.4 Cost87
7.5 Design88
7.5.1 Design decisions89
7.5.2 Why is design difficult 89
7.5.3 Abstraction90
7.5.4 Simplicity91
7.5.5 Modularity91
7.5.6 Handling undesired events91
7.5.7 Formal inspections92
7.6 Naming variables92
7.7 Coding style94
7.8 Comments and code94
7.9 Programming languages94
7.10 Pace95
7.11 Versions96
7.11.1 Concise and informative commit messages96
7.11.2 Atomic commits and small pull requests97
7.12 Test-first, test-early and test-last97
7.13 Testing99
7.13.1 Spell and grammar checking101
7.13.2 Static code analysis101
7.13.3 Unit testing101
7.13.4 Usability testing102
7.13.5 Regression testing102
7.13.6 Code inspection and walkthrough105
7.13.7 Test coverage105
7.13.8 Test case density106
7.13.9 Test case quality106
7.13.10 Enough testing 107
7.13.11 The trade-off between automated testing and manual testing107
7.13.12 Test data generators107
7.13.13 Testing in a small software company108
7.14 Releasing108
7.15 Continuous improvement109
7.15.1 Continuous integration/continuous delivery109
7.15.2 Continuous deployment with Docker110
Chapter 8 Rules, Laws, and Plots114
8.1 10 Years Rule114
8.2 Eyeballs and bugs115
8.3 Fish in the pond115
8.4 Brooks’ Law115
8.5 Goodhart’s Law116
8.6 Cost to fix an error in different phases116
8.7 Development cost versus maintenance cost116
8.8 External quality versus internal quality117
Chapter 9 Maintenance Stories118
9.1 English Pal118
9.2 Child Physical Examination Booking Application119
9.3 The GNU Nano Editor120
9.4 Lab Report Repository124
9.4.1 Logging in with student number125
9.4.2 Regression126
9.4.3 Batch entering student numbers132
9.4.4 Showing assignments that missed the deadline135
9.4.5 A group member’s name appears more than once in group information136
9.4.6 Definition of done137
9.4.7. Other improvement areas for the Lab Report Repository web application138
Chapter 10 References140
Chapter 11 Appendices143
11.1 Original requirements for Lab Report Repository143
11.2 Correspondence between Ashly and the author on maintaining LRR145
11.3 Software engineers, software writers, and entrepreneurs148
11.4 End-to-end testing148
11.5 Kanboard installation guide151
11.6 Research questions152