秋末冬初的一份软工“燃尽”录像带

描述

--------------------------- 🔴REC NO.102202123 ▶ ---------------------------

- 1 - 回顾单位:一季度

1-1 目标与期许

✏️随笔0907
现在回去翻看第一篇博客是有点意外的。
一开始设定目标和期许的时候,更多的是出于对一门课该做到什么样的考虑,加上对自己能力的掂量,轻飘飘地写下了这篇随笔。
换句话说,我是并不抱什么期望写下的,而且我对这门课完全没有概念,甚至我经常会问,非软工专业的为什么会学SE?
发自内心地感到不解

*再具体的感受还等我在后文娓娓道来,其实现在已经完全改观orz

回顾完当时的心情,再观三个月的经历

1.关于目标

  • 代码量: 未细算,但截至目前总量肯定已破w
    赢合系 有双人万行代码, 福小研 更是大工程)
  • 兴趣方向实践: DB、DS的学习与构建应用 在本学期均有实践
    (更多是云端部署,创建与调用云数据库与云函数)

2.关于期望

  • 团队协作: 经历了一次结对和一次组队,我认为在这过程我也有所沉淀
    结对过程中,真切地实行了一人编程一人观察补充的模式,充分的交流、更直接迅速的讨论、一阵见血的错误排查,完全打破了之前认为这样效率低的印象
    组队过程中,人多就难以调控,容易产生分歧也是体会到了。虽然主要调节组内氛围的人不是我,但也试图安抚过小组成员的情绪,及时与组长沟通反馈。
    更重要的是,在躁动中稳住自己的心态,保证软工任务的完成的同时协助组长做出适当决策吧(做得也不够,真的很感谢组长的督促与调节,很快又回归正轨啦)
  • 了解软件工程: 我在最后一次软工作业的感想中也说过,这次大作业应该是第一次比较系统地根据软件工程的标准与流程进行的一个项目,受益匪浅
    真的感受到编程只是其中的一个小部分。
    无数次的开会,前期调研的百份问卷,苦做的百页大原型,项目具体设计的敲定,措手不及的汇报准备,差点中道崩殂在环境配置下的自动化单元测试,还有伟大的上线部署!
    在课上让大家扫码测试后看到数据库里满当当的新数据,真正觉得成果是具象化的,回顾才知道,我们真的一起做了很多事情。

3.关于不足

  • 技术有待提高 我对接口调用的技术了解尚浅,在过程中突破自我的水准还是较低。
  • 思考创新能力低 想法都比较保守,做事不够灵活
  • 缺少规范化意识 例如数据库的创建,其实多张表可以合并但没有做好
  • 专业水平仍待提升 对于软工中的设计原则和标准,完成的都还不够好
    很直接的就是,现在去看写完的代码,其实有很多重复模块,可以合并同类项。如高内聚低耦合就更难评了,基本上没有在这种专业意识下编程

1-2 投入与产出

三个月说长不长,说短不短,时间轴上见真工夫
其实后续也做了很多别的学科的作业,但好像就数软工
付出了最大的时间与经历,磨灭了最多耐心与兴致,也收获了最深刻的知识和记忆

软工实践的各次作业汇总

作业 项目名称 参与部分 花费时间 代码数
第一次个人作业 1.AI与平台(博客园、GitHub)使用学习
2.新定位、新目标、新期许
3.初始软件工程
3小时 0行
第二次个人作业 清凉一夏 设计了类似羊了个羊的消消乐小游戏
1.夏日清凉水果ui、音效设计
2.游戏道具设计
3.三轮难度递增制度
20小时 506行
第一次结对作业 赢合系 调研思考与原型模型设计
(实话说不大记得具体负责的模块了)
只记得后续的页面改善设计
26小时 0行
第二次结对作业 赢合系 编程环节
基本都参与了,主要负责
1.发帖(招募队友、自我推荐)
2.我的页面
3.最后的完善和微调
57小时 1827行
第一次团队作业 福小研 原型设计组
1.读书魂页面设计
2.后续原型改善工作
9小时 0行
第二次团队作业 福小研 1.用户端原型设计(在上一次的基础上进行大升级)
2.后台管理原型
24小时 0行
现场编程 福小记 1.我的页面
2.整合代码
3小时 313行
alpha冲刺 福小研 1.读书魂首页
2.静态学情分析页面
3.自习室
4.我的任务首页显示
5.打卡发帖初步编程
44小时 3076行
beta冲刺 福小研 1.读书魂学情分析功能修改
2.打卡分享实现
3.自习室排行榜霸榜功能
4.福币日常任务完成状态
5.完善读书魂界面功能
25小时 1391行
总结 211小时 7113行

