程序员的前路

回忆往事,很多习惯源于第一家公司时候经历的一切。有时候我会想,一个程序员的第一份工作,很可能影响了他未来的道路。

通常,软件技术人员的职业发展有几个选择:专注于技术,成为技术专家;转型到技术型销售、技术支持等;随着技术成长,从技术性管理到高级管理。前提是你一定要了解自己的特点和优势,就好比黄瓜种子是不可能培育成西瓜一样。在扎实的技术基础上(高级软件工程师),如果有着比较强的抽象设计能力,又打算专注于技术开发,架构师是个好的选择;如果 性格更适合做管理,情商能力突出,技术型管理应该是下一步的方向。决胜点在于长期的点滴积累,无论程序员个体之间差异有多大,程序员上升空间在于技术上的反思和提高。

程序员在编程序的时候,一方面会实现设计的功能,另一方面 也在对设计有一个理解、认识、熟知的过程。进而慢慢地从学习别人设计,转向到自己参与或独立设计。如果这个程序员真的非常非常喜欢程序员这个职业,则可以转向软件设计师。这个转变很大程度是程序员意识的转变,就是说要把编程的时间,逐步分摊到软件设计上,要把重点从编程实现转变到项目的功能设计上。这里强调的是“逐步”的一个过程,程序员要逐步减少编程的时间,增加设计的时间,要克服编程的强大吸引力,要主动地攀上设计这个台阶。很难有一个设计师是完全不编程的,而且我认为,会编程的设计师才是真正的设计师。一般这种转变需要花上一到两年时间。

软件设计中最重要的基本原则,其实也不仅仅是软件设计,很多地方也都是适用的:第一:坚决避免重复;第二:高内聚低耦合的设计;俗话说得好——唯一不变的就是变化本身!如何选择适当的粒度,如何进行适当的模块划分,从而把变化能够封装在一个尽可能窄的范围内,以便某个变化只会造成局部的影响,而整个软件框架能够尽可能的保持稳定不变,不会牵一发而动全身,这才是软件设计最精彩的地方,也是软件设计能从工程问题变为艺术问题的机会。

那么问题来了,具体如何做才能得出尽可能好的软件设计呢?除非你在开始一个项目前有过类似项目的经验,否则,你只能够在开发过程中不停的进行调整,也就是说,你需要不停的通过不断迭代的软件版本与用户进行交流沟通,挖掘出用户真正的需求并及时进行修正,必要时还需要对整个软件进行重构,这样经过几次迭代后,才有希望得到一个满足用户需求的接近完美设计。最后一点——你需要具有在代码中签名的勇气,这个签名就像是一个品牌标识,是代码质量的保证,表明这段代码是你引以为傲的作品。

也有一些程序员工作机遇比较好,不但负责了项目的设计工作,而且负责了项目管理工作。对项目经理这个工作有了一定的尝试。因此,这类程序员可以审视一下自 己,是否合适这项工作。如果自己对这种工作比较满意,而且具备项目经理的要求,则可以向项目经理这个方向发展。项目经理承担着项目管理的职责,对项目负主 要责任。它和程序员的作用也不相同,项目经理的重点已经从编程转移到对人、对技术、对进度、对项目的管理。由于软件的项目经理与软件项目的相关性太大,因 此,他必须要了解软件开发的各个环节、了解开发的各种技术和运用、了解开发队伍人员的水平和特点。所以他依旧和程序员脱不了干系。从程序员到项目经理可以 使得项目经理更好地理解程序员在项目中的地位和作用,了解软件开发的各种规律性的东西。从而保证项目的正常完成。而且,项目经理的收入在公司中的地位也是 比较高的。程序员在担任项目经理之前最好要把软件设计工作做好,这样在做项目经理的时 候,就会有很好的基础。

最基础的道理都是相通的,做人是一样,写程序也是一样。在你成为一名优秀的程序员之前,首先需要的不是各种神技,而是一颗责无旁贷的责任心:一旦接受了某项任务,就应该为之负起全部的责任,想方设法也要尽自己最大的努力去完成它,凭一己之力也好,寻求他人帮助也罢,这都可以,但须始终牢记:最终承担责任并推动任务前进的,绝对只能是你自己;其次,你应该要明白,千里之堤毁于蚁穴。对软件中存在的“破窗户”始终要坚持零容忍,因为一旦有“破窗户”出现,那么软件项目的失控速度绝对远远超出你的预期,等你缓过神来,一切已为时已晚,弥补代价甚至超过整个推倒重来的代价;最后一点,你需要是一个完美主义者,始终处于追求完美的途中,但同时你要深深的明白,你永远也无法到达完美的彼岸,因为这个世界上不存在完美的软件,现在没有,你也不大可能会创造出第一个,所以需要你在适当的时候为你的软件画上休止符。

成功与失败的区别在于,成功者选择了正确而失败者选择了错误。因此,我们常常能够看到一些天赋相差无几的人,由于选择了不同的方向,人生却迥然相异。选择正确的方向尤为重要。软件开发也是有层次区别的,比如,按层次从高到低通常可分为:系统开发:如操作系统、数据库系统、服务器系统开发;专业开发:如网络安全、游戏、人工智能开发;应用开发:如MIS、BI、ERP等系统开发;普通开发:如网站、简单应用系统开发。不同的层次,难度系数不一样,对技术要求、个人素质要求也不一样。要成为系统开发者、专 业开发者、高级应用开发者,需要有很高的专业知识和很强的逻辑、抽象、空间思维能力,这就要求具有很好的基础,同时具有较大的提升潜力。而要成为简单开发 者和初级应用开发者则相对容易些,正是这样,才使很多人走上了软件开发的道路。

程序