Hello, World!

Hello, World!

在博客园写的第一篇博客。

关于写博客

写博客这件事情我不算是第一次做了:多年以前(大概是小学五年级)我凭着自己匮乏的英语注册了一个免费的 .tk 域名,找了一家免费的虚拟主机提供商,艰难地搭建起了自己的博客,在上面发的东西大多和我当时的兴趣有关——编写游戏挂机脚本,魔改植物大战僵尸(解压 assets ,把里面的僵尸素材替换成老师的头像),用 VB 编写一些 GUI 程序,以及如何搭建博客这件事情本身。后来由于运营商跑路,我也失去了整天到处迁移博客的耐心,在百度空间注册了博客,发得倒是很勤快,每周都发个一两篇——不过全是一些转载的工具教程,Linux manual page,照猫画虎的一些操作记录等等这类的无聊博客,现在看起来自己都觉得不好意思。百度空间倒闭后,我注册了一个自己的域名,找了一家性价比很高的境外 VPS 提供商,重新搭建了一个博客,当时对信息安全很感兴趣,于是发了很多这方面的经验,以及我自己写的一些工具。再后来上了大学,又觉得自己的博客质量堪忧,全是是黑历史,于是推倒重来,用 Hexo + GitHub Pages 建了一个新的博客,但却长草甚久,很久没有发过新的博客了。

这个现象似乎不只在我一个人身上发生,我发现周围许多技术圈子的同学即使还维护着自己的博客,都不爱发博客了,我对此有以下观察:

  • 一篇优质的博客可能要耗费大量时间编写。对自己声望比较看重的同学不愿意以次充好,在低成本发出大量低质量博客和高成本少量高质量博客之间,很多人选择了后者。
  • 社交平台越来越多。很久以前博客是为数不多的能自己发声的网络平台,大家习惯于订阅别人的 RSS,一有新文章就赶紧去评论抢沙发,板凳……现在有了微博,朋友圈,QQ 空间等等等等,100 字左右简短的故事 + 精美的配图往往能更即时且低成本地让人获得「社交感」,自然博客逐渐式微。
  • 害怕自己犯错。随着自己见识增多,对自己犯错误的担忧也越来越多,做的事情越多就越容易出错,每次想要发博客却都担心自己的观点是肤浅甚至是错误的,害怕被他人评论为「民科」。在这样的担忧下,比起写成可能有误的文字挂在博客上,自然是更宁愿和熟悉的人口头交流。
  • 博客需要的背景太多。去年我曾打算发一篇关于 LLVM 的博客,并且希望能写成一篇能让大家都看懂的博客,但是却发现这背后需要补充的基础知识太多,而且由于「知识的陷阱」的存在,可能即使补充了这些背景,也很难讲清楚;另一个方面来说,如果我要把我的经验当面分享给我熟悉的几个同学,我能确保只讲关键的部分大家便能完全理解我的意思,如此一来我完全失去了把这些东西编写为博客的动机。
  • 博客不适合知识管理。线性的文字越来越满足不了复杂知识的表示,以我自己为例,我的知识管理基本存在于几千篇短小的印象笔记中,有的甚至没有文字说明,就是一行命令,但那足以让我自己看懂。对于需要整理的知识,我有自己的 Wiki 系统,各个条目互相引用,比博客方便得多。
  • 懒。编写博客遣词造句、排版、配图无一不需要花费精力,繁忙的学习工作之余,写作的热情不足以克服惰性。

以上的问题有的我还没完全想通,但既然 AES 这门课要求我们写博客,在这种外部压力下,我也非常愿意重新开始尝试写博客,即使是肤浅的、可能有误的、不那么容易理解的观点,也在这里分享给大家,如果有误,还望不吝赐教!

自我介绍

我叫 Jiyan He,中国科学技术大学计算机科学与技术学院本科在读,目前在 Tieyan Liu 老师的 ML 组实习,mentor 为 Jiang Bian。

