天天看点

程序员的思考 - 技能

当了十几年程序员了,是不是很失败。现在仍然在Coding。

没有所谓的“架构师”、“技术总监”、“系统分析员”头衔,是的,没有。我仍然陶醉在代码当中。姑且叫做兴趣吧,因为我的薪水不高,甚至可以说太低。但我仍然喜欢这个职业,不管外界的喧嚣、行业更迭等。说他大有前途如首富比尔·盖茨,说他苦命如屌丝程序员,我都一笑了之,不为所动。其实骨子里的原因是我的性格,善于和机器交流,不善与人交流;或者说与机器交流令我愉悦,与人交流令我不适。所以造就了我可能永远是一个码农的命。

当看着写出的代码流畅地在机器上运行并给出正确的结果时,我就忍不住内心激动,也许这就是传说中的“成就感”。

跑题了,言归正传,大致说一下程序员说需要的基本技能。这个纯粹是个人思想总结,仅供参考,切勿奉为圣经,如误人子弟,罪莫大焉。

1. 关于平台

这里所说的平台可以理解为操作系统吧。目前世界上主流的操作系统也就两大体系吧,Windows和Linux/Unix。我说的是主要是应用平台,嵌入式可能是特殊的一套体系,不做讨论。如果考虑如今炙手可热的移动开发,则要加上iOS、Android。其实iOS/Mac OS源头可追溯为FreeBSD,可划归Unix,Android源头可追溯为Linux。所以,仍然是两大体系。

当然,体系往下分很多版本,Windows有98/XP/2000/Vista/7/8等,Linux/Unix有Redhat、Ubuntu、AIX、HP-UX等。对程序员来讲,体系内的开发方式是类似的,而两大体系之间的开发差别则是巨大的。主要是底层所用到的API函数不同(对于C/C++语言的开发),另外,操作系统本身的运行机制是截然不同的,如内存、磁盘、进程的管理都不一样。所以,跨平台的开发是一个繁重的工作。当然,利用语言本身的一些特性可以做些规避,如C/C++开发尽量采用POSIX标准,JAVA语言本身带虚拟机,可规避大部分平台区别,另外一些脚本语言如Python/PHP/Perl由于自带解释器也可适用多平台。或者借助一些跨平台的库如QT等。但是,涉及到底层的一些东西是绕不开的,要彻底做到跨平台是不现实的。

所以,程序员应该具备多平台开发的能力。当然,这是能力的一种提升,并不是强制。因为既然存在多平台,那么项目中就有可能用到多平台,或者是不同的项目用不同的平台。如果接到需要不同平台的项目不至于慌神,不至于心里没底,同样也可以拿出设计方案,这样就显出你的能力了。目前比较流行的开发方式是,Windows做客户端,侧重表现,Linux/Unix做服务端,侧重业务逻辑。当然,服务端用Windows的也比较多。但客户端,或者说桌面,几乎被Windows垄断,Mac OS也只是一小部分而已。

另外一种趋势是,Web(浏览器)用来做表现,后台则是Web Server。这种趋势在HTML5兴起愈发表现得强烈。但Web App或是Native App究竟孰优孰劣,至今尚在争论而无定论。不管趋势怎么发展,我感觉两大体系将在长时间内共存,任何一方垄断都是不可能的。各有各的优势,各有各的劣势,以后的发展,最多此消彼长。任何一方消失都尚早。所以程序员掌握多平台的开发能力绝对是有很大益处的。

要怎么掌握呢? 一句老话:实践。掌握操作系统的运行机制,文件管理,进程管理等;掌握基本的底层API,基本的开发调试方式;尝试做一些小的项目等等。其实汇总为一句话,多折腾! 当然,这个折腾是褒义词。只有通过折腾,才能熟悉系统,才能解决实际的问题。用惯Windows的人初次尝试Linux/Unix会觉得难用得要死,什么都要用命令搞定,什么都要编译,Makefile简直是恶梦;而搞Linux开发的人会觉得Linux程序的开发简直比Windows简单太多了,它的底层体系因为一直多年来没有改变;而Windows一直在变-OLE-COM-AcitveX-.Net-Sliverlight-WPF-WinRT,微软的技术词汇层出不穷,每个新版操作系统都会带来新的技术名词,让开发人员应接不暇。

