无数的人问过类似的问题, 怎么样才能做一个好的程序员? 在回答这个问题之前, 首先得明白什么是好的程序员, 这样才有方向和目标, 可是这事情太主观, 可能各人的标准千差万别, 不谈那些传奇性的独自一人做出伟大事情的特例, 也不谈什么上天入地, 上帝大牛的诡论, 以下是我比较认可的, 在通常的项目开发中, 一个好程序员的标准.
在项目开发中, 一个程序员的能力等于其解决问题的能力. 假如想有个尺度来衡量这个能力的话, 一个程序员的能力可以用能完成任务的规模和难度来衡量.
因为难度上不好那么简单的划分, 并且在一般的项目开发中(非研究性项目), 任务的难度主要来自于任务的规模带来的复杂度, 这里把任务从规模上大致的划分为1个函数=>1个类=>1个功能=>1个模块=>1个项目
更细致的划分时,函数, 类, 功能, 模块, 项目本身也有简单和规模大小之分.
-
一个初学编程的人总是从最小的函数和类开始学习的.
-
一个程序员能基本无误的完成项目中的一个功能算是合格, 在此之前, 对项目的生产力为负, 即为他布置任务, 沟通, 和为他修补bug的时间其实要多于自己直接完成该功能的时间. 也就是说, 项目中存在这个水平的程序员纯粹是为了培养人才.
-
能较好完成一个完整模块的程序员算是较好的程序员, 也是一般项目中的主要开发者.
-
能完成整个项目的程序员才能算是好的程序员. 在多人项目中可做主程.
-
对于初学者来说, 写好一个函数和类的难点在于语言本身的语法上.
-
对于完成一个功能来说, 难点在于理解这个功能, 以及很好的在现有的代码中加入此功能, 完成的功能不是独立于项目之外的, 而是要融入项目本身, 除了功能本身和其他功能衔接正常无误外, 特别重要的就是注意功能实现后不能对其他功能产生预期外的影响, 作为游戏开发来说, 典型的例子就是你完成的UI不能让其他该显示的UI显示有问题, 不该显示的UI又没有消失.
-
对于完成一个模块来讲, 暴露给外部的接口设计比内部实现的设计同样重要(甚至更加重要), 合理易使用的接口设计决定了一个模块的好坏. 模块内部实现不好尚可更改, 接口实现不好, 更改起来可能是灾难性的.
-
对于一个项目来讲, 在正确的地方使用正确的解决方案是最重要的事情, 最开始的技术选型直接决定项目的成败, 模块的划分能决定项目的开发速度, 架构的设计能决定项目的维护难度和增加需求时的痛苦程度. 对于多人项目来说, 主程让正确的人去做正确的事情也是无比的重要.
不同规模的任务主要的问题也体现在不同的方面:
什么决定了一个程序员解决问题的能力呢? 我认为有如下几个因素:
在同等水平的程序员之间, 一个懂C++, 一个人第一次使用C++, 做一个同样规模的C++项目, 效率差了不止一个数量级. 这就是我们通常所说的”经验”的作用, 这种经验可以看作是知识积累,
一个程序员的知识积累很大程度上决定了其解决问题的能力.
有意思的是, 因为经验这个事情不太好有准确的衡量标准, 我们为了简单, 常常就拿工作几年说事, 但是这种粗暴的标准有很大的问题, 工作年限同样长的人水平差异可以是巨大的.
按老话说, 用一年的经验工作二十年并不等同于二十年工作经验.
仅仅用代码层面的知识积累来衡量一个程序员的水平, 我觉得太欠妥了, 除非都是一个人的项目, 不然通常的项目开发还是个工程性的问题, 不是光有代码层面的能力就能解决的好的.
这是一个知识大爆炸, 知识刷新频率让人无法追赶的时代. 一方面, 面对一个稍有难度的任务, 难免会有超出自己现有的知识范围的时候, 此时自学能力决定了你能多快的完成此任务(或能否完成此任务). 另一方面, 你的自学能力决定了在平时的工作过程中, 你积累知识的多少.
自学能力强的人, 即使没有人指点也总能在项目的代码中学到东西. 而反过来, 学习意愿弱的人写的代码被别人重构后, 也不会想想, 这段代码是否改的更好了以及为什么. 同时, 一个自学能力强的人也更有希望主动的在业余去学习更多的知识, 而不是直到工作中碰到才去被动学习.
从较长的尺度上(比如一个人的工作生涯)来看, 一个程序员知识积累的多少只决定于其自学能力和他对编程本身的兴趣.
本来我是想把一个程序员的品味单独列出来的, 后来仔细想想, 一个程序员的品味其实不是一种天生的能力, 而是基于现有知识的积累, 形成的对事物的看法. 所以把品味放在自学能力下面的. 同样的, 其实通常说的正确的思维模式和方法, 其实也是来自于知识的积累. 这里我就根本不提这一条了.
品味往往用于形容一个人对时尚衣着, 食物等的看法, 其实对程序员来说, 品味也很重要.
不同的品味不仅决定了不同的语言设计者怎么设计编程语言, 也决定了一个程序员在做项目时会使用什么语言, 什么框架.
不同的品味决定了你会选择什么样的操作系统, 什么样的工具, 用什么样的代码规范.
不同的品味甚至还决定了你会选择什么样的职业发展方向, 什么样的平台, 开发什么东西.
对代码的品味决定了你看到一段不好的代码就能”闻到坏味道”, 对解决方案的品味决定了你在 开源/闭源, 激进/保守, 简单/功能强大但复杂 等解决方案之间的选择.
对于代码的品味, 我觉得没有什么比The Zen of Python更有意思的了。
作者:程序即人生