我从小就喜欢玩电脑,一直以来喜欢计算机的一个点是:绝大多数别人能在计算机上做的事情,只要你愿意,你也能做。这一点不像化学或生物等学科,要是你没有合适的材料和仪器,很多实验只能作罢(现在有很多人工智能的论文越来越过分,既不讲清楚数据集,也不开源代码,实验结果全靠一张嘴,完全不能复现,这让我感到很不爽)。我以前喜欢信息安全和算法,认为他们是很有「力量」的技术,信息安全能让你的系统坚固,或去攻破别人看起来坚固的系统,我参加过不少信息安全竞赛,也以发起人的身份举办科大信息安全竞赛;算法可以让很多看起来不可能的任务在可接受的时间内完成,我高中参加了信息学竞赛得过省一,大学也参加过几次 ICPC/CCPC,最高奖项是中国赛区决赛银牌,觉得最能拿出来吹的是参加 CCF 举办的 2018 年全国并行应用挑战赛,把 SOBI 二阶盲源分离算法的性能提升了 106.67 倍,获得冠军。虽然不算是很拿手或很感兴趣,我也做过一些偏工程型的项目,大一的时候为程序设计课程编写了一个在线评测系统,已经有数千人,八个教学班使用。我的组织能力也还行,大学期间是校内最大的五星级社团 Linux User Group 及微软学生俱乐部会长,维护着亚洲地区最大的开源软件镜像站。我也特别喜欢和别人交流,不管是在高中还是大学,我都认识了很多不仅聪明,而且善于思考,想法很多的同学,和他们交流我觉得收获很大。我喜欢尝试新事物,但讨厌长时间做单调枯燥的工作,那 100% 会让我犯困。业余时间我喜欢听音乐、看动画和摄影。

现状、经验和计划

(1)在你一生中身体最健康,精力最旺盛的时候,能在大学全职学习和研究,这是少有的机会。请说明一下,你是怎么选择了这个专业的?离成为一个合格的 IT专业毕业生,在专业知识、技能、能力上还差距哪些?

 选这个专业主要是觉得我比较感兴趣也有一定的优势,高考完调报志愿的时候,我家长把选择的事情全部交给了我,我花了几天时间预测(幻想)了我选各个专业之后的日子,果然还是计算机比较适合我。离一个合格的 IT 专业毕业生我觉得我还是差得有点多,平时都是凭自己兴趣在做事儿,虽然做的事情也不少,啥都会一点,但有很多能力还达不到「职业」水平,特别是在我没这么感兴趣的方面,能力非常欠缺,具体如下所示:

项目 目前 目标 如何完成
程序理解 5 8 多阅读,多分析
架构设计/模块化设计/接口设计 3 8 学习优秀的设计方法,积累经验
单元测试/模块覆盖率 1 8 多编写测试样例,使用相关测试工具
效能分析和改进 5 8 掌握更多分析和改进的技巧
处理大数据 1 8 多练习处理大数据的方法,掌握相关工具链

(2)阅读一下博客,并务必写一些心得:

a) 你为何要来上课并且认真参与

学习好 AES 这门课程有助于弥补我在很多方面的不足,特别是在之后和他人合作的情况下会有很多帮助。

b) 你在大学中体验到了哪种师生关系,你希望这门课是什么师生关系?如果老师布置的作业对你来说有些困难, 你会怎么样:

在大学很多老师和学生交流的比较少,更像是一种 Retailer / customer (餐馆/食客) 的感觉,因为有评课社区和同学们口口相传的评价,让学生得分更高、作业更少、想方设法让学生通过的老师往往更受学生欢迎,只有极少部分部分课程有一种 Coach / Trainee (健身教练 / 健身学员) 的感觉,有的同学甚至在这种课程上完成了自己的第一篇论文。

如果布置的作业困难,我会向老师和同学请教,花更多时间,把作业全部完成。

c) 在工作中,我们要引用文献,参考别人的资料,在别人工作的基础上继续开发, 这些活动和抄袭、剽窃的区别是什么?请仔细阅读相关文章,并询问老师在这门课中的要求,了解学校对于抄袭的处理规定。 

工作中出现的材料未特别指明的,都应该是作者原创内容,如果要使用别人的结果,需要明确地指出。

(3)几年后,你可以做学术研究、做软件项目、做其他专业的工作,做公务员,出国深造,回家继承家族企业...  ,不同的选择有不同的努力方向, 你今天是怎么为将来准备的?