在软件工程课程上花费的时间

根据不完全统计,花费时间如下:

累计时间 实际周均时间(0908-1130约12周) 预计周均时间
211(h) 17.5(h) 12(h)

1-3 痛苦并快乐

如题,难忘其实是复杂情绪的载体。
苦中作乐是这门课的主色调,但好在结果是满载而归。
感觉整个过程都值得记录每一次都在燃尽自己写作业
无尽的难题,但有靠谱的队友,都是难忘的

1.赢合系

国庆假期还在赶生赶死的赢合系(国庆假期魂兮归来orz)

这是第一次接触软件编程,在此之前我belike:我做软件,真的假的?

图片

实际也是,初次做软件,我和搭档花费了很多时间研究平台、软件等,
比如敲了所谓“水课”做软工痛失平时分,不然就是一下课就在找空教室赶工,还有国庆的学习中心双排

附上图片👇

描述 描述 描述

记忆点①——平台熟悉
考虑到时间较短,我们选择了较易上手开发的微信开发者工具平台。但在申请云空间到部署云开发的前期准备都进行了一定的尝试,才得以进入开发阶段。
微信小程序的页面开发是“四位一体”的:wxml+wxss+js+json构成一个page。在ai协助下,我们熟悉了这个开发模式整整一天,第二天也算是在半生半熟间试错。
起初就发现了最后的发行可能会有问题(审核严格难以通过),但仍在应用学习阶段,加之时间紧迫暂时搁置了,也给后面的测试、发行更新等埋下伏笔。

记忆点②——交互性设计
起初,我们认为聊天功能的实现会较困难,所以另辟蹊径想出了通过评价模式提高用户交互性(这之后也作为了这个项目的亮点之一)
然而结果是,还是得硬着头皮研究如何开发聊天功能。这个我们是真的下了不少工夫,第一天研究的时候两个人直接没吃晚饭熬到了11点学习中心闭馆,终于打通了云数据库的读写,发现原因是权限限制以及云函数的配置有问题。
打通了这两个问题,聊天功能也慢慢成型了。在临交作业的冲刺阶段,我的超人搭档甚至研究起了怎么搞出已读和红点提醒,做到这个份实在无敌!

记忆点③——情怀(?)
这个点起名有点奇怪,但是我觉得这个是我们结对作业顺利完成的关键吧。换句话说,我们真的把“赢合系”当作心血一样的存在,期待它能变得更完善更好,期待有好的测试反馈,期待获得应有的评分。两个愿意为了这个作业燃尽的人,才会有这样的赢合系。虽然结果不是最好,但在我们心目中这个小程序真的很棒了,全程序无套壳,全部互通,这是态度,而背后也是无限的试错和在键盘上滚过的假期。

记忆点④——反思
有反思过成绩,首先没有做单元测试。这是学习重点,但当时只是注重功能的完成,跳过了提高稳健性的单元测试,而直接进入邀请真机调试阶段。这在软件工程标准中,实在不严谨。
其次,对于本次结对作业的审题方面也有一定的偏题。理应注重的组队招募功能,在过程中被弱化了些许。最后的最后也没有更直观地实现项目状态变更,有失偏颇了。

2.福小研

软件在12月后可能会变得无人维护,但福小研给zenith path团队留下的经验和记忆应该是永恒的(致敬忙忙碌碌疯疯癫癫的十一月)

记忆点①——团队
原型主要是我负责设计的,在和组员配合的时候有种互相画饼不知死活的感觉,但很惊喜的是后面所有功能都一一实现了,甚至还在组员共同思考下,优化升级了很多功能!
我觉得印象最深的应该是团队的力量:有人画饼,有人敢做,有人承接。这是zenith path的底气和坚持,任何一个人单拎出来都很难成就福小研。我觉得很难忘记这份互相包容和集思广益孕育出的勇敢。

描述 描述

记忆点②——冲突与解决
战线拉长,学业紧张,过程难免产生摩擦,其实“研途无忧”团队获得好结果的过程并非像上面一样一帆风顺。
经历过开始的无积极性,以及第一次验收结果的不尽人意,过程中也见识过自己的无力,还有很多。时间的沉淀和组长的自主调解让大家都得到了缓冲,才有了这样的结果。

