分类 感悟 下的文章

什么是软件工程师

软件工程师站在主观世界和客观规律之间,理解主观世界和客观规律,尝试使二者达到统一。

程序员、码农,不能很好的解释软件工程师在做什么。
用程序员、码农描述软件工程师,看起来好像软件工程师的主要工作是写代码,实际上,优秀的软件工程师只有 20% - 30% 左右的时间在写代码。
可惜的是,很多软件工程师,以及与软件工程师打交道的人,也认为软件工程师的主要工作是写代码,希望软件工程师花费 100% 的时间在写代码上,认为除此之外的事情,都是在浪费时间。

软件工程师第一件要做的事情,是理解目标。
理解目标这件事与写代码无关,与采用什么编程语言无关,与用什么数据库无关,与采用什么软件架构无关。
大到实现订单系统,小到实现一个列表页面,软件工程师都需要理解这件事,理解目标是什么,理解为什么做这件事能达到目标,理解为什么自己要做这件事,理解是否有更好的方式做这件事。
因为事情越来越复杂,产生的产品经理这个职位,目的是帮助软件工程师理解要做的事情,不能代替软件工程师理解这件事情。

软件工程师要做的另一件事情,是设计。
好的设计,应当是能达到目标的,应当是容易理解的,应当是可扩展的。
太多的人只会 CRUD,妄图通过 CRUD 解决所有问题。认为工程师的大部分职责,只是思考如何落表和取数,以及提供落表和取数的接口。
达到目标的方式,如果只是简单的存取数据表,只是 CRUD 显然没什么问题。流程复杂、操作复杂时,继续只使用简单的 CRUD,就不是一个好的设计了,难以理解,无法扩展。
应对复杂问题的设计,不是回报复杂的设计,而是用容易理解的设计化解复杂度。化解,不是让复杂性消失,而是让复杂性容易理解。复杂性无法消失,但可以容易理解。
现实世界中,交通规则既要提高通行效率,又要保证通行安全。赶过集的人,应该对人多时通行效率低,深有体会。各国的道路交通法,一般紧紧围绕着路权的概念展开:路上画好线,分好路权;判定交通事故责任时,有路权的责任小或者无责。这是交通规则的设计。
计算机世界里,网络通信也非常复杂,硬件不可靠,通信距离非常长,都让网络通信协议的设计非常棘手。无论是 TCP/IP 还是理论中的 7 层模型,都是通过分层解决问题。每一层各司其职,只解决一部分问题。而不是将所有问题集中在一个地方解决。这是网络通信协议的设计。

软件工程师要做的下一件事情,是分工。
现在的软件工程师,已经很难完全掌握解决问题的所有技能,有前端、后端、测试、运维。
分工,就是约定好各自要做什么,如何配合。
为了提高效率,工程师之间一般并行工作,并行工作结束后,大家的工作成果能不能正常配合,这是要在开始并行工作前,商量好的。

最后,才是编码工作。
没有前面几项工作的铺垫,拿到需求就开始写代码,轻则工作效率低,重则代码写出来不能达到目标,甚至造成问题。

哪里需要只会写代码的程序员和码农呢?

四年

博客放在 Linode 上,用的最低配置,每个月要 10$,太 TM 贵了,更搓的是,感谢 GFW,博客很久都不能正常访问。于是搬到现在的主机商,host1plus,按月付 2.5$ 一个月,而且能访问,赞。

博客代码换成了 typecho,手工把原来的文章一篇一篇搬过来,4 年多,才 34 篇而已..

博客和自己的 review 一样,写完了从来不看的。这次没办法看了一遍,嗯,有些真恶心..特别是那些有感而发、伤春感秋的,太可怕。

读书笔记类的,受益于书的质量,还能看一看;技术总结类的,有点实用性,还能看一看。

四年前刚刚被百姓网开除,觉得自己的技术真是烂,别说服务器运维,连 PHP 都弄不明白,当时觉得,弄个博客我就能开始积累技术了,嗯,就是这么朴实。

一开始用的是老薛主机,在一个笑话网站上看了几年的广告,开博客的时候用到了。当时只是一个空间,就是服务商提供一个 ftp 接口上传 php 代码,自己再绑个域名到指定 IP 上,就好了。当了一年半网站码农,当时这些都不懂,晕晕呼呼搭建了起来。

