开学一周后的小反思 —— 考虑「程序员」的本质
近几个月来,有几个现象:
- 放假的时候我游历了若干个大学、城市。
- 我见识了一个小痨软件公司的工作环境。
- 放假的时候我没有去「工作」,而是去努力学习了不少杂七杂八的东西。
- 开学一周了。目前的课让我感到不甚爽。
我觉得是时候想想、写写这些现象的原因及(因果)联系,以及我到底在干嘛、为什么那么干。
游历各大学
我感受到了有的同学多么努力;我感受到了有的同学多么水。也见识到了一些课可以多么水。我看见以前生活在同一个地方的一群同学们各自生活在新的城市。
伪实习
我去那个公司「实习」期间,感受到了刻板的 "processes", 潜在的「办公室(政治)」的 overhead, 同事们潜在的目光短浅、胸无大志、闭门造车的问题,使用的技术之落后。
小学期
"Summer school" 这个概念跟国内的「小学期」应该是同一个东西。在小学期里,我仅有一门课 —— 一门一年级的大类课:入门工程力学。同学们要么是跳级的尖子生,要么是挂科重读的落后生;并且所有人来自各个不同的年级组。上课的老师是个破老师(而不是标准学期时会出现的一般的老师)。课堂不活跃、同学学习不积极。当然,课十分简单,也没什么好积极的。
小学期中、课后,我学习了不少东西。起初我每天晚上随便往 todo list 里心血来潮地添加一些条目,然后次日去做;后来列表上出现了更 cohesive 更可观的一些项目,我就专心做那些了。
当然,在「有大量可自由支配的时间的日子」里,我会略懒、略分心。我为许多东西的学习开了个头 —— 不少其实开了个不错的头。但是东西有点多,无法同时推进进度。
真的开学了
写本文之时,新学期第一周恰已结束。一方面,开学不会使得在假期(小学期)产生而未完成的 "todo list item" 被扔掉;但另一方面,常规课程之要消耗许多时间经历也导致了推进那些 todo list items 变得比假期时的懒惰时更为缓慢。
再一次:学习 vs 学业
再一次地,学习显得与学业有所冲突了。(注:上一次大概是高一。)不知是否和「被迫做的事情都会变得不想做」、「给钱请熊孩子践踏草坪他们就会懒得践踏」、「干不着边际的活儿的时候才是产率最高的 (- @stef)」出于同样的原因,课上教的内容远远没有我自己乱找来的要能令我感到兴奋。
To be fair, 其实「课上的内容令我感到(十分)兴奋」的情况是有出现过的,不过目前这些案例大多出现在专业内的数学课上。其包括入门的线性代数以及入门的离散数学。OOP 的课也引起了类似的兴奋,不过强度要较那些数学课为略小。
令人兴奋之事
学习某些东西 —— 某些特定的、不一定难的、可能还挺小的东西 —— 的时候,我能够感到无比的兴奋。比方说我找到了那本 Haskell 的小书的时候,或者四处搜寻 OAuth 的解释的时候,或者用 Django 写了我第一个能够发推的东西的时候,或者自己上 MITx 学线性代数的时候,或者从 Coursera 想办法学单变量微积分的时候,或者从 LCM 给我的 CS61A 的材料加上 SICP 学编程的时候,或者上网搜 typography 文章的时候。
在这些事情上,我不会想太多 —— 在大概两层「为什么」之内我基本会认为这些东西「显然要学」、「迟早要学」,并且「学着爽」、「学来有用」。
从反思同学的境况获得的旧问题的新视角
有个 J 某同学本科毕业了。他「打算去英国读 master」,但是「他们只收 honours 生」,所以他在考虑了澳洲的一个学校之后打算回来学校读个 honours.
以旁人随口提问的态度,我颇为自然地就可以针对他的想法提出许多问题。例如:「读完 masters 干嘛?」,「怎么才能进那个 masters?」。这些问题完全可以用于自己;如果我用之于自己,我是会回答不太上来的。
但是同学的回答都比较简单。要么是「(当然是)××啊」,要么是「不知道…」。是啊,「何必严谨」?能够解决自己计划上的问题的答案就是好答案。(本两句可以清楚地遇见被未来的我喷。)
我在干什么
我在成为一个程序员。—— 注意,「程序员」和「码农」是有不少区别的 —— 虽然这些区别我还没能清楚地列出全部 —— 其中一项为「码农是死板的」。
学习各种编程技法、各种数学分支可以给我更多的「思考的工具」来思考各种问题。以一种「工程」的态度,将这些「思考的工具」应用于各种现实中的问题,就可以推进该问题的解决。这些「思考的工具」更是可以用来思考事物的本质。
我想举些例子。比方说,「一针见血的逻辑」可以帮助直接地认识、回答问题 —— 比如见我《生活的算法》;将问题的本质用软件工程界尊崇的 DRY 原则理解并表述出来,可以使得 implementation 和 问题本身 两者各自的细节构成某种一一对应的关系,从而可以使得「有多简单的需求变更就有多简单的 fix」;
Some remarks:
- 每个程序员,一方面由「编程」的本质而需要习惯 formal language, 另一方面由「软件」的本质需要理解「现实世界」中的人和事。(「现实世界」又称 "application domain"。)
- 程序员思考清楚了事物的本质 就能且才能 写出好的软件。
临时的感悟
写上面的 remark 的时候,我临时产生了一个感悟:我是幸运的,因为我貌似能够在做自己喜欢的事情的同时养活自己、为社会做点好事。原因是这样的:
我越是一个好的程序员,便越能够以严谨(如 formal language)的方式认识事物,便越觉得给现实中的问题提供一个解是容易的事 —— 从而能够有一个「解决问题总数」的更大的期望值。而我 —— 至少目前来讲 —— 对于「思考事物的本质」十分有兴致;我觉得此事有其自身无需被 justify 的意义。所以我能在寻求 "intellectual enlightenment" 的同时顺便解决一些人们的问题。想来真是太棒了。
为什么我要那么干
至此,不用多说了吧?取现实之事物,满足自己的求知欲,又解决他人的问题 —— 何乐而不为?
前因后果
首先,在去年,我感受了下「软件工程」专业的学习。
在感受了各个大学的学习,以及同学们的生活之后,我对「大学」、「学习」、「生活」有了更多的感受、认识。
在小破公司的一个星期,我认识到了「他们」所谓的「软件工程」可以达到的「物价值」的程度。这引起了我思考「为什么编程」、「什么是码农」等问题,以及帮助了我构想我所向往的(工作)环境与生活。
小学期其实可以认为是宝贵的一次很自由的「思想的实验」的机会。由于这个特别的时间里,我不需要考虑生活,也不需要担心学业,所以可以尽情将注意力放到「令我兴奋的事」上。
正式开学之后上的课里,以及和同学的交谈中,我又「记忆新鲜」地感受了自己的想法和当前的状况之间的「冲突」,得以较为严密、两者兼顾地找一个解释、一个答案。
此文立此为照,以鉴他人。