该项目研究时间比较充裕,过程技术点写在2-1

- 2 - 集成单元:秋收

2-1 技术倒带

1.“清凉一夏”——消消乐小游戏

①copilot的辅助提示完成代码失败
本可以通过学生认证获得使用权益,但中秋回家了,IP对不上所以失败了。后续返校,IP核对成功了,还有GitHub上认证等等问题,过不了身份核验和注册。
但转换工具,试用了一两次功能更强大的cursor,但使用不够好(例如注释的描述不清晰难以满足需求等),效率低于文心一言、chatgpt等llm的辅助使用。
最后是通过文心一言生成各图像组件,chatgpt辅助编程完成任务的。
(btw中秋回家也使得这个项目的完成有点局促,整体不是很满意)

②pygame库的调用

在这之前,我是调研了一下羊了个羊的游戏规则,掌握了其中的匹配机制和难度机制:

  • 难度递增的两个关卡(第一关几乎平铺、方块少;第二关堆叠多,上层方块没消除不能点击下层方块!)
  • 点击方块后会到待消除的槽位
  • 三个相同图案的方块在槽位中即消除(不需要顺序)
  • 广告提示

学习后,我调用pygame库,我具体实现了以下功能:

  • 三层难度递增机制
    三局回合制generate_board(),消除规则check_match()
  • 倒计时设置
  • 得分统计
  • 道具
    加料add_tiles(),洗牌shuffle_tiles()

具体实现直接上blog🔗了 第二次个人作业-清凉一夏

这样看其实也不算是羊了个羊风格的小游戏,更倾向于消消乐吧。
印象中课上老师也提到较少人真正做出“羊了个羊”机制,这是审题不合格的第一关

