你距离一名优秀的程序员有多远?

By 水木神風 at 2016-11-09 • 0人收藏 • 2302人看过

程序员,一个有能力改变世界的缔造者,是无数有志青年的理想职业。但是,作为一名优秀的程序员都需要具备哪些素质呢?你距离一名优秀的程序员有多远?

你距离一名优秀的程序员有多远?

1,职业道德

什么?写代码也有职业道德?是的,而且还很重要。写代码是一门良心事业,因为通常你写的代码只要符合规格、能正确执行,就可以交差了,而你的主管或同事很难一眼看出程式码品质有问题,例如:在特定条件下会当产生bug、滥用复制粘贴、采用一些肮脏的写法、代码可读性很差、模组之间纠结在一起,等等。程序员的纪律和职业道德很重要。

2,代码语言

语言的学习,是程序员最最基本的能力,而且应该至少精通一两种语言。随著工作经验的累积,学习不同语言的速度会越来越快,例如从几个月缩短到几周。当然精通一门语言,不是几星期、甚至几个月就能达成的,但迅速接手并维护既有代码,是对合格程序员的基本要求。

3,资料结构及演算法

如果你是本科毕业,代码结构及演算法应该是必修课。如果没学过,建议花点时间学一下。倒不需要买一本厚厚的书折磨自己,但基本的概念一定要有,例如:

4,资料结构

阵列(array)、串列(list)、堆叠(stack)、伫列(queue)

树(tree)、二元树(binary tree)、杂凑表(hash table)

指标(pointer):这也许不算资料结构,许多高阶语言也

不让你用pointer,但是对记忆体、指标要有概念,这是程序员与非程序员的区别之一

5,演算法

对以上资料结构的各项操作

排序(sort):至少搞懂3、4种基本的排序演算法,例如bubble sort、quick sort、merge sort等

搜寻(search):depth-first-search、breadth-first-search、binary search等

其它:迭代(iteration)、递迴(recursive)、分治法(divide and conquer)、时间/空间複杂度的基本概念(big O)等

网络上资源很多,Google 一下、多写一些代码练习,弄懂以上基本概念,应该就够用了。

6,网络协议

TCP/IP、HTTP、DNS 等这些都是基本的网络协议。不需要到专家级别,但身为一个程序员,除非你的工作与网络完全无关(这种工作应该越来越少了),否则对这些网络协议的运作应该要有起码的了解。例如你能讲清楚,从你在浏览器输入一行网址到看到网页内容,在网络上发生了哪些事?以前我在Yahoo 面试前端工程师的时候,喜欢问一个问题:请解释cookie 是怎么运作的?结果不少人答不出来。

当然现在的代码开发环境很方便了,各种library 一大堆,我们通常不需要自己实做这些底层的东西。但不懂这些东西运作的基本原理,会让你在debug 时被卡住,因为整个网络系统的运行,都是建立在这些基础架构之上。这些网络协议,再过很多年还是会继续存在,花一点时间搞懂这些,我认为很值得。

7,除错能力

讲除错能力不太准确,因为除错不是单一能力,而是结合了经验、对代码的了解、对系统架构的了解、抽丝剥茧的能力、直觉,以及各种hands-on能力的综合,就像当侦探一样。

我在Yahoo 工作期间,最刺激的事莫过于排全球on-call了。所谓on-call,就是全球Yahoo 网站出包时,你要在最短时间内找出问题并修复,那真是超级debug。拜託,Yahoo 网站那么复杂、代码又那么多,出问题的代码又不是我写的,美国同事都下班了,鬼谁知道怎么解决?对不起,那是你家的事,排了on-call 你就得想办法解决。功能上的问题还有迹可循,最棘手的是像系统过载这类问题,爬log、写、trial-and-error,总之想方设法揪出元凶。

程序员应该具备良好的除错能力,不管代码谁写的。另外,修bug 也是一门学问,是采用锯箭法、贴狗皮膏药,还是找到病灶、解决问题背后的问题,就看程序员的功力了。

8. 你写代码必须很有纪律,例如:

不着急马上写代码,先想清楚问题、解法、架构

恰到好处的注释,少了不行、过犹不及

用心想过的命名(业界有句名言: There are only two hard things in Computer Science: cache invalidation and naming things.)

压抑copy & paste 及产出一堆烂代码的冲动:

——Bingo! 找到一段代码了,看我的copy & paste

——可以运行就很好啦、这么漂亮的解法……

——好累,我不行了,先commit code 再说

在commit code 之前,自己再好好review一次(个人经验)

10. 现实环境的因素,导致好的代码不易产生

项目过程中的压力

程序员经验的限制

团队未采用一些最佳实务

有决策权的人对软件开发不够了解

代码品质的重要性,每个人都知道,连路人甲都知道。现实的难处在于:第一版的代码,只要能工作,品质好坏是很难看出来的;它们的差别,要到系统后续的运行、维护及扩展才能看出来,然而此时木已成舟,代码只能修修补补继续用下去,最多小幅重构(refactor),直到软件生命周期的结束。

写出好的代码,时间会花比较久、会导致项目时程延后吗?其实并不会,这是能力限定,不是时间限定。写出第一个版本,花的时间都差不多。但后续版本就差很多了,写得越好的代码越好改。你如果改过那种high coupling 的系统,你就知道我说的意思了,那真是人仰马翻,超high 的。这种代码要是装在箱子裡,箱子上会标示「易碎/FRAGILE」。

程序员是一个高端的职位,对于从业人员的要求自然略高一些。想要成为一名优秀的程序员,还需要不断地在技术和职业素养上提升自己。


登录后方可回帖