Week1 博客作业
现代软件工程第一周的博客作业
自我介绍
Hi, 这是我现代软件工程的第一篇博客。
我本身是比较话痨的一个人,所以从来不觉得写东西是一件很难办的事情(除了托福写作)。平时其实自己有记录东西的习惯,但那都是一些非常情绪化和personal的东西,并且我是放在一个(理论上)只有自己可见的笔记本(OneNote)里。然而现在要写的东西,一方面是一个所有人都能看到的东西,这就要照顾到读者的体验,不能自言自语没有组织地长篇大论;另一方面每篇博客都是有主题和任务的,这种类型的写作我并没有信心能毫不费力的完成。
作为自我介绍,我可能要描述一下我自己(如果有人觉得不符合可以在评论区指出)。我觉得我是一个比较随意的人,主要是觉得拘谨起来有点累,自己貌似并不会过分在意自己的言行(这样其实不是很好,有时候会有麻烦和误会)。随意不等于活泼,有时候如果不想说话就会不管尴尬不尴尬地一句话不说。擅长表达自己的不满,也自认为能很好地传达对别人的敬佩。至于兴趣爱好,最近不知道怎么回事貌似没有一个明确的可以称之为爱好的爱好,喜欢的事就是和别人闲聊瞎聊,爱好猫猫狗狗。
现状、经验和计划
我为何选择这个专业?
这我也说不准,可能是因为这个CS很“酷”。programming 这件事听起来就很酷。更何况我还是信息安全专业,似乎更酷了。认真一点说,我觉得计算机科学中的很多思想都非常有意思,比如说操作系统的设计,拜占庭将军问题,哲学家就餐问题,密码学的公钥算法,以及算法课中的许多问题和解决方案。与(我理解的)纯数学和纯物理相比,(我理解的)计算机科学的问题定义更容易与现实联系,而我似乎对这种问题更有兴趣。
技能调查表
我认为重要的技能 | 目前的水平 | 期望达到的水平 |
Overall | 2 | 5 |
Software tools | 0 | 2 |
Design | 1 | 3 |
Command lines and files | 2 | 3 |
Work with others | 3 | 5 |
对于以上几点,我觉得是很重要的。(然而这么一本正经地把精确的十分制评分用表格的形式列出来,并不代表我对这个评价很有底气。)
首先是Overall,至少在我的学校我选修的课程中,涉及到编程的课程,基本上是完成任务型的,目标非常明确。只要我会写这几句话,就平铺直叙地写下去,最后能出结果就行。但是关于对编程的整体理解,所谓编程之美,并没有被介绍到,很遗憾的是自己之前也没有主动去学习和了解。但是现在在读了一点《构建之法》之后,感觉对编程有了一点整体印象,希望随着现代软件工程课程的进行,自己能在这方面有所领悟。
另外是 software tools 的使用,这点说来惭愧,我可以说没有什么 IDE 的使用经验,这可能和自己的经验不足有关。之前自己的东西都是几个文件就搞定的,debug也只用print或者pdb/gdb,但是涉及到大的项目,software tools 对于调试、管理和团队合作等都能很大的提升效率,是不可或缺的。这一点相信在后面的团队作业等任务中会需要用到,我得自己先了解一下会用到的tools, 不懂的地方多向别人请教。
关于 design 这一点,是自己早就意识到但是迟迟没能解决的问题。看过别人的代码(尤其是一个大的项目的源码),再看自己的代码就会觉得自己根本不会写code。一方面,现在的我面对一个巨大的项目,根本不知道从何下手;另一方面,光对比自己和别人的一个函数,一个文件的内容,也感觉天差地别。为什么我写的代码这么“丑”?函数变量的命名匪夷所思,一个函数写得贼长,改起来贼麻烦……自己也有过一定要“优雅地”写代码地决心,然而事实是每次都在赶deadline, 到最后管不了这么多,程序能跑能出结果就行。对于这次软件工程课程,我这里再下一次决心,希望能好好学习和实现优雅的 design。
命令行参数真是个好东西,config 文件之类的也是好东西,每次拿着别人的代码跑就觉得真好,真方便。但自己的东西要重新设置实验就会很麻烦,现在自己写东西也会添加处理命令行参数,用起来还有点不熟悉,要多加练习。
协作这个我都不知道该怎么给自己评分,上过这么多课,组队的课也很多,尤其是计算机相关的课程,几乎门门都有大作业,这么多次的组队经历让我不好评价自己的协作能力:有时候小组讨论分配任务什么的都非常顺利,大家的讨论融洽且高效;但有时候有的队友挑不出什么毛病,可能就是八字不合,感觉不好说话不好相处。当然这也和我自己的性子有关,要注意学习沟通技巧,学会看得开,不要带着不满跟别人合作。
阅读博客,写下心得
a) 你为何要来上课并认真参与
这个问题在第一次课上听老师提到过:有的学生已经有了毕业后的打算,只是为了混个学位证。
讲道理如果我是这个学生我也会认真上课认真对待,毕竟将来的打算对现在是没有影响的,难得当前没有别的压力只用专心学习就好,能学啥我都会认真学。
回到我本身,我自己的专业和编程密切相关,并且能有机会在MSRA体验到“真实”的软件工程课,我当然会认真参与。
b) 你在大学中体验到了哪种师生关系,你希望这门课是什么师生关系?如果老师布置的作业对你来说有些困难, 你会怎么样:
我在大学体会到的师生关系更像是“路人甲/路人乙”的关系,当然我作为“路人甲”还目睹了老师和其他同学的“哥们/哥们”以及“狱警/犯人”等师生关系。在这门课中,我觉得首先我自己是具备作为“健身学员”的条件的,我是想学东西的,那这就好办了。
面对困难作业,我大概会和同学讨论,一般来说这样就会出结果了(讨论是真的讨论,集思广益,不是直接抄别人的)
你今天是怎么为将来准备的
目前我大概是只能出国深造了,再往后几年也说不准,如果喜欢研究就继续做下去,如果不喜欢了就干别的。(不知道三十岁转行当画师还来不来得及。)
针对前人博客发表感想
看了一下链接后简短的介绍,就点开了那个“思维快照”的博文,因为这种事情我自己就做过并且也正在做。感觉作者的文笔谜之熟悉,有一种读着自己写的东西的感觉。然而接着往后读就发现我和作者的差距真大,作者的行动力太强了,这个真的佩服。他做的很事情我是想都没想过(例如问监考老师试卷是怎么排版的,向 google 副总裁交简历),而且作者的自学的自觉性很强,我甚至很好奇这种人是如何做到的。可能我和作者也就在精神上有点共鸣吧,实际行动力来说我真是太弱了。但是往往作者这种人才是能做出让人印象深刻的事情的人,如果我一直不行动,不去实现自己的想法,那真是太遗憾了。
提有质量的问题
1. 软件团队。软件团队这个名词在整本书中总是出现。可能是我还没看完书的原因,我不知道有没有一个“标准的软件团队”,包含了一个软件团队中应该有的角色和对应的工作任务。有些如需求分析、用户体验等方面的内容,我觉得这些流程都非常复杂并且也是非常重要的,我感觉这些工作我自己无法胜任,在一个软件团队中,负责调研市场和用户反馈的人理想情况应该是怎样的背景?需要社会科学、设计专业的知识和训练吗?
2. 第三章:初级软件工程师的成长。其中提到一个成长是“实际成果”,其中包含市场占有率、用户评价等标准。而我觉得这种“成果”更多时候是由整个软件团队共同决定,软件工程师在整个软件的开发过程中可能并不是最重要的一个环节。有些东西并不是软件工程师的水平可以起决定性作用的。例如,一个软件的市场占有率更多时候和软件背后的平台的有关(如12306客户端)、用户评价也是很主观的东西,有时候用户的反馈并不能直接与软件工程师的工作相关联。
3. 第四章:两人合作。4.5 结对编程。关于“驾驶员”和“领航员”的参与程度的问题,书中提到的一种结对编程工作模式是两人在=同时坐在屏幕前,一个人写一个人看。其中“领航员”的任务是起到领航的作用,我理解成指导代码中功能和模块的设计,而“驾驶员”则是实际敲键盘实现这些功能的人。我质疑“领航员”是否有必要在驾驶员写代码时保持同步检查,因为即使两人都知道要做的东西是什么,但是具体到每一行代码的实现,两个人的想法不免存在偏差,如果在这过程中,“驾驶员”还要应对“领航员”的疑问,每写几行代码就要被质问然后解释一句,这种模式是否会造成 distraction 影响编程的效率和代码的质量?我个人比较能接受的模式是,领航员给出下一步的方向和要做的事情之后就放手让驾驶员去做,等这一步完成后再来检查完成情况。
4. 第五章:团队和流程。这一章介绍了很多团队模式,许多模式并不能决出哪个好哪个不好,那么在一个多人团队中,如何选择合适的工作模式和流程,主要是依据任务的形式来选择,还是根据团队成员的个人意愿?以及在一个软件团队正式开始工作之前有必要明确地指定一种工作模式和流程吗?
5. 第八章:需求分析。关于用户调研,第一步就是找到“焦点小组”,其中一个组成成分是“目标用户的代表”。我认为这个目标用户是软件团队设定的目标用户。但有些情况,一些软件的目标用户并没有明显的特征,即不知道什么是“目标用户”。(如打车软件,手机管理工具)这种情况下,目标用户的选取该如何确定?