日常的吐槽w

好久没有写点日常向的博客了,这次一个多月的休息期间,正好有足够的时间来让我回顾在学校里待的这几年,尤其是最近几个月来的软件工程_(:_」∠)_

TL;DR


软件自由文化


在通读完Steve Yegge所著的「A Programmer's Rantings」(程序员的呐喊)之后,有感而发自己果然是偏向自由派的。特别是回想起当我听到软件工程的课程设计需要各种各样的预先设计时,还真是感觉“当软工沦落在设计的文档间,算法依旧是永垂不朽的诗篇。”

当然,我也并非完全赞同这本书里的任何观点。从某个角度来说,这本书和软件工程的教材没什么不同,它们都是在向我贩卖自己的观点,而我也只是选择了我认同的部分以及现实中客观存在的部分。

这学期的软件工程课题是小组内投票决定的,虽然是一个我个人来讲不太感兴趣的项目,毕竟作为一个短期项目(从 9 月初到 11 月末),却要提交详尽的设计文档、数据流图、用例说明等等,并且小组组员要做好这个项目所需要的学习的内容也偏多。但是既然是投票决定的,那也就没办法了(´-ω-`)之后就口嫌体正直地写完了,并且还开源了——https://github.com/BlueCocoa/News (虽然也只是能用的状态

这个项目里使用的语言和工具多是相当自由的,比如 node.js,mongodb,redis,websocket。这些弱类型语言、键值对存储等提供了相当大的自由度,这样的自由度在项目初期是非常珍贵的,它意味着我们不用每次决定修改某些参数类型时要改一大串与之相关的函数和SQL表。正如「Hacker and Painter」(黑客与画家)里所说的

明白这一点对软件设计有重大影响。它意味着,编程语言的特性应该是允许动态扩展(malleable)。编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。它应该是一支铅笔,而不是一支钢笔。如果大家都想像学校教的那样编程,那么静态类型(static typing)是一个不错的概念。但是,我认识的黑客,没有一个人喜欢用静态类型语言编程。我们需要的是一种可以随意涂抹、擦擦改改的语言,我们不想正襟危坐,把一个盛满各种变量类型的茶杯,小心翼翼放在自己的膝盖上,为了与一丝不苟的编译器大婶交谈,努力得挑选词语,确保变量类型匹配,好让自己显得礼貌又周到。

在为这个项目写代码时,我不止一次地想到「Hacker and Painter」里的另一段话,以至于我还在项目展示的时候直接引用了(导致场面一度十分尴尬(其实并没有

很长一段时间我都为此事沮丧,就像小学里老师教我怎么拿铅笔,我却总是学不会的那种感觉。如果我那时看到其他创作领域,比如绘画或者建筑,我就会想到,自己的方法其实有一个正式的名字:打草稿。我现在认为,大学里教给我的编程方法都是错的。你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。

软件工程


在我个人看来,软件工程本身的确是有它的作用,但是学校里做东西的时间是不足以完全将软件工程说的那一套应用上去,这样有如进行敏捷开发一般,而且还是如同说的坏的那种:

简单来说: 其实是有害处的。首当其冲的就是,选择敏捷的技术主管和经理往往对现实缺乏足够的认识。坏的敏捷会在各个层面上伤害团队。

首先, 坏的敏捷会以最糟糕的方式关注日期:短周期,快速发布,不断的估算和重新估算。期长至以月为单位 (这大概还勉强可以接受),短至以天为单位,这是最糟糕的。这完全是理想化的世界。

按照(往往是过于乐观的)估计时间表来进行软件工程是不可行的,即使有产品出来,也会非常糟糕。更糟糕的是有人会认为增加编写代码的人就可以加快产品上线的时间。

这样的事我是真实的遇见过,在差不多两年前,有人邀请我加入他们的创业项目,然而我听到他们团队已经有 10 位程序员时,我就已经决定离开了。很明显,这样的人数对于一个软件方向的创业公司来说是在太多了,而协调各人员间的进度是一件非常不容易的事情。虽然现在多以模块化、解耦合的方式开发,可以节省一些时间,但是要做出一个应用的话,还是要将它们拼装在一起。这不是一件容易的事情,特别是对于一个尚处开发期的应用,接口和需求是随时变动的。现在想想,要是他玩过「文明」或者「钢铁雄心」这类游戏的话,知道有「叠加惩罚」这样的东西,或许就不会找那么多人来做开发了。

心理周期


在「A Programmer's Rantings」后面的段落中

而在现实世界里,项目的每个参与者都是人。人的状态是有起伏的。有时候你会精力充沛,一口气写 18 个小时的代码也没问题。有时候却心不在焉, 不想写代码。有时候则会感到疲惫不堪。每个人的生物钟和生物节律都不一样,几乎无法控制。要是团队按照天或者半周为步调,我们很可能无法与之协调。

以及在「Hacker and Painter」中

黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。

我个人是非常认同这样的观点的,因为我就是这样的人。在有了一个好的(至少是自认为还不错的)想法之后,经常会忘记吃饭、熬夜来做这样的东西,而我本人并不会觉得累,原因只是觉得这个项目非常有趣,我愿意花时间在上面。

计算机科学?


最后,我所读的专业——Computer Science。

我一直不喜欢“计算机科学”(Computer Science)这个词。主要原因是根本不存在这个东西。计算机科学就像一个大杂烩,由于某些历史意外,很多不相干的领域被强行拼装在一起。这个学科的一段是纯粹的数学家,他们自称为“计算机科学家”,只是为了得到国防部研究局(DARPA)的项目资助。中间部分是计算机博物学家,研究各种专门性的题目,比如网络数据的路由算法。另一端则是黑客,只想写出有趣的软件,对于他们来说,计算机只是一种表达的媒介,就像建筑师手里的混凝土,或者画家手里的颜料。所以,在“计算机科学”的名下,数学家、物理学家、建筑师都不得不待在同一个系里。

自从我看了「Hacker and Painter」之后,我也对这个名词进行着合理的怀疑,人们总说“计算机科学,计算机科学”,可是……

如果自己就是潮水的一部分,怎么能看见潮流的方向呢?

Where is the science in computer science - ACM

声明: 本文为0xBBC原创, 转载注明出处喵~

《日常的吐槽w》有3个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注