« 闲扯几句图形界面的设计 | 返回首页 | 网络游戏中商人系统的一点想法 »

程序员的职业素养

今天收到了《程序员》杂志 2012 年 12 期的样刊。上面有我应邀写的一篇稿子,在这里为自己存个档。


程序员是可以当作一生的职业。但首先,你需要热爱编程,而不是把它作为完成其他人生目标的工具。

既然计划投入数十年的人生,那么一定会不断的反思自己在哪些方面的努力是更有效率的。换句话说,现在的你,和十年前的自己到底有哪些不同,十年后又怎样超越现在的自己?

我的职业生涯还远远没有过半,深深感觉沉淀不足。总会有新的理解迭代到旧有的想法上。这次应邀来用简短的文字探讨这个深刻的话题,只能尽力来表达一些现阶段的浅薄之见。

我认为,一个程序员,无论他在哪个子领域工作,都需要在三个方面提高自己。

首先,保持对未知领域的好奇心,尽力开阔视野。

如果你只精通一门编程语言,那么就赶快去学习另一门,最好和之前的那门语言亲缘关系越远越好。这可以让你从不同的视角去看待过去的问题。

如果你只专注于一个领域,那么深入研究一下其它领域会有很大的帮助。大多数人都喜欢在自己熟悉的知识结构下解决问题,因为全新的东西总有学习门槛,你需要去了解很多基础知识才能开始实际的工作。在大脑里把相关信息组织起来轻松调配,和借助外部资料是很不一样的。后者要经历一个相当痛苦的过程。但是,一旦你习惯经常学习,可以逐步掌握一套自己的方法减轻这种痛苦。大多数人实际会遇到的领域有限,看似没有价值的知识,学习起来更为困难。要做到这点,需要保持单纯的好奇心。

其次,把握各个层次上的细节。

尽可能向人解释清楚系统每个层面的运行。硬件如何调度机器指令;数据在硬盘、内存、缓存、CPU 间的流向;代码如何被编译链接,代码经历了何种过程被加载到内存,JIT 怎样加速字节码的运行;操作系统怎样管理线程、处理 IO ;软件用到的第三方模块和工具如何在处理数据;在网络环境中,数据流的通讯协议;你的代码中每个模块逐个层次中的相互关系……

对细节掌握的越多,思路会越清晰。在每个层次上,你会看到不同层次的设备对上一层业务逻辑的抽象方式,直到最终你直接面对的业务。对业务的抽象能力,不仅仅来自于你的业务的熟悉程度。这种能力是随同细节把握能力同时俱备的。了解的越多,就越能知道你经手工作的合理性。

第三,对代码的直觉。

优秀的程序员能很快的发现性能热点、找到系统崩溃的原因、找出不合理的代码…… 准确的估算能力非常重要,快速心算出每个模块的开销和输入的数据量之间的关系;在写下每行代码时能够判断其对性能的影响、以简洁去挑战各个层次模块间的耦合复杂度。

培养这种能力,以我个人浅见,除了不停不断的编写代码,别无良方。在写代码的同时,时刻保持着思考,对坏味道的地方零容忍。只要在最早的时刻动手,任何推倒重来的代价都不会太大;而放任它们在那里只会让局面演变到不可收拾。

保持自己总有代码可写,不断的去发掘自己新的兴趣点,拓展新领域。单纯一些,编程本身就是一件有趣的脑力活动,而不必仅仅为了解决一些问题而写程序。

云风,2012.11.6

Comments

有时候作为一个程序员真的是很累,特别是找错的时候真的是要死了,还是要懂得适当放松才行啊

偶像的文章,现在才关注到!
读了你的文章感觉很好,因为身边的人无论是不是程序员,都不怎么能理解我对编程的执着。
第一点提到的痛苦过程,大学时候经历过,现在一样又在经历中,但不觉得痛苦,而是对自己有能力接触新事物而高兴。这可能是和自己的性格有关吧,总对不了解的事物感兴趣,而且也希望以不同角度去看世界。
后面两点也是自己一直坚持的!

