抱歉,这篇文章来得晚了一些。
这个学期,一共 6 次作业,其中 2 次个人作业,4 次团队作业。坦白说,这个作业量,其实偏少了,但是考虑到这个学期情况特殊,本来时间少,数量上只能委屈一下了。我是想说,这个学期碰巧我工作繁忙, 6 次作业对我来时简直是不能更期待的利好,但是特别指出这一点,期待各位同学不要以此为止境:本来工业届和学术届就有不少差别,而且这还是一门实践性非常强的学科,你们这个学期的工作量还是远远不能够的。
总结起来,整个学期,大家的问题有计算机大学生普遍的共性,也各有自己的自身情况。在第一次作业中,不知道各位提到的迷茫,无奈现在有好的解决没?原来踌躇满志的同学,现在还记得自己的初心嘛?原来想过安逸的生活,觉得自己随便就好的佛系同学,现在有什么其他想法嘛?如果你有空,期待你可以自己看看自己写的之前的几个博客,做过的作业,或许你有新的认知。下面,是我期待大家可以做得更好的地方:
- 期待你们可以找到正确的软件开发认知,怎么做需求分析,怎么安排时间,怎么分工合作
- 这次课程大家选择的项目其实大部分都太大了,期待大家以后不要太眼高手低,着眼做好小而美
- 搭便车的同学还是太多了
- 编码能力和强度都太弱了,这是必须要提高的地方,希望大家不要以此结束,抓紧时间多做几个项目(你们的大学生活其实不多了,不要等到找工作才去补救)
- 不会使用工具(例如版本控制),不会测试(问题非常严重)
最后,关于我自己,坦白说,这次课程我也有很多不够尽力尽责的地方,批改作业有点迟缓,期待大家谅解。
关于课程管理,感觉如果满打满算一个完整的软件工程课程,我有如下建议(也是这学期做得不够的地方):
- 一个助教可能只能服务 20 - 30 个学生,5 个左右团队
- 团队成员不建议超过 4 个人
- 必须从一开始使用版本控制,每次作业都 commit 到 Github (或者类似的地方)
- 有完整的软件实践:代码必须有测试,发布要有 alpha / beta
最后,附上 4 个班级的千帆图,这个网页代码如下,我并没有区分每个班级,期待同学中有人去完善它吧(如果作为寒假小作业怎样?):
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!--<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=0' />-->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Scores</title>
</head>
<body>
<canvas id="students-scores" width="1024" height="2048"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script>
<script>
var students = [{"id":"201421121091","reading":0,"analytics":0,"teamId":0,"memberScore":0},{"id":"201521121054","reading":10,"analytics":10,"teamId":13,"memberScore":16},{"id":"201521121050","reading":10,"analytics":9,"teamId":13,"memberScore":16},{"id":"201521121001","reading":8,"analytics":9,"teamId":7,"memberScore":13},{"id":"201521121006","reading":8,"analytics":9,"teamId":7,"memberScore":13},{"id":"201521121003","reading":9,"analytics":10,"teamId":7,"memberScore":10},{"id":"201521121096","reading":10,"analytics":10,"teamId":9,"memberScore":10},{"id":"201521121099","reading":9,"analytics":9,"teamId":9,"memberScore":10},{"id":"201521121029","reading":9,"analytics":8,"teamId":12,"memberScore":14},{"id":"201521121123","reading":9,"analytics":8,"teamId":3,"memberScore":14},{"id":"201521121104","reading":8,"analytics":9,"teamId":5,"memberScore":10},{"id":"201521121011","reading":7,"analytics":8,"teamId":7,"memberScore":9},{"id":"201521121116","reading":7,"analytics":8,"teamId":3,"memberScore":14},{"id":"201521121076","reading":6,"analytics":8,"teamId":9,"memberScore":10},{"id":"201521121112","reading":10,"analytics":8,"teamId":3,"memberScore":9},{"id":"201521121060","reading":10,"analytics":8,"teamId":4,"memberScore":10},{"id":"201521121066","reading":9,"analytics":8,"teamId":12,"memberScore":9},{"id":"201521121055","reading":10,"analytics":8,"teamId":6,"memberScore":10},{"id":"201521121030","reading":10,"analytics":8,"teamId":11,"memberScore":10},{"id":"201521121043","reading":10,"analytics":8,"teamId":11,"memberScore":10},{"id":"201521121081","reading":7,"analytics":9,"teamId":2,"memberScore":10},{"id":"201521121002","reading":9,"analytics":6,"teamId":4,"memberScore":10},{"id":"201521121044","reading":6,"analytics":8,"teamId":12,"memberScore":9},{"id":"201521121073","reading":9,"analytics":10,"teamId":15,"memberScore":10},{"id":"201521121075","reading":8,"analytics":8,"teamId":15,"memberScore":10},{"id":"201521121020","reading":10,"analytics":9,"teamId":1,"memberScore":10},{"id":"201521121025","reading":9,"analytics":0,"teamId":11,"memberScore":10},{"id":"201521121021","reading":9,"analytics":8,"teamId":1,"memberScore":10},{"id":"201521121013","reading":6,"analytics":8,"teamId":10,"memberScore":8},{"id":"201521121115","reading":8,"analytics":0,"teamId":14,"memberScore":9},{"id":"201521121053","reading":10,"analytics":10,"teamId":8,"memberScore":16},{"id":"201521121058","reading":9,"analytics":9,"teamId":16,"memberScore":20},{"id":"201521121012","reading":9,"analytics":8,"teamId":7,"memberScore":9},{"id":"201521121018","reading":9,"analytics":7,"teamId":7,"memberScore":9},{"id":"201521121032","reading":9,"analytics":10,"teamId":8,"memberScore":10},{"id":"201521121035","reading":8,"analytics":8,"teamId":8,"memberScore":12},{"id":"201521121040","reading":9,"analytics":10,"teamId":6,"memberScore":10},{"id":"201521121051","reading":9,"analytics":8,"teamId":8,"memberScore":10},{"id":"201521121049","reading":8,"analytics":8,"teamId":13,"memberScore":7},{"id":"201521121047","reading":9,"analytics":9,"teamId":6,"memberScore":10},{"id":"201521121042","reading":9,"analytics":9,"teamId":11,"memberScore":10},{"id":"201521121045","reading":7,"analytics":8,"teamId":13,"memberScore":7},{"id":"201521121041","reading":9,"analytics":8,"teamId":6,"memberScore":10},{"id":"201521121046","reading":10,"analytics":7,"teamId":6,"memberScore":10},{"id":"201521121034","reading":9,"analytics":8,"teamId":8,"memberScore":8},{"id":"201521121057","reading":7,"analytics":8,"teamId":8,"memberScore":10},{"id":"201521121036","reading":8,"analytics":8,"teamId":6,"memberScore":10},{"id":"201521121037","reading":8,"analytics":8,"teamId":6,"memberScore":10},{"id":"201521121056","reading":8,"analytics":8,"teamId":8,"memberScore":8},{"id":"201521121033","reading":8,"analytics":8,"teamId":11,"memberScore":10},{"id":"201421121039","reading":6,"analytics":9,"teamId":6,"memberScore":10},{"id":"201521121048","reading":7,"analytics":8,"teamId":6,"memberScore":10},{"id":"201421121106","reading":6,"analytics":6,"teamId":16,"memberScore":15},{"id":"201521121039","reading":7,"analytics":7,"teamId":8,"memberScore":8},{"id":"201521121052","reading":7,"analytics":7,"teamId":8,"memberScore":8},{"id":"201521044223","reading":5,"analytics":8,"teamId":6,"memberScore":10},{"id":"201521121062","reading":8,"analytics":8,"teamId":15,"memberScore":10},{"id":"201521121061","reading":8,"analytics":0,"teamId":15,"memberScore":10},{"id":"201521121017","reading":7,"analytics":8,"teamId":10,"memberScore":8},{"id":"201521121015","reading":6,"analytics":8,"teamId":10,"memberScore":8},{"id":"201521121038","reading":9,"analytics":6,"teamId":10,"memberScore":7},{"id":"201521121059","reading":5,"analytics":7,"teamId":14,"memberScore":9},{"id":"201321121050","reading":0,"analytics":0,"teamId":0,"memberScore":0},{"id":"201421121025","reading":0,"analytics":0,"teamId":0,"memberScore":0},{"id":"201521121063","reading":10,"analytics":10,"teamId":9,"memberScore":10},{"id":"201521121064","reading":10,"analytics":10,"teamId":5,"memberScore":10},{"id":"201521121007","reading":10,"analytics":8,"teamId":7,"memberScore":9},{"id":"201521121084","reading":10,"analytics":6,"teamId":2,"memberScore":18},{"id":"201521121086","reading":8,"analytics":10,"teamId":5,"memberScore":10},{"id":"201521121016","reading":8,"analytics":8,"teamId":7,"memberScore":9},{"id":"201521044118","reading":10,"analytics":10,"teamId":4,"memberScore":10},{"id":"201521121065","reading":10,"analytics":6,"teamId":5,"memberScore":10},{"id":"201521121088","reading":8,"analytics":8,"teamId":5,"memberScore":10},{"id":"201521121092","reading":8,"analytics":8,"teamId":5,"memberScore":10},{"id":"201521121093","reading":10,"analytics":6,"teamId":5,"memberScore":10},{"id":"201521121004","reading":8,"analytics":6,"teamId":7,"memberScore":9},{"id":"201521121078","reading":10,"analytics":8,"teamId":2,"memberScore":10},{"id":"201521074029","reading":10,"analytics":6,"teamId":4,"memberScore":10},{"id":"201521121077","reading":8,"analytics":8,"teamId":4,"memberScore":10},{"id":"201521121083","reading":10,"analytics":8,"teamId":2,"memberScore":8},{"id":"201521121089","reading":8,"analytics":8,"teamId":2,"memberScore":10},{"id":"201521121019","reading":8,"analytics":6,"teamId":12,"memberScore":9},{"id":"201521121068","reading":8,"analytics":6,"teamId":4,"memberScore":10},{"id":"201521121085","reading":4,"analytics":6,"teamId":5,"memberScore":10},{"id":"201521121082","reading":6,"analytics":6,"teamId":13,"memberScore":7},{"id":"201521121080","reading":10,"analytics":6,"teamId":2,"memberScore":8},{"id":"201521121005","reading":8,"analytics":6,"teamId":11,"memberScore":10},{"id":"201521121087","reading":10,"analytics":8,"teamId":5,"memberScore":0},{"id":"201521121079","reading":6,"analytics":6,"teamId":2,"memberScore":8},{"id":"201521121090","reading":4,"analytics":6,"teamId":2,"memberScore":10},{"id":"201521121074","reading":8,"analytics":0,"teamId":11,"memberScore":10},{"id":"201521121067","reading":10,"analytics":8,"teamId":10,"memberScore":7},{"id":"201521121071","reading":6,"analytics":6,"teamId":10,"memberScore":7},{"id":"201421121061","reading":0,"analytics":0,"teamId":16,"memberScore":0},{"id":"201521121091","reading":2,"analytics":0,"teamId":0,"memberScore":0},{"id":"201421121097","reading":0,"analytics":0,"teamId":0,"memberScore":0},{"id":"201521121097","reading":10,"analytics":10,"teamId":9,"memberScore":10},{"id":"201521121009","reading":10,"analytics":8,"teamId":13,"memberScore":9},{"id":"201521121098","reading":8,"analytics":8,"teamId":9,"memberScore":10},{"id":"201521121122","reading":10,"analytics":10,"teamId":3,"memberScore":9},{"id":"201521121026","reading":10,"analytics":8,"teamId":12,"memberScore":9},{"id":"201521121100","reading":8,"analytics":10,"teamId":3,"memberScore":9},{"id":"201521121111","reading":6,"analytics":6,"teamId":9,"memberScore":10},{"id":"201521121101","reading":8,"analytics":8,"teamId":3,"memberScore":9},{"id":"201521121103","reading":8,"analytics":6,"teamId":3,"memberScore":9},{"id":"201521121117","reading":8,"analytics":6,"teamId":3,"memberScore":9},{"id":"201521121010","reading":4,"analytics":6,"teamId":13,"memberScore":8},{"id":"201521121105","reading":4,"analytics":6,"teamId":3,"memberScore":9},{"id":"201521121114","reading":6,"analytics":4,"teamId":3,"memberScore":9},{"id":"201521121119","reading":8,"analytics":10,"teamId":14,"memberScore":13},{"id":"201521121022","reading":10,"analytics":6,"teamId":1,"memberScore":10},{"id":"201521121108","reading":2,"analytics":6,"teamId":2,"memberScore":8},{"id":"201521121023","reading":6,"analytics":6,"teamId":1,"memberScore":10},{"id":"201521121024","reading":6,"analytics":6,"teamId":1,"memberScore":10},{"id":"201521121110","reading":6,"analytics":10,"teamId":10,"memberScore":8},{"id":"201521121095","reading":8,"analytics":8,"teamId":10,"memberScore":7},{"id":"201521121031","reading":2,"analytics":10,"teamId":10,"memberScore":8},{"id":"201521121094","reading":6,"analytics":6,"teamId":10,"memberScore":7},{"id":"201321121074","reading":0,"analytics":0,"teamId":16,"memberScore":10},{"id":"201521121107","reading":6,"analytics":2,"teamId":14,"memberScore":12},{"id":"201521121113","reading":0,"analytics":4,"teamId":16,"memberScore":5},{"id":"201521121109","reading":4,"analytics":6,"teamId":14,"memberScore":9},{"id":"201521121121","reading":0,"analytics":8,"teamId":14,"memberScore":9},{"id":"201521121118","reading":0,"analytics":6,"teamId":14,"memberScore":9},{"id":"201421121041","reading":0,"analytics":0,"teamId":0,"memberScore":0},{"id":"201321122029","reading":0,"analytics":0,"teamId":0,"memberScore":0}];
var teams = [{"teamId":1,"teamName":"605","projectName":"基于深度学习的语音识别系统","background":9,"requirement":6,"design":5,"implement":5,"presentation":6},{"teamId":2,"teamName":"破阵子·青铜","projectName":"趣盒","background":10,"requirement":8,"design":7,"implement":6,"presentation":9},{"teamId":3,"teamName":"没有组名","projectName":"辅导员辅助系统","background":10,"requirement":10,"design":6,"implement":6,"presentation":10},{"teamId":4,"teamName":"鲤鱼与红鲤鱼与绿鲤鱼与驴与绿鱼","projectName":"学习行为平台分析","background":9,"requirement":7,"design":8,"implement":7,"presentation":10},{"teamId":5,"teamName":"The Sky line","projectName":"兼并兼(大学生兼职APP)","background":10,"requirement":10,"design":7,"implement":8,"presentation":10},{"teamId":6,"teamName":"小盘子的小组","projectName":"魔幻宝贝成长","background":8,"requirement":8,"design":9,"implement":6,"presentation":9},{"teamId":7,"teamName":"小拖车","projectName":"云菜-网上订菜系统","background":10,"requirement":10,"design":10,"implement":8,"presentation":10},{"teamId":8,"teamName":"软工愣头青","projectName":"记账小能手","background":10,"requirement":7,"design":9,"implement":7,"presentation":9},{"teamId":9,"teamName":"TAH","projectName":"共享车位","background":10,"requirement":10,"design":8,"implement":8,"presentation":10},{"teamId":10,"teamName":"大吉大利 今晚加班","projectName":"伴旅","background":8,"requirement":6,"design":4,"implement":2,"presentation":9},{"teamId":11,"teamName":"新建小组1","projectName":"项目对接","background":9,"requirement":8,"design":6,"implement":7,"presentation":10},{"teamId":12,"teamName":"墙都不扶就服我们组","projectName":"校声(校园生活类网站)","background":9,"requirement":8,"design":10,"implement":5.9,"presentation":10},{"teamId":13,"teamName":"Let It Be(LIB)","projectName":"基于ASP.NET+SQL的辅导员辅助系统","background":9,"requirement":9,"design":10,"implement":8,"presentation":10},{"teamId":14,"teamName":"软工颜值担当","projectName":"记账","background":9,"requirement":7,"design":6,"implement":0,"presentation":5},{"teamId":15,"teamName":"小组15","projectName":"社团管理","background":9,"requirement":6,"design":7,"implement":6,"presentation":8},{"teamId":16,"teamName":"小组16","projectName":"网络订餐平台","background":8,"requirement":9,"design":8,"implement":5.9,"presentation":7}];
</script>
<script>
var teamMap = teams.reduce((m, t) => {
m[t.teamId] = t;
return m;
}, {});
var data = {
// The type of chart we want to create
type: 'line',
// The data for our dataset
data: {
labels: ["0", "阅读博文", "软件案例", "团队作业 - 项目背景", "团队作业 - 软件需求", "团队作业 - 软件设计", "团队作业 - 软件实现", "团队作业 - 项目展示"],
datasets: students.map(student => {
var team = teamMap[student.teamId] || {background: 0, requirement: 0, design: 0, implement: 0, presentation: 0};
var scores = [0, student.reading];
var memberScoreAvg = student.memberScore / 5;
scores.push(scores[scores.length - 1] + student.analytics);
scores.push(scores[scores.length - 1] + team.background + memberScoreAvg);
scores.push(scores[scores.length - 1] + team.requirement + memberScoreAvg);
scores.push(scores[scores.length - 1] + team.design + memberScoreAvg);
scores.push(scores[scores.length - 1] + team.implement + memberScoreAvg);
scores.push(scores[scores.length - 1] + team.presentation + memberScoreAvg);
var color = `rgb(${[255, 255, 255].map(c => Math.floor(c * Math.random())).join(",")})`;
var result = {
label: student.id,
backgroundColor: color,
borderColor: color,
fill: false,
data: scores,
}
return result;
}),
},
options: {
animation: {
duration: 0, // general animation time
},
}
};
var ctx = document.getElementById("students-scores");
var chart = new Chart(ctx, data);
</script>
</body>
</html>