239
社区成员




这个作业属于哪个课程 | FZU_SE_teacherW_4社区-CSDN社区云 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客-CSDN社区 |
这个作业的目标 | 总结课程收获和经验 |
其他参考文献 | 《构建之法》 |
1.0.0 学生用GPT-4来做作业,老师要如何甄别呢?-CSDN社区
随着GPT的发展及其现在已经可以联网获取信息进行分析,甄别AI生成的内容已经变得越来越困难。事实上,在AI与识别AI内容的战争当中,识别这一方必定会败下阵来。因此不应该过于依赖相关的分析工具,而是通过分析作业和学生的水平及表现是否符合来进行判断。事实上,除非课程有相关要求,老师不应当视AI如洪水猛兽,在AI技术发展得愈来愈快的当下,使用AI的能力正在逐渐的变为程序员必须的能力。尤其是在前端当中,由于相关产品已经较为成熟,使用AI可以辅助用户将设计稿更快地转变为可以运行的应用程序。
我在某个项目当中尝试使用ChatGPT来编写前端页面,其能够很快的给出对应的页面,这对于一个开始是非常好的,而对于一些常见的要求和错误,其也能够很好的给出响应,Cursor和CoPilot等辅助工具还能够给出相关的代码建议,甚至已经有通过识别和对话直接将设计稿转化为可运行的页面的工具。
2.1.1 作者用商用民航发动机来对比普通的商用软件,是否合适?-CSDN社区
这一类比是非常合适的。发动机对于民航就相当于商用软件对于IT行业,是这个行业的基石。其都有体系结构复杂、研发难度高、重要性强等特点。商用软件在商用领域出问题的后果是灾难性的,即使一般不会造成人员伤亡,也会造成大量的经济损失。例如Windows的宕机使得全球多个重要的机场枢纽无法正常运作,造成旅客和货物滞留。因此民航发动机和商用软件一样都是极其重要的,且同样需要定期的维护使得其能够正常的发挥作用。
在生产环境当中,软件往往承担了一个公司所有的商业价值。这就是为什么数据库等基础设施如此重要的原因,数据是无价的容不得半点差错。普通的商业软件并不普通,他往往是公司运转的核心,需要非常高的可靠性。
3.1.1 如何区分一个好的程序员和不好的程序员呢? -CSDN社区
看他们的能力和态度。数据结构等基础是必不可少的,一个程序员不应当停留在调包侠等阶段,而应该深入底层,了解一些深层次甚至偏硬件的东西,了解了原理不仅可以加快学习进程,同时也赋予了必要时可以修改这些底层代码,从而满足自己需求的能力。而态度也是判断是否“好”的一个标准。一个好的程序员,首先应当是负责的、有道德心的,否则他的能力将会变为社会的不稳定因素,这绝对是我们所有人不想看到的,正所谓有文化的坏人是更加可怕的。
4.1.1 程序员是否有必要为满足小部分人的需求去做软件,或者为软件添加某些功能?-CSDN社区
看软件的侧重点。如果软件以盈利为导向,小部分人的需求如果不能够转化为金钱,那么这样的开发是没有必要的,但是如果是开发者个人的项目的话,在开发者本身有余力的情况下,可以考虑满足这些小的需求。总的来说,程序员应当在需求分析阶段过后综合考虑再进行决策,尽量多考虑一些因素。
5.1.2.3 有了GPT类的应用,传统的搜索引擎是否会被完全替代?-CSDN社区
搜索引擎作为互联网的基础设施,肯定无法被完全取代。但是随着GPT类的应用开始拥有“睁眼看世界”的能力,能够在网上搜索信息汇总,并给出相关的参考资料,传统的搜索引擎在获取信息的效率上已经无法和AI助手相提并论。就常见的搜索技术问题的场景,GPT类应用往往可以直接给出对应的答案,而搜索引擎只能够罗列出相关的文章,答案还要搜索者去自行寻找。但是AI内容的来源仍然是这些文章,并不能保证正确性,因此传统搜索引擎的地位将会逐渐下降,但并不会完全消失。主要搜索引擎也正在积极整合AI功能。
新问题:随着AI的发展,是否所有代码的编写会被AI取代,而人类专注于整个项目的管理?个人觉得目前AI辅助已经可以让一个人发挥出两个人的效率,那是否和其他领域类似,人类最后会专注于更高级的管理工作。
该阶段我简单了解了软件工程的需求手机、分析及设计阶段的主要目的和流程。这是我以前从来没有接触过的。自己从来没有想到过需求分析甚至值得单独写成需求说明书,不过不可否认的是需要需求分析来引导一个产品的开发。但是个人认为大部分程序员在将来的工作当中都用不到这一过程。
这一阶段接触了原型设计和对应的原型设计工具,学习了原型设计工具墨刀,理解了原型设计是验证需求想法是否可行的重要步骤。原型设计这一步骤通常也不由程序员负责。
真正收获大的是系统设计和数据库设计。我大体了解了一个健壮的系统是怎么设计出来的,以及其应当由哪些部分组成。数据库作为系统的存储,良好的表结构设计可以提高开发效率,并提高性能。对应的,也初步了解了相关说明书的编写步骤。
团队作业当中我主要负责实现项目的后端,第一次接触了WebSocket这项技术,并使用它成功实现了聊天功能,为我们团队应用的在线协作功能提供了有力支撑。同时配合前端对接了接口。虽然已经学习了一段时间的Java后端技术,但是和前端对接接口使得产品落地还是第一次。在对接过程当中出现了一些新的问题需要修改,同时前端同学也有一些新的接口需要满足。前后端的对接经验是我这一阶段最宝贵的收获。
这是曾经最被我忽视的阶段。一是我编写的程序大多不需要运行在生产环境,因此多数情况下不经过测试也不会造成大的损失,二是编写单元测试和写注释一样,可以说是大多数程序员最不喜欢做的事情。因此在这次实践当中我才第一次接触到了单元测试和性能分析,并编写了对应的单元测试覆盖尽可能多的类。同时尝试对性能做一些优化,并收到了一定的成果。
这一阶段的收获主要是体会了测试阶段暴露问题的重要性,及早地暴露问题可以尽早修复,并避免造成更大的损失。同时认识到测试应当尽早进行,而不是拖到整个系统基本开发完成之后。
软件发布阶段主要学习了后端的部署。相比于将mysql、redis和jar包部署到服务器本机上,采用容器化技术(例如docker)来部署相关服务。这一阶段学习了docker镜像的构建和部署,并使用docker-compose管理和编排容器。使得服务的运行、停止和更新都变得更加容易。
上线后还遇到了一个由于报错日志占满了硬盘导致了服务器无响应的问题,解决这个问题同时学习了一些docker设置,例如设置日志文件最大大小。
个人项目阶段更多地是对自身技术的一种联系。例如奥林匹克作业中就练习了以前经常忽视的文件读写操作,这种底层的操作通常不会在日常开发当中遇到,是一个比较好的练习。
结对阶段和结对伙伴一起努力完成了一个较为简单的web应用。由于我负责数据的收集和展示,因此可以重用个人作业的代码,减轻了一些负担。因此理解了为什么一直要强调代码的可重用性,减少不必要的工作量真的对于效率有很大的提升。同时第一次和别人合作编程,初步学习了git的相关用法。
团队阶段个人理解是模拟了一个小型的开发团队,我在其中担任后端开发的角色。和组内其他角色的同学一起参与开发,并经历紧张的两轮冲刺个人认为是最为难忘的一段经历。在看到最终的产品后有一种莫名的自豪感,同时体会了软件工程的完整流程,体会到一些阶段的作用。软件工程对于开发一个功能完善的软件是必不可少的。
目标1: 理解软件工程师的职业道德规范和实践要求,了解国情社情民情,理解软件产品对社会、健康文化等影响,树立积极向上的软件开发理念。90分
解释:经过本轮课程我已经认识到了软件工程的道德要求以及软件对于整个社会的影响。在今后的职业生涯当中我将坚守自己作为软件工程师的道德底线。
目标2: 掌握需求分析的全过程,能辨别客户表述的多样化要求,熟练使用需求表达工具,能够规范、准确地表达客户的需求,构建需求分析模型。 80分
解释:掌握了需求分析的基本方法,但是对于需求仍然不能够很好的捕捉、并转化成为原型。
目标3: 掌握软件开发的全过程,遵循体系结构设计方法和基本设计原则,通过正式的技术评审,完成从体系结构设计模型、数据设计模型和构件级设计模型,形成面向高效可靠的服务组件设计方案或软件系统设计方案。85分
解释:在理论课上学习了相关知识,并在团队作业中将相关知识进行实践,收获了一定的经验。
目标4: 能够执行从组件到软件系统的技术评测,具备设计模型的评判能力,具有创新设计意识,能够优选设计方案。80分
解释:在设计模型的评判上做的还不够好,更多地是遵照现有的设计方案来进行一个项目的开发。
目标5: 遵循软件开发各阶段文档标准,采用规范的表达,掌握需求规格说明书、系统设计说明书、系统测试报告等文档撰写方法,具备与业界同行交流能力。90分
解释:在课程当中我了解了系统规格说明书、数据库说明书等说明书的国标,并参照这些标准编写了对应的说明书,并能够依据说明书与其他同行进行一些交流。
目标6: 具有良好的团队意识和合作技能,能够与其他成员开展有效的沟通和协作;能够组织、协调或指挥团队开展工作。80分
解释:在团队合作过程当中我能够保质保量的完成自己负责的部分,并为其他成员提供力所能及的帮助,但是组织、指挥整个团队不是我的强项。
目标7: 能够辨别具体软件项目管理中涉及的构成要素,掌握软件规模和工作量的估算方法,能够选择合适的工具规划软件进度并对项目管理过程进行配置,具备初步的管理复杂软件工程项目的能力。85分
解释:在参与了一个较为大型的项目开发过程后,我初步认识了一个项目的工作量,并能够使用对应的规划软件进行进度的管理,保证项目能够按时完成交付。
个人技术博客——Spring Boot整合WebSocket实现在线聊天-CSDN社区
概述:博客简单介绍了Spring Boot整合WebSocket技术来实现在线聊天功能,简化相关的配置流程,并简单介绍了相关概念以及如何处理相关事件、进行优化等。
参与项目:TimeSphere
项目目标:开发一个个人日程管理系统,并支持在线协作功能
主要技术栈:
前端:Vue + FullCalendar + Element Plus
后端:Spring Boot + Mybatis Plus + Redis + RabbitMQ + Docker + SaToken + FastJSON2
我们最终采用前后端分离的架构来开发整个项目,并规划了协作、文件存储等功能来丰富我们产品的功能,产品最终开发完成后相关功能作为我们的特色收到了用户的好评。
Q:怎么实现协作功能?
实现协作功能主要难点在于实现聊天功能,搜索了相关技术之后我们决定使用WebSocket来实现这一功能。这对于前端和后端都是一个挑战,不过最后实现的成果符合我们的预期。
Q:该怎么呈现待办事项?
我们借鉴飞项的做法,可以查看所有待办事项,也可以在月、日、周视图下对于创建的任务进行查看、编辑,使得用户更好地了解自己的任务完成状态。
该项目中我们采用Scrum开发模式。
优点:灵活、透明,进度对团队内任何一个人都是可见的,且增量开发可以使得我们一次专注于一个功能的开发,提高了软件的整体质量。
缺点:Scrum的环节较为多,这的确耗费了我们的一些时间,同时对于每一位开发者的压力较为大,同时团队应当有一个领导的角色来引领整个开发过程。
影响:在开发效率上,增量的开发能够提高开发效率,每个 Sprint 都有明确的目标。但是缺乏沟通可能会导致整个项目出现问题。在团队协作上,Scrum鼓励团队成员之间的合作,有助于成员从其他人得到帮助和支持。在最终的产品交付上,增量开发使得问题能够被尽早地修复,避免产生更大的问题,同时,Scrum 的透明度和反馈机制有助于确保项目始终保持与客户需求的一致性,提高最终交付质量。
瀑布模型:线性的开发过程,每一阶段必须在前面的阶段完成后才能够进行,易于理解和管理,但缺乏灵活性。适用于需求明确,有明确文档和要求的项目。
螺旋模型:将开发过程分为多个阶段,在每个阶段进行迭代并逐步完善产品。适合大型复杂或者风险高的项目,但是开发成本较高。
敏捷过程:基于迭代和增量的开发,每个周期都交付一个可行的产品,包含多种开发过程(XP、Scrum等)适用于需求不明确或频繁变化或者需要频繁与客户进行沟通的项目。
原型模型:从建立原型开始一个项目,用于与用户沟通并获取反馈。可以帮助用户更好地理解产品,并获取用户的反馈。适用于需求模糊、变化频繁的项目。
软件开发模式对于一个项目能否开发成功,以及开发质量是至关重要的,因此一开始就应该根据要开发的项目的特点选用合适的开发模式,并在整个开发过程当中坚持选定的模式,才能够开发一个较为完善的软件。我想这也就是软件工程的意义所在吧,探索正确的软件开发管理之道,保证所开发的软件的健壮性、正确性。