第一周作业
| 这个作业属于哪个课程 | 广东工业大学软件工程56班 |
|---|---|
| 这个作业要求在哪里 | 第一周作业要求 |
| 这个作业的目标 | 建立个人技术博客和 GitHub 仓库,并明确自己的学习目标和未来发展方向 |
GitHub
已创建README文档

博客园

一、关于我
大家好,我叫陈宇轩,是一名计算机科学与技术专业的学生。
我目前主要接触过 C、Java、Python 等编程语言,也学习过数据结构、计算机网络、操作系统、数字逻辑等计算机专业课程。相比于只学习理论知识,我更喜欢通过实际编程来理解一个知识点,因为很多问题只有真正写代码、调试代码之后才会发现。
在之前的学习过程中,我接触过一些 C 语言程序设计,也做过链表、数组、指针等方面的练习;在 Java 方面则接触过面向对象程序设计、接口、继承、随机数、模拟程序等内容。另外,我也做过一些计算机组成原理、数字逻辑和 CPU 相关的实验。
目前我的编程能力还远没有达到专业程序员的水平。很多时候我能够理解程序的大致思路,但是遇到比较复杂的问题时,仍然比较依赖搜索资料和不断调试。这也是我希望通过软件工程课程改善的地方。
我的最大的兴趣是音乐,除了计算机,我平时比较喜欢听音乐,也会关注音乐专辑、音乐评论以及不同音乐类型的发展,欢迎b站/抖音关注MouseRadioO(∩_∩)O,我主要听英语音乐,是黑胶收藏爱好者。我还喜欢看足球,打羽毛球等体育活动。
我希望自己以后不仅仅是“能够把代码写出来”,而是能够逐渐理解:怎样把代码写得更加清晰、可靠、容易维护,并且真正解决实际问题。这也是我学习软件工程的一个重要原因。
二、关于计算机科学与技术专业
选择计算机专业,一方面是因为我本身对计算机和软件比较感兴趣,另一方面也是因为计算机专业具有比较强的实践性。在最开始接触编程的时候,我觉得编程比较有意思的一点就是:只要给计算机一个明确的指令,它就可以按照自己的逻辑运行。
但是进入大学之后,我逐渐发现,真正的软件开发远远不只是“会写代码”。一个看起来很简单的程序,实际上可能涉及:需求分析、算法设计、数据结构、程序设计、测试、调试、版本管理、团队协作、用户体验、软件维护,因此,我现在认为,计算机专业真正需要学习的不只是某一种编程语言,而是解决问题的能力。
根据软件工程技能调查的思路,我选择了对自己目前比较重要的 7 项能力进行评价。
| 技能 | 当前水平 | 目标水平 | 具体做法 |
|---|---|---|---|
| c语言 | 5 | 7 | 写代码,多刷题 |
| java应用 | 3 | 5 | 通过网课等方法巩固知识 |
| 数据结构与算法 | 4 | 6 | 刷题并自己实现常见算法 |
| Git/Github | 3 | 6 | 使用 Git 管理课程项目 |
| 软件测试 | 4 | 6 | 学习单元测试并给自己的程序写测试 |
| 项目开发能力 | 3 | 5 | 独立完成小型项目 |
| 团队协作 | 4 | 6 | 参与团队学习,完成项目的开发 |
这里的数字并不是说自己真的能非常准确地量化到某个等级,而是为了给自己一个比较明确的参照。
我的具体提升方法
- 增加实际代码量
不能只看教材和视频。每学会一个知识点,都应该尽量自己写一遍。
- 坚持使用 Git
以后课程项目尽可能使用 Git 管理,而不是所有代码都只保存在电脑本地。
- 学习代码阅读
除了自己写代码,也要尝试阅读其他人的项目。
因为自己写几百行代码和阅读几万行代码的能力完全不同。
- 做项目
我认为项目是检验学习成果比较有效的方法。
以后希望能够完成几个相对完整的小项目,而不是只完成零散的课堂练习。
- 学习测试
应该主动思考:
如果输入特殊数据怎么办?
如果用户输入错误怎么办?
如果程序运行很多次怎么办?
- 学习软件工程方法
这也是我选择这门课的重要原因。
我希望了解一个软件从需求到设计、编码、测试、发布和维护的完整过程。
- 记录学习过程
通过博客记录遇到的问题、解决方法和学习心得。
这样可以避免同一个问题以后反复踩坑。
关于抄袭与参考资料
我认为:
参考资料和抄袭之间最大的区别,是是否真正理解并完成了自己的工作,以及是否对他人的工作进行合理引用。
例如,我在学习一个算法的时候,可以阅读别人的博客或者官方文档,理解算法的思想,然后自己实现。
这属于正常学习。
但是,如果直接复制别人的代码,然后把它当成自己的代码提交,即使程序能够正常运行,也不能算真正完成了作业。软件开发本身就是建立在前人工作的基础上的,程序员每天都会使用开源库、阅读官方文档、搜索问题、参考其他人的实现。所以软件工程师不可能完全“不参考别人”。
真正重要的是:
知道哪些东西来自别人,并且尊重别人的工作;在理解的基础上继续创造自己的成果。以后在团队项目中,我也会更加注意代码来源、文档引用以及开源项目的许可证问题。
我未来的方向
目前我比较倾向于继续向软件开发 / IT 行业方向发展。我希望自己未来能够成为一名真正具有实际开发能力的程序员,而不仅仅是一个“会写课程作业”的计算机专业学生。当然,现在距离这个目标还有比较长的距离。
我的优势是:对计算机有兴趣;愿意自己研究问题;有一定 C、Java 编程基础;对软件和互联网相关内容比较感兴趣;愿意尝试不同类型的项目。
我的不足也很明显:项目经验还比较少;编程基础还需要继续加强;算法能力还不够稳定;软件工程实践经验不足;有时候容易把大量时间花在自己感兴趣的事情上。所以我认为现在最重要的不是马上确定自己以后一定做什么职位,而是先把基础能力提高。
我希望建立怎样的师生关系?
过去的大学学习中,我对师生关系的理解比较传统:老师讲课 → 学生听课 → 老师布置作业 → 学生完成作业。但是我认为软件工程这种实践性比较强的课程,如果一直保持这种关系,效果可能并不是很好。
我更希望老师和学生之间是一种:老师负责指导方向,学生负责主动实践和思考—————这样的关系。
如果老师布置的作业比较困难,我选择:向老师和同学请教,花更多时间,把作业全部完成。
如果一道题比较困难,我第一反应应该是想办法解决,而不是因为困难就放弃。当然,“请教”也不应该等于直接让别人把答案给自己。
我认为比较好的请教方式应该是:先自己尝试;明确自己卡在哪里;查阅资料;再向老师或者同学询问;理解之后自己重新完成。这样得到的知识才真正属于自己。
我的代码量
目前我的主要编程语言包括 C、Java,以及少量 Python。
由于以前的代码比较分散,部分是课程实验,部分是个人练习,因此目前只能进行一个大致统计。
按照目前的学习情况,我暂时记录为:
| 编程语言 | 当前代码量 |
|---|---|
| C | 约5000行 |
| Java | 约2000行 |
| Python | 约500行 |
我认为,代码量本身并不是衡量程序员能力的唯一标准。如果只是重复写大量简单代码,代码量再多也不能说明问题。
真正重要的是:写过什么代码,解决过什么问题,以及能不能独立完成一个完整的软件项目。
因此,我希望以后不仅增加代码量,也提高代码的质量。
WOOP 学习计划
1.Wish——我的愿望
我希望在这门课程结束之后,能够:
独立完成一个结构比较完整的软件项目,并且能够使用 Git 管理项目,具有基本的软件测试和团队协作能力。
- Outcome——最好的结果
如果这个愿望实现,我希望自己不再只是看到一道题然后想着:
“这道题应该怎么写?”
而是能够进一步思考:
“需求是什么?”
“应该怎样设计?”
“代码应该怎样组织?”
“如何测试?”
“以后修改会不会方便?”
如果能够达到这种程度,我认为这门课就真正起到了作用。
- Obstacles——可能遇到的障碍
我认为自己最可能遇到的问题有:
一,拖延
有时候知道应该学习,但会把时间放到其他事情上。
二,遇到困难后容易卡住
程序出现 bug 时,如果长时间没有解决,很容易产生放弃的想法。
三,基础知识不够扎实
有些时候不是代码写不出来,而是因为某个基础知识没有真正理解。
四,项目初期积极,后期坚持不够
开始一个项目时往往比较有动力,但项目进入重复调试阶段后,动力可能下降。
三、《构建之法》阅读与思考
《构建之法》的目录从软件工程基础、个人技术和流程,一直涉及团队合作、敏捷流程、软件设计、测试、质量保障、发布以及创新等内容。第 16 章专门讨论了 IT 行业的创新。我快速阅读之后,发现自己以前对“软件开发”的理解更多停留在“写代码”层面,而这本书让我开始从软件工程的角度考虑问题。
下面是我阅读后比较感兴趣的五个问题。
问题一:创新一定需要“灵光一现”吗?
以前我对创新的理解比较接近:想到了一个以前没有人想到过的点子,然后把它做出来。但是书中对这种“突然产生一个伟大想法”的创新方式进行了讨论。这让我产生了一个问题:
如果一个人没有突然产生特别好的想法,他还能通过持续实践获得创新吗?
我认为可以。例如软件开发中,一个现有的软件可能已经能够解决 80% 的问题,但程序员在实际使用过程中发现了一些不方便的地方,然后不断修改。第一次修改可能只是解决一个小问题,第二次可能改善交互,第三次可能改变实现方式。最后得到的产品可能与最开始完全不同。这种创新并没有所谓的“灵光一现”,而是来自大量实践。所以我认为:
创新不一定来自突然出现的想法,也可能来自不断发现问题、解决问题和重新组合已有知识。
问题二:软件应该追求“完美”还是尽快发布?
软件开发中经常会遇到一个问题:一个功能到底应该做到什么程度才可以发布?如果一直追求完美,那么软件可能永远发布不了。但如果过早发布,又可能导致用户体验很差。因此我的问题是:
怎样判断一个软件已经“足够好”,可以进入下一阶段?
我认为这不是一个单纯的技术问题。例如一个内部使用的小工具,即使界面比较简单,只要核心功能可靠,也可能已经足够。但是面向大量用户的软件,如果存在严重 bug,即使功能很多,也不应该直接发布。
所以我认为软件的“完成标准”应该和:软件用途;用户群体;风险;核心功能;测试结果;结合起来判断。这也让我认识到,软件工程不能只追求“代码写完”。
问题三:团队开发中,个人能力和团队流程哪个更重要?
我的一个疑问是:如果团队中有一个非常优秀的程序员,但是团队协作流程很差;和一个每个人能力一般,但是合作非常好的团队相比,哪个团队更可能完成优秀的软件?
我倾向于认为后者更有可能长期稳定地完成项目。因为一个大型软件不可能永远依靠一个人。如果所有关键代码都只有一个人理解,那么这个人离开项目之后,整个项目可能就会出现问题。因此,我认为团队开发中需要:代码规范;Git;文档;Code Review;测试;明确分工。个人能力当然重要,但是软件工程最终需要的是多人共同完成一个系统。
问题四:测试应该在什么时候开始?
我以前写程序的时候,通常是:写代码 → 运行 → 如果没报错就结束。但是这种方法实际上并不能证明程序没有问题。因此我的问题是:
测试到底应该从什么时候开始?
我以前的理解是,测试应该在程序基本完成以后进行。但是现在我认为,如果等所有代码都写完才开始测试,那么出现问题之后很难确定到底是哪一部分导致了错误。如果从开发过程中就不断测试,那么问题出现后更容易定位。这让我想到以后写项目时应该改变习惯:不要把测试当成项目最后的一项任务,而应该把测试融入开发过程。
问题五:代码量真的能够代表程序员能力吗?
我目前比较关注自己的代码量,因此看到相关内容之后产生了这个问题:一个程序员写了 10 万行代码,是否一定比只写过 1 万行代码的程序员水平高?我认为答案显然不是。例如:程序员 A 写了很多重复、低质量代码。程序员 B 写的代码数量少,但是完成了一个结构清晰、经过测试、能够长期维护的项目。我认为 B 的能力可能更强。因此,我觉得代码量应该成为一个参考指标,而不能成为最终目标。真正重要的是:
写代码的同时有没有解决问题,有没有形成工程思维。这也是我制定代码量计划时比较重要的一点。
四、前车之鉴:我从前人的经历中学到了什么
不要把所有时间都花在“紧急但不重要”的事情上,我比较认同把事情按照重要性和紧急程度进行分类的做法。以前学习的时候,有时候会出现这样的情况:明明一个作业距离截止还有几天,却因为一直没有开始,最后变成最紧急的事情。这样不仅压力大,而且完成质量也不一定高。
因此以后我希望把:重要但不紧急的事情提前完成。
例如:学习编程基础;阅读技术资料;整理代码;学习 Git;做个人项目。这些事情可能不会马上影响成绩,但是长期来看非常重要。
- 不要因为自己是计算机专业学生,就认为自己已经“懂计算机”。我觉得这个观点对我比较有启发。进入计算机专业之后,很容易产生一种错觉:“我已经是计算机专业的学生了,所以我应该已经会计算机了。”但实际上,计算机科学包含的内容非常多。会写 C 或 Java 程序,只能说明掌握了一部分基础。真正进入软件开发之后,还需要面对:操作系统;网络;数据库;算法;软件工程;分布式系统;测试;项目管理。
因此,我认为大学阶段最重要的事情之一就是建立基础,而不是急于证明自己已经什么都会。
浙公网安备 33010602011771号