我希望以后做一些并非完全理论上有效的研究,希望自己的研究能应用到现实中去。针对我之后的目标,我应该在近一段时间锻炼能看懂别人研究成果,能复现别人研究成果,能独立或团队实现自己的研究成果的能力。我的优势是我对项目开发需要的基本工具链和框架已经有不少经验,在学习新的技术方面也比较快,劣势是理论基础不太扎实和没有太多方法论。我的规划是在这一学期多学习理论知识的同时,为之后团队合作、工程实现做好准备。

(4)你在这门课的计划是什么?参考一些学校的教学(美国本科,中国软件工程本科1,美国大学软件专业),你对这个课程有什么期待?你打算怎样度过这个课程?你想当助教么?

我希望在这门课中学习到更多应对中型、大型规模的,更贴近现实的项目的开发方法,因为之前接触得比较少,多数是自己开发的 toy project。

你目前的代码量是多少(列出语言和代码量,精确到100行)? 为了有资格入职一流的软件公司/互联网/人工智能公司,需要多少代码量?从事高校教学科研工作呢? 

语言 代码量
C/C++ 约 15000 行
Python 约 15000 行
Javascript 约 5000 行
PHP 约 3000 行
Java 约 3000 行

代码量这个概念我觉得有点过于笼统,比如我在机器学习方面的代码量(主要是 Python)可能不到 3000 行,这显然是不满足任何入职或科研要求的。

你打算平均每周拿出多少个小时用在这门课上(时间包括上课时间)?

8~12 小时

你计划在本课程结束时,完成多少代码量?每周应完成多少代码量?

3000 行,每周 200~500 行。(我还是认为代码量是一个意义不明的衡量标准,如果是写前端、路由、CRUD 之类的代码轻松就会有好几百行甚至上千行,核心部分的算法可能一天才能写 50 行)

(5)你现在的道路很多前人曾经走过,他们有什么经验教训?请从博客末尾的文章列表任选一些阅读,针对其中一篇发表感想。

针对「不要轻易在简历上写我热爱编程,我热爱学习」,我的感想是不管在什么领域要做成一件事儿都是有代价的,这些代价也不是轻轻松松就能接受的,可能需要在一段时间内牺牲休息娱乐的时间,要自己摸索出方法,只有真正付出努力,才能得到回报,而不是嘴巴上说说。

《构建之法》读书笔记

关于 p4-p5 中师生关系的论述,我觉得对于绝大多数学生,老师以一个高标准去要求和评价学生是没有问题的。但是现在的实际情况是很多学生已经有日后明确的打算了,而学校培养计划中的课程对自己的今后的发展帮助不大,或者说效用不大,虽然说多学东西是没有坏处的,但学生的精力是有限的,把学习对自己来说效用低的知识的时间用在效用高的课程上显然更好。如果每个老师都单方面觉得我的课程对学生最重要,最有帮助,那学生就会觉得非常苦恼。举一个实际的例子,我们学校的计算机学院仍然在将大量的物理课程作为必修,如果这些老师都使用高强度的授课方法,这种情况下,学生又该怎么办?

关于 p40 中提到的单元测试,提到「单元测试必须由最熟悉代码的人(程序的作者)来写」,然而很多时候程序的 bug 就是因为作者本身的思维盲区导致的,作者的这种错误也会体现在编写测试样例上,比如既没有在编程时考虑到除以 0 的问题,也没有在编写单元测试时考虑到除以 0 的问题。如果编程、测试都由一个人来,岂不是会造成很多这种情况。

关于 p71 页的自知之明的论述,配图描述了一个先增加后减少,最后再次增加的“对一个问题发表一键的意愿-对一个问题了解程度”曲线。我认为这(这个曲线图)是没有意义的,如果真如这个曲线所描述,那么我们可以说任何人都处在第一个峰——人类很难想象自己没到过的水平,就像人类很难想象高维空间一样——那么其实自以为是就只是和人的性格有关的属性罢了,谦虚的人永远都会知道自己不是啥都懂的,不会表现得头头是道,而容易自以为是的人永远都以为自己已经开始在第二个峰上。

关于 p75 页的代码风格规范,我认为这和项目、语言、工具链有关,脱离这些来谈论规范是没有意义的。比如 tab 的 indent,如果是在基于 Linux 开发,显然要和 Linux 其他代码保持一致,宽度设为 8。

 

你可能感兴趣的:(Hello, World!)