但在这个设计过程中也受挫过挺多次:

  • (1)开始只是在做最基础的平铺消除(棋盘式),这样实在过于简单
    难度甚至不如“连连看”,人连连看还要考虑障碍物,还是不要开发成过于若只小游戏(最后也挺若只💧
    后来考虑加入:随即出牌可堆叠需要匹配数量递增(2->3)、方块种类增加(6->8) etc..
  • (2)因为希望得分正确统计,以及有闯关体验感,会加上过场结算图案和奖惩机制
    过程中对于奖惩机制的设计也是花费了一定时间,比如开始是点击一个方块就加分了,没有连上匹配机制;惩罚过度后续就算成功闯关也于事无补
    同时过场动画的显示,也需要正确捆绑玩家是否重新闯关这一动作函数

③后续闲来无事捡起代码修修补补了一番

又检查了一遍机制

  • 试图修改重叠率,让点击更明确
  • 添加了背景音乐与点击音效,增加游玩体验
  • 更正了道具按钮的位置,便于点击

2.赢合系——共赢·联合·跨系

很多话也在上面印象深刻的一次作业里说了ouo,这边具体讨论一下技术层面的收获与思考

①考虑到了组队人员的多样性
组队不仅仅是在校大学生之间的事情,同时需要指导老师的介入。
所以在制作原型的时候就有意识地做成师生通用的模块!以及登录的时候特地使用了:学工号
(制作教师首页这件事情很乐x)

②反思——发帖功能
发帖有两种类型:

  • 招募队友
  • 自我推荐

question1:
在招募队友的时候,我希望在发帖的时候可以附上图片(例如模型和详细资料图),让招募更清晰明了,同时可以控制图片与字序,像发文章一样。
问题递进:

  • (1)图片存不进云数据库
  • (2)图片存入后时,上传返回发帖界面,无法显示出来
  • (3)可以显示后,仅能实现类似于puq一样的文字和图片分离
  • (4)改完之后连帖子都发不出去了

作业结束后续排查:应该是将发帖信息存入数据库的云函数有误,上传图片路径有问题等等

question2:
发帖的状态变更不够完善

  • 仅仅是于发布人id绑定发布至广场
  • 人员变更需要发帖人手动输入,更新帖子信息
  • 参与成员id没有绑定到帖子上,无法调取参与信息
  • 帖子状态变更不明确
    etc...

③非常值得一提的交互性设计——聊天与评价功能

双重指标的设计,交互性upup

💫神仙队友or避雷榜首?!
通过在广场点击头像就可以进入他人首页进行评价与查看评价
便于用户在组队前更好地了解对方

selectRating:评分选择器
submitEvaluation
验证评分等级选择(ratingText)与评价内容(content)编辑
读取评价对象、发布用户、评价详情,并导入数据库cooperationReviews

描述

💫除了响应慢,其他都完美复刻广大社交软件的的聊天模式!
已读未读观态度,聊天试探见知己

onSelectFriend:点击私聊对象时获取其openid,跳转至该openid下的消息界面pages/chat/chat
sendMessage
在底部输入栏中编辑消息,点击发送即可发送消息
发送后的消息先写入数据库messages,并从中调取,连同读取状态和发送时间显示在界面中
checkMessageContent:发送消息敏感字检测
markMessagesAsRead:标记所有从对方发送给当前用户的消息为已读

描述

3.现场编程——现场编程

最焦头烂额的一集

印象很深,组员在一点半收到题目之后马上就开始思考了,坐在实验室座位上也一直在搜集ui图标、构思页面以及准备软件启动...
因为申请新云开发需要时间,所以这个应用是搭载在之前赢合系的云环境下的

因为太匆忙了,现在细节也不大记得清了。
很多部分就是将错就错,其实也有很多不必要的功能:例如选择记账类型的页面冗余等等

要说只能说,最后要展示前无限重开,拉着老师反复试错实在搞笑(微信云开发平台很卡加载不稳定的日常)
全部人在老师旁边看到加载出来开始爆笑

4.福小研is all u need——Zenith Path

我本人最主要负责的还是读书魂页面。
这也是我自己在原型上画饼最多的部分..好吧在编程的时候有被反噬到(^^💦

①打卡日历设计

我刚接手软件第一个做的就是这个部分。
这个打卡连接着两重日历:一周日历weekCalendar和整月日历full-calendar

描述

一周日历

常规来说:一周指的是星期一到星期日,但是我们设想的是遵循周日到周六这样的排序(其他型号怎么样我不大清楚,可能我是华为习惯了日-六x
所以在设计算法的时候还要特地扭转常规计算,还要校准,使得星期与日期完美对上,设计了很久。

一周日历脚本设计
    updateCalendar() {
      const today = new Date();
      const firstDayOfWeek = new Date(today);
      firstDayOfWeek.setDate(today.getDate() - today.getDay());

      this.lastSevenDays = Array.from({ length: 7 }).map((_, index) => {
        const date = new Date(firstDayOfWeek);
        date.setDate(firstDayOfWeek.getDate() + index);
        return {
          dayOfWeek: this.weekDays[date.getDay()],
          date: date.getDate().toString().padStart(2, '0'),
          isToday: date.toDateString() === today.toDateString(),
        };
      });

      this.todayDate = this.formatDate(today); // 使用 formatDate 方法
      console.log('todayDate 设置为:', this.todayDate); // 调试日志
      this.generateMonthCalendar();
    },

整月日历

这个日历的显示更是让人头疼:

  • 由于这个页面分为四个部分:考研日历部分、学情分析部分、自习室部分、我的任务部分,整月日历归属考研日历部分,它的向下展开就很不自然,最后也只是直接用margin调整了,如果在电脑端显示还是容易错位。
  • 日历内部很容易错位:这里也需要保持从日-六的日历顺序排序,也是调整了很久,但最后也没法把星期标记出来,但好在最上面一周日历已有星期显示。
  • 显示需要绑定打卡动作,这个是最后将打卡记录写进数据库之后才完成的
整月日历脚本设计
    async generateMonthCalendar() {
      // 获取当前时间(本地时间,无需时区调整)
      const currentDate = new Date();
    
      // 将 currentDate 格式化为 'YYYY-MM-DD' 字符串
      const todayStr = this.formatDate(currentDate);
      this.todayDate = todayStr; // 更新 todayDate
    
      // 使用 currentDate 进行后续日期操作
      const currentMonthIndex = currentDate.getMonth(); // 0-11
      const currentYear = currentDate.getFullYear();
      const firstDayOfMonth = new Date(currentYear, currentMonthIndex, 1);
      const lastDayOfMonth = new Date(currentYear, currentMonthIndex + 1, 0);
    
      const startDay = firstDayOfMonth.getDay(); // 0-6 (Sun-Sat)
      const totalDays = lastDayOfMonth.getDate();
    
      let monthWeeks = [];
      let week = [];
    
      // 获取所有打卡日期
      const userId = uni.getStorageSync('user_id');
      let punchDates = [];
      if (userId) {
        try {
          const res = await uniCloud.callFunction({
            name: 'getAllPunchDates', // 云函数名称
            data: { user_id: userId },
          });
          if (res.result.code === 0) {
            punchDates = res.result.punchDates; // 获取打卡日期数组,格式为 'YYYY-MM-DD'
            console.log('获取到的打卡日期:', punchDates);
          }
        } catch (error) {
          console.error('获取打卡日期失败:', error);
        }
      }
    
      // 添加上个月的日期
      for (let i = startDay; i > 0; i--) {
        const prevMonthDate = new Date(currentYear, currentMonthIndex, 1 - i);
        const dateStr = this.formatDate(prevMonthDate); // 使用 formatDate 方法
        week.push({
          date: prevMonthDate.getDate(),
          isCurrentMonth: false,
          isToday: dateStr === this.todayDate,
          isNextMonth: false,
          isPunched: punchDates.includes(dateStr)
        });
      }
    
      // 添加当前月的日期
      for (let day = 1; day <= totalDays; day++) {
        const currentDay = new Date(currentYear, currentMonthIndex, day);
        const dateStr = this.formatDate(currentDay); // 使用 formatDate 方法
        const isToday = dateStr === this.todayDate;
        week.push({
          date: day.toString().padStart(2, '0'),
          isCurrentMonth: true,
          isToday,
          isNextMonth: false,
          isPunched: punchDates.includes(dateStr)
        });
    
        if (currentDay.getDay() === 6 || day === totalDays) { // 周六或月末
          monthWeeks.push(week);
          week = [];
        }
      }
    
      // 添加下个月的日期
      if (week.length > 0 && monthWeeks.length < 6) {
        const nextMonthDate = new Date(currentYear, currentMonthIndex + 1, 1);
        const nextMonthStartDay = nextMonthDate.getDay();
        for (let i = 1; i <= (7 - nextMonthStartDay) && monthWeeks.length < 6; i++) {
          const nextDay = new Date(currentYear, currentMonthIndex + 1, i);
          const dateStr = this.formatDate(nextDay); // 使用 formatDate 方法
          week.push({
            date: i.toString().padStart(2, '0'),
            isCurrentMonth: false,
            isToday: dateStr === this.todayDate,
            isNextMonth: true,
            isPunched: punchDates.includes(dateStr)
          });
        }
        if (week.length > 0) monthWeeks.push(week);
      }
    
      this.monthDays = monthWeeks;
      console.log('Generated monthDays:', this.monthDays); // 调试日志
    
      // 更新 currentYear 和 currentMonth
      const currentMonthStr = (currentMonthIndex + 1).toString().padStart(2, '0'); // 当前月份,补零
      this.currentYear = currentYear;
      this.currentMonth = currentMonthStr;
    
      // 额外调试日志:打印每周的打卡状态
      monthWeeks.forEach((week, index) => {
        console.log(`Week ${index + 1}:`);
        week.forEach(day => {
          console.log(`Date: ${day.date}, Punched: ${day.isPunched}`);
        });
      });
    },

②自习室

真的呕心沥血在做这个功能了!涉及非常非常多的时间统计函数..
修修改改好多次(还有一定原因是做的时候使用了魔法导致时区混乱)

首页自习状态变更
起初的设计是,希望进入后直接更改首页的字样(未进入->已进入),并设置为日更
👇
直接内置浏览器运行后发现,只有刷新就会变回未进入
👇
从数据库检查该id是否有今日学习记录来判断首页状态变更

描述 👉 描述

自习室排行榜
自习室如果没有排行榜,哪来的竞争与学习动力?
所以我也调整了很久自己排名的显示与霸榜更换对应头图的设计

初始排名显示始终是:1
头图背景为静态
👇
rankingbackground(这里限定ranking==1才会显示)和id绑定,对应从数据库study_users中调取
study_users是记录用户学习记录的,根据是否完成学习分为两个状态
当完成学习会自动通过云函数统计studyDuration(即单次学习时长,是的我们的自习室运行多次进入!)

描述

学习结算

云函数对应

  • 今日学习:getStudyDurationForToday(大于4h下面图文会更改)
  • 本周学习:getStudyDurationForWeek

这些都是根据登录用户的id去统计数据库study_users的studyDuration数据,运用mapreduce的算法技术进行累加

描述

学习打卡记录分享

其实这里存入数据库之类的都挺快的
遇到最大的困难就是图片上传,一开始上传图片一直没反应,后续将图片上传用临时列表存储并绑定云相册上传才成功

打卡分享的图片上传与移除
    // 选择图片
    chooseImage() {
      const maxCount = 3 - this.images.length;
      uni.chooseImage({
        count: maxCount,
        sizeType: ['original', 'compressed'],
        sourceType: ['album', 'camera'],
        success: async (res) => {
          const tempFilePaths = res.tempFilePaths;
          for (let i = 0; i < tempFilePaths.length; i++) {
            const filePath = tempFilePaths[i];
            try {
              const cloudPath = `study_report/${Date.now()}-${Math.floor(Math.random() * 1000)}.jpg`;
              const uploadResult = await uniCloud.uploadFile({
                filePath: filePath,
                cloudPath: cloudPath,
              });
              console.log('上传成功:', uploadResult);

              const fileID = uploadResult.fileID;

              // 获取临时 URL
              const tempFileURLResult = await uniCloud.getTempFileURL({
                fileList: [fileID],
              });
              const tempFileURL = tempFileURLResult.fileList[0].tempFileURL;

              // 将图片信息添加到 images 数组
              this.images.push({
                url: tempFileURL,  // 用于显示图片
                fileID: fileID,    // 用于提交到数据库
              });
            } catch (error) {
              console.error('上传失败:', error);
              uni.showToast({
                title: '图片上传失败',
                icon: 'none',
              });
            }
          }
        },
        fail: (error) => {
          console.error('选择图片失败:', error);
        },
      });
    },

    // 移除图片
    removeImage(index) {
      this.images.splice(index, 1);
    },

    // 提交发布
    async submit() {
      if (!this.title.trim()) {
        uni.showToast({
          title: '标题不能为空',
          icon: 'none',
        });
        return;
      }
      if (!this.content.trim()) {
        uni.showToast({
          title: '内容不能为空',
          icon: 'none',
        });
        return;
      }

描述

我负责的部分,总的来说我真的和时间函数的设置周旋了很久很久。
除此之外,在考完软工的现在,我思考了一下我们最终的软件还有一些问题

①耦合性还是比较高的
在编程的时候,我们经常会有一个大问题:
大家做完自己的模块之后,串联代码也是一大问题——云函数多、杂,数据库很多没有合并等等。
虽然这个应用页面间关联性很强,但是我们的代码没有给每个功能一个比较强的边界感,难以独立。

②难以维护
有的时候,一个页面承接了太多功能。比如我的读书魂页面,就有1k5行代码,我在debug的时候真的头晕了,不知道怎么下手,经常牵一发而动全身,也足以证明耦合性还是比较高,已经内聚性也比较低这点,还是做得不够规范啊。

③代码规范方面还是做得不够
在编程的时候,一些大几千行的代码经常还会有上一次修改的残块,甚至在多个代码里重复编写等等

我们也发现了,其实很多表是可以合并在一起的。
像我一开始写的时候,我希望打卡记录单独在一个数据表punch,后面组长认为应该都整合在users里面,这样方便调用用户信息。
我认为这是很正确也很重要的,后面我们也在学情分析云函数编写的时候证明了这一点。将各种用户信息,例如缺点、打卡天数、个性签名,这些看似杂乱的边角料信息写在一起的时候,调用起来就可以更全面地分析一个用户的学习状态!

2-2 技术缓存

1.Git

运用Git创建了分支,并进行了pull request等操作,作为非管理员,向他人的代码发出修改请求,同时加深了对Git命令的理解,比如git checkout、git add、git commit和git push等

2.运用pygame库开发2d轻量级小游戏

设计了自己的第一款游戏,为其配置了三层难度递增的主循环

3.墨刀——原型设计

给墨刀献祭了很多米进行团队协作设计原型()
说句正经的。
在墨刀里面参考了很多模板,学习了一些设计思路,同时也由此激发了我对需求的进一步分析,快速搭建了原型展示我脑子里理解的功能实现。

4.前后端编程

给我带来了一些前后端编程的经验,在后续数据采集和数据库作业的完成带来了一定经验和帮助

  • 经验一:微信小程序(前端wxml+wxss+js+json,后端微信云开发)
  • 经验二:HBuilderX(前端vue,后端阿里云)

5.自动化单元测试jest

通过模拟 uniCloud 和 uni 对象,验证组件加载、交互和数据流
第一次赢合系没进行的单元测试也是在福小研补上了,学习了一段时间,关键还是卡在环境配置上,非常需要注意到是版本的一致性。

2-3 镜外风景

时长三个月的影像不只是聚焦于十五寸的屏幕(电脑)和六寸空间(手机)的交谈
镜头的外延,是电脑风扇停止转动的思考与总结

1.学会了一点沟通,但不多

有团队,就有沟通,及时的沟通可以促成有效的合作。学会了一些与人沟通的方式,但还是难以表达清自己的想法与建议,希望日后有所改进
在团队协作的过程中,也非常需要有人主动站出来说点什么,做点什么。或许过程中我也更清晰了这一点粗糙的责任。

2.还学会了自我消化

这是一种对自我认知的消化,明白自己的优点和痛点,与此同时不断突破上限吧。
还有对情绪上的消化,这项作业带来的压力应该是无可比拟的,经常精神出走无所遁形,好吧,也是慢慢地磨练自己了

3.“要相信我们做的软件就是最好的”

这句话是张老师说的,一直记得。
现在想起来也是,我们必须对自己做的东西有信心,积极的讯号是向上的动力吧。一个团队的上限,这是其中的因素。

2-4 一点番外

1.张老师设计必属精品

必须要提一下软工课上的两次小活动!

这是第一次设计手表活动,现在想想草稿纸上抽象的手表还是觉得很有意思!我们组一直都是抽象派口牙

结算画面👇

描述

我的第一枚筹码^^

描述

第二次主题大概是训练团队有效沟通(?
这个爬山工具汇总,,其实我们开始真的很认真在想有限的钱如何荒野求生啊

2.写给下一届

这个实践过程确实是有点苦。相信下一届的兄弟们也是软工实践混着各种各样的大作业来。应该对于大部分人来说,这是第一次做专业相关的大作业,那如果在软工这学有所成(当然这个比较理想,有做过就是胜利),也更好上手后续几次大作业。
当然这是在说作业,其实也是实践经验吧,好好吸收,好好沉淀,会有收获的吧。
关键是,希望你们能找到合适自己的组员,一起为一个作业奋斗吧,过程中沟通很重要,及时反馈也是必要的。

- 3 - 写在最后:感谢

三个月如火如荼的软工编程生活总算告一段落
零零散散又感性又理性地总结了很多,总算可以f属性大爆发了

alright前面写了那么多字句难离搭档又队长的,是非常想感谢的人。
我觉得如果我不是和她组队,我很难有深刻的软工体验。

很感谢她对我的信任与选择,才可能会有后面两个人一起莽着做软件的种种故事。在这过程中的一些想法和行动的碰撞都带给我很新的感受,向对方学习了很多很多。结对作业的赢合系绝不单属于某一个人的成果,至少在我看来是这样的,这是两个人燃尽自己,连国庆假期都扔掉的结果!(话说回来我们俩到现在都耿耿于怀那个国庆假期x)最后的结果我们都有点遗憾(在上面我也总结了这份遗憾),但我并不是很在意了——我觉得能燃烧自己做一件事情这个过程的感觉很不错,也很感谢我的搭档和我赋予了这次机会。
不过我们后面谈起都很有底气地说,我们一起做得很好🥹 有这样的体验就值得了

当然,小研的完成也非常需要感谢队长,付出了非常多去调节组内氛围、调动大家的积极性之类的,软件的完成也付出了很多时间与大家交流,还有就是每次精彩的答辩也都很辛苦地准备了。当之无愧的超人!

同时,也很需要感谢研途无忧的第一小组!大家都很好地一起积极建设着小研,一起debug,平时交谈也觉得很开心很平和!现在都记忆犹新:星河姐的zfb和佳会的敲木鱼,还有救我于水火的六一接下了任务发布!第一组好,小研好,代码坏!

- 4 - 言归正传:燃尽

“燃尽”这个词,看着好像是玩梗,其实也是玩梗吧x
可以译为:烧脑赶工、尽力做事。在每个作业中燃着自己的精力、耐心,尽可能不辜负小组,我是这样草率地总结的
但做软件工程真的燃尽了👋
写到这里我也燃尽了orz那就贴上软工作业循环最多次的一首歌吧(对...对吗 但这歌也挺应景的

描述

--------------------------- THE END 📼 ---------------------------

描述
posted @   okiqiiii  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示