后来进了火花。

一开始在火花,日子很难熬。除了对 PHP 有些许的了解,其它技术基本没听过,比如建个 web 服务器,搭个搜索引擎,这些完全没有概念。技术之外,工作能力也很差,比如理解需求,出技术方案,管理自己的时间,管理自己手上的事情。

和在百姓网一样,每天加班到很晚,回家了也要做工作上的事情。只是没有在百姓网那么傻乐自嗨了,会被别人骂,会因为 Jim 说相信自己有能力只是心态不好而倍感压力。以为自己是因为“挡了别人的路”被开除,以为自己已经客观评价了自己的能力,其实自己比自己想象得差了很多。

受白老师对 Linode 经常有意无意的宣传影像,用上了 Linode 的服务器,除了能放博客,还能翻墙,划算。开博客的时候,已经没有日本节点了,用了新加坡节点,慢得出奇,勉强能用。

四年好快。做了很多很傻的事情,比如订年度目标,结果一大半没完成,也有更多开心的事情,和朋友去九寨沟玩,和父母去北京玩,买了房子,坐了不止一次过山车。

在火花呆了四年,获取的比付出的多,理解事情和做事情上,比四年前的 SB 程度低了很多。

期待 2017,这次我还要立 flag。

锤子和敏捷

用锤子钉钉子是日常劳动的一种,利用惯性让力量集中爆发,从而让要费很大力气的事情变得轻松。

一枚钉子,立在墙上,如果是强行摁,很少有人有力气能将钉子摁进去。

锤子为什么可以呢?因为使用锤子需要有节奏,首先是准备,积攒,然后挥动,冲刺,最后接触钉子,爆发。

其实我想说的是敏捷。

题目里的敏捷,我指的是敏捷开发。大致意思,是以前开发很久才上线,然后又花很长时间开发 2.0,上线,这样的时代已经过去了,应该更早的上线,接触用户,听取反馈,更快更小的改进。

为什么?我的理解是成本的考虑,节省金钱和时间的成本。世界变得太快,今天炙手可热的东西,明天就是一堆垃圾。软件开发也是一样,没人弄得清自己想要什么,没人接受的了大把时间和金钱的投入,换来自己不想要的软件产品。

做做看吧,做出来我才知道自己想要不想要。为了适应这样不稳定,不确定,不靠谱的需求,就有了敏捷。

敏捷有他的好处,它让需求具象化,可以操作可以把玩的产品,比需要想象而不确定的需求,更生动,更容易判断。

敏捷本身无所谓好坏,只是一种工具,但敏捷这种工具,容易丢失节奏。

传统的软件开发流程,比如瀑布或螺旋,有很明显的阶段,这个明显又死板的阶段,客观上把握了节奏。

到了敏捷开发,因为每次修改更容易,更轻量,代价更小,很容易出现对软件系统随意修改的情况。如果开发人员由于松懈,或出于尽快完成的目的,容易将一些本来需要仔细、系统思考的修改,变为不经意、随意的修改,或者说,用不合适的工具,强行完成了任务,而这些任务,本来是需要站在整个系统层面去思考的。长此以往,系统就会出现漏洞,变得难以维护,生产效率降低。

类比敏捷开发和钉钉子,缺少节奏的敏捷开发,过程就是:前几锤子很轻,很有目的,后面不在准备、冲刺、爆发,而是通过锤子摁钉子,花的力气很大,效果确很差。

设计的意义

开始做一件复杂的事情前,第一个动作往往很重要,撸起袖子开干往往费时费力做不好。有经验的人,往往会仔细想想,想想前因后果,想想手中的资源,想想先做什么后做什么,这个想的过程,便是设计。

激烈的篮球比赛里,就能明显分别出喜欢撸袖子和喜欢思考的人,比如威少,年轻有活力,著名的就是干,对立面是老奸巨猾的马刺,各种偷奸耍滑还得佩服它。当然,很多什么都不懂的人喜欢威少,因为热闹。

一个人的设计,代表了这个人对事物的理解能力,对问题的分析水平。好的设计,不意味着设计者在一开始就想到了所有问题,所有可能的情况,而是,这个设计能够包容足够多的情况,有可能很多情况,设计者完全没想到。