当然,最好有多平台的实际项目经验,这样是最能学到东西的。

2. 关于语言

当然,这里是指程序员用的开发语言。如今的编程语言已经非常丰富了,多到令人眼花缭乱的地步。可以按不同的划分方式来划分。按编译型和脚本型,前者有c/c++, java, fortran, pasical,后者有php,python, perl;按托管型和原生型,前者有java,c#, 后者有c/c++;按web型和app型,前者有php,ruby,javascript,后者有c/c++, python,objective-c;按函数型和非函数型,前者有erlang,后者有c/c++。

不同的语言擅长干的活是不一样的。c/c++着重底层开发或者注重性能的地方;PHP就是web的服务端语言;javascript是web的客户端语言;c#是专为Windows平台服务的;objective-c是专为Mac OS和iOS服务的。

程序员至少要熟悉一门语言,要能拿这门语言干活。当然这是最基本的,要不然就不叫程序员了。但一门语言,视野太窄,能干的事范围也窄,如果能多学一门语言,视野得到拓展,同时也能完成更多的事,何乐而不为呢。以前我只会c/c++,认为c/c++无所不能,胜任任何事。后来接触了PHP,Python等脚本语言才明白,c/c++是能干任何事,但有时可能代价太大,得不偿失。c/c++性能是好,但语言本身的库不丰富,内存管理风险也很高,干一个简单的任务,可能远不如脚本语言来得快速。

现在Web盛行,不掌握一点Web开发都不好意思跟别的程序员打招呼。于是,HTML/CSS/Javascript就免不了要学学了,这还只是前端,如果涉及后端(话说现在几乎没有静态网页了),又得学习PHP/ASP/JSP等等。

谁都想只想掌握一门语言,熟悉一个平台,就走遍天下。可惜这太理想,根本做不到。没有最好的语言,只有最适合的语言。有时,并不是自己想掌握多门语言,而是项目给逼出来的。项目都是强调多快好省的,什么最快,什么实现最简单就采用什么。掌握多门语言,就可以想到或找到项目最适合的开发方式。

掌握一门语言并不容易,如果仅仅懂得语法,则只是皮毛,远远不够。还需要熟悉使用这门语言的库,完成某件事情采用的基本方式,不同平台下的表现形式,还是老话,多实践吧,必须自己亲自去敲代码用程序完成某件事情,你才能算刚刚入门。

总结一句话吧,程序员应该精通一到两门开发语言,熟悉多种语言,了解不同语言所各自擅长的领域。 

3. 关于数据库

做软件应用系统的话,极少能避开数据库的。其实这里的数据库,可以理解广义一点,不是特指某一种数据库管理系统,如Oracle,SQL Server, MySql等,而是指将数据持久化的一种方式,更简单地说,是将历史数据存储在硬盘(或其它存储介质)上的方式。这种方式直接影响了软件对数据读取和写入的规划。

最简单的数据库即平面文件。以操作系统的文件访问方式来实现数据的读写,这可以应对简单逻辑的单机应用。这种文件可以有标准格式的,如ini文件,json文件,也可以完全自定义,读写完全采取自己的方式。其次就是现今主流方式,结构化数据库方式,支持标准的SQL查询语言访问方式,支持实务,这是商用主流数据库管理系统提供的方案,如Oracle, SQL Server, Sybase, DB2。开源的还有SQLite,MySql, Firebird等等。它们共同的特征是支持SQL查询语言,尽管支持程度不一样。

另外一种数据库-NoSQL,是近期兴起的数据管理解决方案,这是应对Web中产生的海量数据产生的,或者说是应对无穷变化产生的。因为在Web时代,讲究快速应对需求变化,讲究快速迭代开发,所以NoSQL类数据库几乎无需Schema设计,强调充分利用内存,一般采用特有的API访问数据。它们用来应对多变的数据管理,但一致性不如传统的SQL数据库。所以NoSQL一般是互联网公司采用较多,而传统的银行、电信等行业依然以SQL数据库为主流。

项目上采取哪种数据库,是要按项目本身的需求来决定的。有可能还用到不止一种数据库。数据的规模及程序对数据的访问方式(业务模型)决定了采用什么样的数据库设计方式。另外还要考虑硬件及人力成本。大型的数据库管理系统常常需要雇用专职的数据库管理员,如Oracle或DB2。