如何做到"保持总有代码可写" 对这点一直很困惑

“对业务的抽象能力,不仅仅来至于你的业务的熟悉程度。 ”


错字。

“对业务的抽象能力,不仅仅来至于你的业务的熟悉程度。 ”


错字。

要的额即使职业素养啊

同意最后一段,可是如何“保持自己总有代码可写”?
一直想写些东西,可是又感觉无从下手,也不知道该写些什么。有人有同样的困惑吗?

"在写代码的同时,时刻保持着思考,对坏味道的地方零容忍。只要在最早的时刻动手,任何推倒重来的代价都不会太大;而放任它们在那里只会让局面演变到不可收拾。"

写得很不错啊

云风你好,简悦科技首页上的狂刃是你所在团队开发的吗?

王道现?

现学现用的技能不值钱,需要长期积累才能做好的技能才值钱。一个好的程序员的价值就体现在其知识积累的程度,思维训练的深度等等。。

现学现用的技能不值钱,需要长期积累才能做好的技能才值钱。一个好的程序员的价值就体现在其知识积累的程度,思维训练的深度等等。。

我是新人。
上班一年最大的感触和纠结是在于第二条,除开个人的特殊资质,第三条应该算是第二条的延伸··
感觉作为一个新人的问题在于:碰到技术问题是:不了解技术细节,没法迅速判断问题点,只能挨个排查···这个大概就是“经验值”的意义吧。
要是多个技术细节不清楚,就很难描述清楚当前的困境,接着理不清思路,乱了···

很好的文章。

另外说一点,遗忘也很重要。

学了一些花哨/深奥的知识/技术,过一段又忘记了,这不浪费吗?

一点都不浪费。会忘记,说明你学的是花哨/深奥而不是知识本身。这种东西,忘不掉才是个大麻烦。相反,吃透了的思路、学到了的思维模式,永远忘不掉,而且可以自然应用到任何适合的场景——表现上,就是举一反三。

深以为然啊!可惜我不想当程序员了,我要当科学家!^_^

关于第二条:
细节很重要,但也应该建立在对整个知识体系的把握上面。我们的知识就像软件一样,随着我们对新事物的理解,不断的重构。所以对未知领域保持好奇心,然后在把握知识细节的基础上,把新的知识融入到已有的知识结构上,很重要。跟软件的重构过程相似。
没有结构的知识,只是量变,没有质变。所以Evernote还远远不能满足。

学的编程语言多了,但是平时工作中可能主要就用那么1/2种,如何保持对其它语言的熟悉程度?《程序员的职业素养》中提到要经常用各种语言做一些练习,就像练琴的人每天都做基本功练习一样。感觉每天联系确实需要很大的毅力,因为有时候工作很忙,根本不想去关注非当前工作之外的东西。

日志的三个bullet points都很赞同。关于评论4,有一点想法。目前心理学上认为,人类的长期记忆是无限的。把细节记录在Evernote上,定期回顾笔记,并且构造能够回忆起这段信息的cue,任何东西都可以被记忆。

同意关于上面关于细节的说法。计算机领域扩展开来,涉及领域非常广泛,从底层硬件的优化方式,器件的选择,到操作系统层面的调优,到上层UI库无数的功能和运作方式,以及各种领域(算法,统计,图形学,业务逻辑..),能够学好一部分已经不容易。。

如果一个人能够掌握无限细节当然好,可惜人的记忆容量有限啊。Evernote之类的软件可以勉强当外存使用,但还是太不方便了。要是大脑上能插内存条就好了。

强烈支持把程序员作为终身职业。

沙发!

赞同最后一段,如果很长时间都不写代码了,还能叫程序员么?

Post a comment

非这个主题相关的留言请到:留言本