大部分建筑设计都不错。同一种房型,不同的人家,不同的家具,不同的习惯,都能适应的很好。徽派建筑中,天井的设计,既解决了采光,又解决散热和保暖的问题。木匠常做的木榫,不用钉子和胶水,就可以将两块木料,牢牢合在一起。

好的设计,往往只解决少量问题。房屋的设计者从不解决装饰的问题,而只是考虑采光,通风,保暖,管道铺设这些基本问题。

好的设计者,往往是好的工匠,反过来却不成立。因为越是优秀的工匠,越容易陷入到细节中。而好的设计师,不仅要知道如何制作,也要关心使用者的需求和习惯,使用的场景,还要关心材料,成本。好的设计往往是各方面妥协的产物,而好的工匠,更容易做出炫技有余,实用不足的物件。

再好的设计,也有局限性。有使用场景的局限,比如南北建筑的设计,在采光、通风、排水方面的考量,有很大的差异。还有材料的局限,比如木榫这样的设计,只能在木头上使用,钢筋塑料很难派上用场。另外也有时间的限制,氏族制度的原始社会,放到发达的今天,一定会成为旅游景点。

设计失效时,一种解决办法,是打补丁,好处是快、成本低,坏处是容易顾此失彼,补丁越来越多时,加了补丁的设计就会成为灾难。另一种是推倒重来,重新思考问题,重新组织资源,当然会有阵痛,但每一次技术飞跃,思想革命,最后胜利的,往往都是重新设计。

人生的意义

最近过得抑郁。工作又累又忙,总是出错,结果不满意。父母在家忙拆迁装修的事情,自己只能出出主意,什么忙都帮不了,有时候还会觉得父母吃了亏而吵架。

每天痛苦地挨日子,过了太久,总觉得生活的没有意思,想努力工作努力生活,却又觉得不知道为了什么而提不起精神。

最近一次发自内心兴冲冲想做一件事情,还是 12 年和父母去北京玩,为了圆自己一个孝子的梦。

从小到大,奶奶外婆说要听话,就好好听话,决不捣蛋;爸爸说要好好学习,考高分出人头地,即使不想学,也硬着头皮坐在凳子上;因为要找工作,所以找工作;因为别人都去旅游,看起来很好的样子,于是自己也跟着去旅游。做完这些事,意义是什么,并不清楚,只是别人高兴了,我就开心。

工作了,同事,老板,书里说,人要有目标。看看自己,擦,这么多年,竟然从来没有人生目标,只是为别人高兴而活着,于是很慌。20 几年没想过的事情,突然成了一个大问题。人生意义这个问题,越想越惶恐,为什么来到这个世界,为什么要做这一件一件事情,忽然,都没有意义,拼命做了一件事情又有什么意义,最后还不是一捧黄土,谁又记得你是谁,谁又在乎你干过什么事情。

这样想来,人生有什么意义,如果不是为了不让父母伤心,生和死,有什么区别。

阿燕说,他从来不想这样的问题,然后发给我一张图,说人生的意义,大致意思和阿燕差不多,因为身体内多巴胺少,过的不开心,所以才会想这样的问题。

上周看了《后会无期》,不能说差,只是处在抑郁中,看到什么都想象成救命的稻草,能拉自己一把,可惜这电影显然没有这功能。不过片尾曲《平凡之路》,今天倒是听得很有感觉。

仿佛是作词的人在教育听歌的人,你们的骄傲,痛苦,彷徨,成就,我都已经经历过,也失去过,你觉得未来有幻想,期待,恐惧,对我来说,只是和今天一样的一天,我们和这世间一切物体一样,经历着高兴痛苦,希望绝望,自认为了不起,世间独一无二,却不知大家都一样,只是世间平凡的一件物体,各自走着各自的路,无论得意忘形或是痛苦难挨,都要继续走下去,不要觉得有什么大不了,因为大家都是平凡的,走着平凡的路。

对我而言,平凡的意义,是这世间是平等的,一件事情,脑子和身体用了多大的努力,便会有对应的结果,谁也不会逾越这法则。放宽心,既然现在想不出所谓的人生目标,那就不要刻意去硬想,把眼前的,别人给的事情做做好。