另外,还有一些专业的数据库,如列储存的,空间数据库、图数据库等,都有专门的适合场景,不再一一讨论。程序员应该多了解各种数据库的特性,以便为项目对数据库的选择及设计打下良好基础。

4. 关于库和框架

再回到代码上吧。现在程序员写代码,一般是要用到成型的库的。所谓的库,就是封装好的,具备某些特定功能的函数或类库。外界使用它的时候,不用管它的实现,只管引入并调用它即可。库是很有用的东西,当开发语言中成型的库比较多的话,是可以大大节省开发时间的,因为很可能你需要的功能有的库已经帮你实现了。java,python等语言拥有非常多的库,所以它们做起东西来是比较快的,好多通用的功能帮你实现好了。c/c++的库就比较可怜,标准库包含的东西太少,做起东西来就慢。近年随着stl, boost库的完善,c++11标准的发布,稍微好了一些,但仍然和别的语言差距很大。精通一门语言的人,必然精通它可能涉及的常用的库,因为你开发项目时不得不用,不熟悉是不可能的。不使用现成的库,什么都自己去实现,不太可能,也浪费大量时间,重复发明轮子是不可取的。

框架,是比库高一个层次的东西,或者说,它还不仅仅是库,还融入了思想,它约定了一种开发规则,让你在它的规则下去实现你的应用。而这种规则的好坏,即体现了该框架的思想高度和优劣程度。举例来说,Windows中开发工具VC++中用于封装API的类库MFC就是一个框架,它不仅提供丰富的功能,如字符串处理、容器、控件等,也提供了设计思想,如MVC,有专门的视图和文档类,还封装了消息传递机制等等。类似的类库还有以前Borland公司开发的Delphi中的VCL,也是十分出色的框架,是快速开发Windows应用的利器,相信使用过的人深有体会。Web服务端语言PHP也有很多框架,优秀的有YII、CodeIgnitor、Zend等,用了某种框架,就得遵循它所约定的开发方式。

框架带来的好处是节省你的开发时间,对你应用的健壮性有一定保证,对程序的架构设计及以后的维护都会有效率上的提升。设计和实现一个优秀的框架绝对不是一件容易的事情。因此优秀的框架是值得我们去使用和学习的。

5. 关于架构

选定平台了,熟悉一种语言了,知道采用什么数据库了,那么可以进行项目开发了吧。如果是个人练练手的项目或是临时性的小项目(仅供几个人在短时间使用),那么是够了,这时候只是要求快,或者为熟悉和验证某个技术,不需要考虑太多。但如果是商业项目开发,只考虑上述方面是远远不够的。

对项目的全景规划我们称之为架构。现在软件行业有一种流行的职位叫”架构师“,就是干这个的-对项目的全局设计。对软件项目的架构设计至关重要,因为它决定了项目采用的软硬件环境、采用的开发语言和数据库、部署方式等等。比喻来说,架构即为骨骼,语言、数据库等为肉。架构决定了软件的初步轮廓,即高还是矮,胖还是瘦。但长得漂不漂亮决定不了;也决定了是否健壮,是否情绪稳定,但决定不了喜怒哀乐。

架构设计要对客户需求进行仔细而全面的分析,要考虑软件最终的运行环境,要考虑应对将来可能的需求变化,要考虑开发方式以及交付后的维护成本。总之,架构是对软件项目的一个总体设计,它基本上决定了项目的走向,对项目的成败(指技术上的,非市场上的)起着至关重要的作用。

做一个合格的架构师相当不容易。首先,你得熟悉相当多的软件技术方面的知识,操作系统、数据库、中间件、开发语言、技术框架等等,如果你不熟悉,怎么来做架构设计,怎么知道哪种选型是合适的?其次,架构师必然是从开发岗位一步一步走上来的,这样才有实际的项目经验,才会对软件开发的各个方面有细致的认识,才能做好架构设计。纸上谈兵的架构师是相当危险的。

所以对于程序员迈向架构师之路,没有捷径,勤奋的学习+多年的项目经验+多思考总结。

继续阅读